blad w geninitrd
Tomasz Woźniak
ctr w post.pl
Wto, 19 Lip 2005, 16:02:29 CEST
Witam.
Chodzi o soft raida. Poprawilem funkcje find_modules_softraid dodajac
komende do wyszukiwania sprzetu dla macierzy raid:
eval `/sbin/mdadm -D $1 | sed -ne '/[[:space:]]\/dev\//p' | awk
'/\/dev\// { dev_list= dev_list $7 " "; }
END { print "dev_list=\"" dev_list "\""; }
'`
zakomentowalem jednoczesnie poprzednia metode wysszukiwania sprzetu (u
mnie mdadm --examine --scan nigdy nie zwracal wpisu o nazwie 'devices='
jaki stary skrypt wymagal)
Dodalem jeszcze warunek w find_modules_scsi()
if [ scsimodules ne "/bin/true" ] ; then
findmodule "$n"
fi
poprzednio bylo samo findmodule i chcial mi szukac czegos takiego jak
/bin/true- a takie cuda mam w modprobe.conf po wygenerowaniu.
Pytanie co zrobic z tym skrypcikiem (moj jest w zalaczniku). Nie chce
sie zapisywac na devel-list tylko datego ze udalo mi sie poprawic
calkiem przyjeny skrypciol.
Milo by bylo jakbym uslyszal czy ktos to olal/uznal/poprawil na ladniejszy
--
Pozdrawiam.
================
Cybertronica
Tomasz Woźniak
================
tel: 502 744 141
tel/fax: (91) 81 22 747
GG: 1539526
tlen: tomaslee w tlen.pl
Podstawowa Prawda Informatyki: Jeżeli opanowałeś już wszystkie możliwe
wyjątki, to zapomnisz do jakich reguł się one odnoszą.
-------------- następna część ---------
#!/bin/sh
# geninitrd
#
# by Jacek Konieczny <jajcus w pld-linux.org>
#
# based on mkinitrd from RedHat
RCSID='$Id: geninitrd 4605 2004-09-17 21:24:18Z arekm $'
PATH=/sbin:$PATH
export PATH
VERSION="`echo "$RCSID"|awk '{print $3}'`"
. /etc/rc.d/init.d/functions
COMPRESS="yes"
# INITRDFS is set later (catch obsoleted FS option)
#INITRDFS="rom"
USERAIDSTART="yes"
USEMDADMSTATIC="no"
USEINSMODSTATIC="no"
USESUSPEND="yes"
uselvm="no"
usenfs="no"
# it should be safe to remove scsi_mod from here, but I'm not sure...
PRESCSIMODS="-scsi_mod unknown -sd_mod"
PREIDEMODS="-ide-core unknown -ide-detect -ide-disk"
PREIDEMODSOLD="-ide-probe -ide-probe-mod -ide-disk"
SUSPENDMODS="-suspend2_core -suspend2_lzf -suspend2_block_io -suspend2_swap -suspend_core -suspend_text -suspend_lzf -suspend_block_io -suspend_swap"
target=""
kernel=""
force=""
verbose=""
MODULES=""
img_vers=""
modulefile=""
raidtab="/etc/raidtab"
fstab="/etc/fstab"
insmod="insmod"
modext=".o"
rootdev_nr=0
# default bootsplash is off, if it have to be on, install bootsplash package
BOOT_SPLASH=no
usage () {
echo "usage: `basename $0` [--version] [-v] [-f] [--ifneeded] [--preload <module>]"
echo " [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]"
echo " [--initrdfs=rom|ext2|cram] [--modules-conf=<modules.conf>]"
echo " [--with-raidstart] [--without-raidstart] [--with-insmod-static]"
echo " [--without-bootsplash] [--lvmtoolsversion=1|2]"
echo " <initrd-image> <kernel-version>"
echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)"
exit 1
}
my_dirname() {
echo $1|awk -F/ '{print substr($0, 0, length($0) - length($NF));}'
}
find_depmod () {
typeset mods module f level depfile first
depfile=/lib/modules/$kernel/modules.dep
if [ -f $depfile ] ; then
: ok
else
echo "Error: no $depfile ! Run depmod and rerun geninitrd." 1>&2
exit 1
fi
# prepend / if no path given, append $modext.gz if not given,
# quote /
origmodule="$2"
module=$(echo "$2" | \
awk '/\// {print;next} {print "/" $0}' | \
awk '/\./ {print;next} {print $0 "'$modext'.gz"}' |
awk '{gsub("/","\\/");print}')
mods=$(awk '
BEGIN { here = 0 }
/'"$module"':(.*)/ { gsub(/:/," "); gsub(/\\/," "); print; here = 1; next }
/:/ { here = 0 }
/(.*)/ { gsub(/\\/," "); if (here) print }
' $depfile | xargs)
# fallback to $modext
if [ "$mods" = "" ] ; then
module=$(echo "$module" | \
awk '{gsub("\'$modext'\.gz$","\'$modext'",$0);print}')
fi
mods=$(awk '
BEGIN { here = 0 }
/'"$module"':(.*)/ { gsub(/:/," "); gsub(/\\/," "); print; here = 1; next }
/:/ { here = 0 }
/(.*)/ { gsub(/\\/," "); if (here) print }
' $depfile | xargs)
if [ "$mods" = "" ] ; then
if [ "$1" != silent ] ; then
echo "$origmodule: module not found in $depfile" 1>&2
fi
if ! is_no "$EXIT_IF_MISSING" ; then
exit 1
else
echo "If $origmodule isn't compiled in kernel then this initrd may not start your system". 1>&2
fi
fi
level=$3
if [ "$level" = "" ] ; then
level=0
fi
level=$(awk "BEGIN{print $level + 1}")
if [ $level -gt 20 ] ; then
echo "$origmodule: cycle in $depfile" 1>&2
exit 1
fi
first=
for f in $mods ; do
if [ "$first" = "" ] ; then
first=$f
else
find_depmod $1 $f $level
fi
done
echo $first
}
addmodule() {
fmPath=$1
skiperrors=$2
if [ ! -f "/lib/modules/$kernel/$fmPath" ]; then
if [ -n "$skiperrors" ]; then
return
fi
echo "module $fmPath present in modules.dep, but not in filesystem (kernel = $kernel)" 1>&2
exit 1
fi
# only need to add each module once
# quote /
tmpFmPath=$(echo $fmPath | awk '{gsub(/\//,"\\/");print}')
if echo "$MODULES" | awk '/'"$tmpFmPath"'/ {exit 1}' ; then
MODULES="$MODULES $fmPath"
fi
}
findmodule() {
skiperrors=""
modName=$1
if [ "$(echo $modName | awk '{print(substr($0,1,1));}')" = "-" ]; then
skiperrors=1
modName="$(echo $modName | awk '{print(substr($0,2));}')"
fi
# what's that?
if [ "$modName" = "pluto" ]; then
findmodule fc4
findmodule soc
fi
if [ "$modName" = "fcal" ]; then
findmodule fc4
findmodule socal
fi
if [ -n "$skiperrors" ]; then
allModulesToFind=`find_depmod silent $modName`
else
allModulesToFind=`find_depmod normal $modName`
if [ $? != 0 ] ; then
exit 1
fi
fi
echo $modName
for mod in $allModulesToFind ; do
mod=$(echo $mod | \
awk '{sub(/^\/lib\/modules\/[^\/]*\//,"");print}')
addmodule $mod "$skiperrors"
done
}
inst() {
if [ "$#" != "2" ];then
echo "usage: inst <file> <destination>"
return
fi
[ -n "$verbose" ] && echo "$1 -> $2"
cp "$1" "$2"
}
get_label_ext2 () {
/sbin/e2label $1 2> /dev/null
}
get_uuid_ext2 () {
/sbin/tune2fs -l $1 2> /dev/null | awk -F: '/UUID:/ {gsub(" ",""); print $2}'
}
get_label_xfs () {
/usr/sbin/xfs_db -x -p xfs_admin -c label -r "$1"|awk -F= '{sub("^\"","", $2); sub("\"$", "", $2); print $2}'
}
get_uuid_xfs () {
/usr/sbin/xfs_db -x -p xfs_admin -c uuid -r "$1"|awk -F= '{print $2}'
}
find_root() {
eval `awk '/^[\t ]*#/ {next} {if ( $2 == "/" ) {print "rootdev=\"" $1 "\"\nrootFs=\"" $3 "\""}}' $fstab`
case $rootdev in
LABEL=*)
if [ -x /sbin/findfs -a \( "$rootFs." = "ext2." -o "$rootFs." = "ext3." \) ] ; then
rootdev2="`/sbin/findfs $rootdev 2>/dev/null`"
if [ -n "$rootdev2" ] ; then
rootdev=$rootdev2
rootdev_found=1
fi
fi
if [ "$rootdev_found." != "1." ] ; then
case $rootFs in
ext2|ext3)
if [ ! -x /sbin/e2label ] ; then
echo "/sbin/e2label is missing" 1>&2
exit 1
fi
get_label="get_label_ext2"
;;
xfs)
if [ ! -x /usr/sbin/xfs_db ] ; then
echo "/usr/sbin/xfs_db is missing" 1>&2
exit 1
fi
get_label="get_label_xfs"
;;
*)
echo "LABEL on $rootFs in not supported by geninitrd" 1>&2
exit 1
;;
esac
if [ ! -r /proc/partitions ] ; then
echo '/proc/partitions is not readable'; 1>&2
exit 1
fi
label=${rootdev#"LABEL="}
for dev in `awk 'BEGIN {getline;getline} {print "/dev/" $4}' /proc/partitions` ; do
if [ -r $dev ] && [ "$label" = "`$get_label $dev`" ] ; then
if [ -n "$verbose" ] ; then
echo "Using $dev as device for rootfs"
fi
rootdev=$dev
rootdev_found=1
break
fi
done
if [ "$rootdev_found." != "1." ] ; then
echo "geninitrd can't find real device for LABEL=$label" 1>&2
exit 1
fi
fi
;;
UUID=*)
if [ -x /sbin/findfs -a \( "$rootFs." = "ext2." -o "$rootFs." = "ext3." \) ] ; then
rootdev2="`/sbin/findfs $rootdev 2>/dev/null`"
if [ -n "$rootdev2" ] ; then
rootdev=$rootdev2
rootdev_found=1
fi
fi
if [ "$rootdev_found." != "1." ] ; then
case $rootFs in
ext2|ext3)
if [ ! -x /sbin/tune2fs ] ; then
echo "/sbin/tune2fs is missing" 1>&2
exit 1
fi
get_uuid="get_uuid_ext2"
;;
xfs)
if [ ! -x /usr/sbin/xfs_db ] ; then
echo "/usr/sbin/xfs_db is missing" 1>&2
exit 1
fi
get_label="get_uuid_xfs"
;;
*)
echo "UUID on $rootFs in not supported by geninitrd" 1>&2
exit 1
;;
esac
if [ ! -r /proc/partitions ] ; then
echo '/proc/partitions is not readable'; 1>&2
exit 1
fi
uuid=${rootdev#"UUID="}
for dev in `awk 'BEGIN {getline;getline} {print "/dev/" $4}' /proc/partitions` ; do
if [ -r $dev ] && [ "$uuid" = "`$get_uuid $dev`" ] ; then
if [ -n "$verbose" ] ; then
echo "Using $dev as device for rootfs"
fi
rootdev=$dev
rootdev_found=1
break
fi
done
if [ "$rootdev_found" != 1 ] ; then
echo "geninitrd can't find real device for UUID=$uuid" 1>&2
exit 1
fi
fi
;;
esac
rootdev1=${rootdev}
}
find_modules_softraid() {
if [ -f /etc/mdadm.conf ] ; then
[ -n "$verbose" ] && echo "Finding RAID details using mdadm for rootdev=$1"
eval `/sbin/mdadm --examine --scan --config=/etc/mdadm.conf | \
awk -v rootdev="$1" '
BEGIN {
found = "no";
dev_list = "";
raidlevel = ""
rootdev_devfs = rootdev;
if (rootdev ~ /\/dev\/md\/[0-9]/) {
gsub(/\/dev\/md\//,"/dev/md",rootdev_devfs);
}
}
/^ARRAY/ {
if (($2 == rootdev) || ($2 == rootdev_devfs)) {
raidlevel=$3;
gsub(/level=/,NUL,raidlevel);
if (raidlevel ~ /^raid[0-5]/) {
gsub(/raid/,NUL,raidlevel);
};
found="yes";
#getline x;
#if (x ~ /devices=/) {
# dev_list = x;
# gsub("devices=", NUL, dev_list);
# gsub(",", " ", dev_list);
#}
}
}
END {
print "raidfound=\"" found "\"";
print "raidlevel=\"" raidlevel"\"";
#print "dev_list=\"" dev_list "\"";
}'`
eval `/sbin/mdadm -D $1 | sed -ne '/[[:space:]]\/dev\//p' | awk
'/\/dev\// { dev_list= dev_list $7 " "; }
END { print "dev_list=\"" dev_list "\""; }
'`
fi
if [ "$raidfound" != "yes" ]; then
[ -n "$verbose" ] && echo "Finding RAID details using raidtab for rootdev=$1"
eval `awk -v rootdev="$1" 'BEGIN {
found="no";
dev_list="";
rootdev_devfs = rootdev;
if (rootdev ~ /\/dev\/md\/[0-9]/) {
gsub(/\/dev\/md\//,"/dev/md",rootdev_devfs);
}
}
{
gsub("\t"," ");
gsub(" +", " ");
gsub("^ ","");
if (/^[\t ]*#/)
next;
if (/^raiddev/) {
if (($2 == rootdev) || ($2 == rootdev_devfs)) {
found="yes";
} else {
if (found == "yes") {
exit 0;
};
};
};
if (found == "yes") {
if ($1 == "device") {
dev_list = dev_list " " $2;
};
if ($1 == "raid-level") {
raidlevel=$2;
}
};
}
END {
print "raidfound=" found "\nraidlevel=" raidlevel "\ndev_list=\"" dev_list "\"\n";
}' $raidtab `
fi
if is_yes "$raidfound" ; then
case "$raidlevel" in
[0145])
findmodule "raid$raidlevel"
;;
linear)
findmodule "linear"
;;
*)
echo "raid level $number (in $raidtab) not recognized" 1>&2
;;
esac
else
echo "ERROR: RAID devices not found for \"$1\", check your configuration!" 1>&2
exit 1
fi
rootdev_nr=$(( $rootdev_nr + 1 ))
eval "rootdev${rootdev_nr}=\"$1\""
eval "dev_list${rootdev_nr}=\"${dev_list}\""
for device in $dev_list; do
find_modules_for $device
done
echo "done"
}
find_modules_scsi() {
for n in $PRESCSIMODS; do
if [ "X$n" = "Xunknown" ] ; then
if [ -f "$modulefile" ]; then
scsimodules="`awk '/scsi_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile`"
for n in $scsimodules; do
# for now allow scsi modules to come from anywhere. There are some
# RAID controllers with drivers in block
if [ scsimodules ne "/bin/true" ] ; then
findmodule "$n"
fi
done
fi
else
findmodule "$n"
fi
done
}
find_modules_ide() {
typeset rootdev
rootdev="$(echo "$1" | awk ' { gsub(/\/dev\//,NUL); gsub(/[0-9].*/, NUL); print $0 } ')"
if [ "$pack_version_long" -lt "002004021" ]; then
[ -n "$verbose" ] && echo "Finding IDE modules for kernels <= 2.4.20"
for n in $PREIDEMODSOLD; do
findmodule "$n"
done
else
tryauto=1
for n in $PREIDEMODS; do
if [ "X$n" = "Xunknown" ] ; then
if [ -f "$modulefile" ]; then
[ -n "$verbose" ] && echo "Finding IDE modules using ide_hostadapter"
idemodules="`awk '/ide_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile`"
for na in $idemodules; do
tryauto=0;
findmodule "$na"
done
fi
if [ "$tryauto" -eq 1 ]; then
if [ -r /usr/share/pci-database/ide.pci -a -r /proc/bus/pci/devices ]; then
[ -n "$verbose" ] && echo "Finding IDE modules using PCI ID database"
if is_yes "${ide_only_root}"; then
if [ -f /sys/block/${rootdev}/device/../../vendor -a -f /sys/block/${rootdev}/device/../../device ] ; then
vendorid="$(awk ' { gsub(/0x/,NUL); print $0 } ' /sys/block/${rootdev}/device/../../vendor)"
deviceid="$(awk ' { gsub(/0x/,NUL); print $0 } ' /sys/block/${rootdev}/device/../../device)"
searchpciid="${vendorid}${deviceid}"
elif [ -f /proc/ide/${rootdev}/../config ]; then
searchpciid="$(awk ' /pci bus/ { print $7$9 } ' /proc/ide/${rootdev}/../config)"
fi
fi
if [ -z "${searchpciid}" ]; then
searchpciid="$(awk ' { print $2 } ' /proc/bus/pci/devices)"
fi
idemodules=""
for nb in $searchpciid; do
eval `awk -v pciid="$nb" 'BEGIN {
}
{
gsub("\t"," ");
gsub(" +", " ");
gsub("^ ","");
if (/^[\t ]*#/)
next;
compmod = $1 ""; # make sure comparison type will be string
# cause pci IDs are hexadecimal numeric
if (compmod == pciid) {
module=$2;
# min_kernel=$3; # now in ide.pci $3,$4 = vendor and device name
# max_kernel=$4; #
exit 0;
}
}
END {
print "module=" module "\nmin_kernel=" min_kernel "\nmax_kernel=\"" max_kernel "\"\n";
}' /usr/share/pci-database/ide.pci`
[ -n "$module" ] && idemodules="$idemodules $module"
done
if is_yes "$(awk ' /ide=reverse/ { print "yes" } ' /proc/cmdline)"; then
new_idemodules=""
for nc in idemodules; do
new_idemodules="$nc $new_idemodules"
done
idemodules="${new_idemodules}"
fi
if [ -z "$idemodules" ]; then
echo "WARNING: rootfs on IDE device but no related modules found, loading ide-generic."
idemodules="ide-generic"
fi
for nd in $idemodules; do
findmodule "-$nd"
done
else
echo -n "WARNING: "
[ -r /usr/share/pci-database/ide.pci ] || echo -n "/usr/share/pci-database/ide.pci missing."
[ -r /proc/bus/pci/devices ] || echo -n "/proc/bus/pci/devices missing."
echo "Automatic IDE modules finding not available."
fi
fi
else
findmodule "$n"
fi
done
fi
}
find_modules_for() {
if [ -z "$1" ]; then
echo "ERROR: no argument passed to find_modules_for() - is your /etc/fstab correct?" >&2
exit
elif is_yes "`echo "$1" | awk '/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:|\/dev\/nfs)/ { print "yes"; }'`"; then
if [ ! -x /usr/bin/pcidev -a -z "$NFS_ETH_MODULES" ] ; then
echo "ERROR: root on NFS but /usr/bin/pcidev not found." >&2
echo "Please install correct pci-database package and rerun $0." >&2
exit 1
fi
[ -z "$NFS_ETH_MODULES" ] && NFS_ETH_MODULES=$(/usr/bin/pcidev /m net | xargs)
for m in $NFS_ETH_MODULES; do
findmodule "$m"
done
findmodule "-ipv4"
findmodule "nfs"
usenfs="yes"
echo "Remember to use \`root=/dev/ram0 init=/linuxrc' when starting kernel" >&2
echo "or you will have problems like init(xx) being child process of swapper(1)." >&2
elif is_yes "`echo "$1" | awk '/^\/dev\/md/ { print "yes"; }'`"; then
find_modules_softraid "$1"
elif is_yes "$(echo "$1" | awk '/^\/dev\/(sd|scsi)/ { print "yes"; }')" ; then
find_modules_scsi
elif is_yes "`echo "$1" | awk '/^\/dev\/(hd|ide)/ { print "yes"; }'`" ; then
find_modules_ide "$1"
elif is_yes "`echo "$1" | awk '/\/dev\/rd\// { print "yes"; }'`" ; then
findmodule "DAC960"
elif is_yes "`echo "$1" | awk '/\/dev\/ida\// { print "yes"; }'`" ; then
findmodule "cpqarray"
elif is_yes "`echo "$1" | awk '/\/dev\/cciss\// { print "yes"; }'`" ; then
findmodule "cciss"
elif is_yes "`echo "$1" | awk '/\/dev\/ataraid\// { print "yes"; }'`"; then
find_modules_ide
findmodule "ataraid"
ataraidmodules="`awk '/ataraid_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile`"
if -n "$ataraidmodules" ; then
# FIXME: think about modules compiled in kernel
echo "ERROR: ataraid_hostadapter alias not defined in $modulefile !"
echo "Please set it and run $0 again."
exit 1
fi
for n in $ataraidmodules; do
findmodule "$n"
done
# check to see if we need to set up a loopback filesystem
elif is_yes "`echo "$1" | awk -F/ '{print($3);}' | awk '/loop/ { print "yes"; }'`" ; then
echo "Sorry, root on loop device isn't supported." 1>&2
exit 1
# TODO: rewrite for bsp and make nfs ready
if [ ! -x /sbin/losetup ]; then
echo "losetup is missing"
exit 1
fi
key="^# $(echo $1 | awk -F/ '{print($3);}' | tr '[a-z]' '[A-Z]'):"
if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`" ; then
echo "The root filesystem is on a $1, but there is no magic entry in $fstab" 1>&2
echo "for this device. Consult the geninitrd man page for more information" 1>&2
exit 1
fi
line="`awk '/'$key'/ { print $0; }' $fstab`"
loopDev="$(echo $line | awk '{print $3}')"
loopFs="$(echo $line | awk '{print $4}')"
loopFile="$(echo $line | awk '{print $5}')"
BASICMODULES="$BASICMODULES -loop"
findmodule "-$loopFs"
BASICMODULES="$BASICMODULES -${loopFs}"
# don't have any clue, how is this supposed to work
elif [ -e "$1" ] && ls -l "$1" 2> /dev/null | awk '{if (/^b/) { if ($5 == "58,") { exit 0; } else { exit 1; } } else { exit 1; }}' || /sbin/lvm lvdisplay "$1" > /dev/null 2>&1 ; then
if [ ! -f /sbin/initrd-lvm -o ! -x /sbin/lvdisplay -o ! -x /sbin/pvdisplay ] ; then
echo "ERROR: root on LVM but /sbin/initrd-lvm, /sbin/lvdisplay and /sbin/pvdisplay not found." >&2
echo "Please install lvm(2) and lvm(2)-initrd package and rerun $0." >&2
exit 1
fi
if [ -z "$LVMTOOLSVERSION" ] ; then
LVMTOOLSVERSION=$(/sbin/initrd-lvm vgchange --version 2>/dev/null|head -n 1|awk '{gsub("vgchange: Logical Volume Manager ",NIL); gsub("LVM version: ",NIL); gsub(/\..*/,NIL); print $1}')
if [ -z "$LVMTOOLSVERSION" ] ; then
echo "ERROR: Can't determine LVM tools version. Please set LVMTOOLSVERSION" >&2
echo "and rerun $0." >&2
exit 1
fi
fi
if [ -z "$PVDEVICES" ] ; then
VGVOLUME=$(/sbin/lvdisplay -c "$1" 2> /dev/null | awk -F":" ' { print $2 } ')
PVDEVICES=$(/sbin/pvdisplay -c | awk -F":" -v vg="$VGVOLUME" ' BEGIN { devices="" } { if ($2 == vg) { devices = devices " " $1 } } END { print devices } ')
fi
if [ -n "$PVDEVICES" ] ; then
for device in $PVDEVICES; do
find_modules_for $device
done
else
echo "ERROR: I wasn't able to find PV (via lvdisplay and pvdisplay)." >&2
echo "You can try to set PVDEVICES in /etc/sysconfig/geninitrd." >&2
exit 1
fi
if [ "$LVMTOOLSVERSION" = "2" ]; then
findmodule "-dm-mod"
elif [ "$LVMTOOLSVERSION" = "1" ]; then
findmodule "-lvm"
findmodule "-lvm-mod"
else
echo "ERROR: LVM version $LVMTOOLSVERSION is not supported yet." >&2
exit 1
fi
uselvm="yes"
fi
}
modules_install() {
modules="$1"
for mod in $modules; do
MODULEDIR="`my_dirname "$mod"`"
mkdir -p "$MNTIMAGE/lib/modules/$kernel/$MODULEDIR"
cp $verbose -a "/lib/modules/$kernel/$mod" "$MNTIMAGE/lib/modules/$kernel/$mod"
gunzip "$MNTIMAGE/lib/modules/$kernel/$mod" 2> /dev/null
done
}
modules_add_linuxrc() {
modules="$1"
linuxrc="$2"
for mod in $modules; do
MODULE2="`my_dirname "$mod"`"
NAME2=`basename "$mod" .gz`
MODULE2=$MODULE2/$NAME2
module="`echo $mod | awk -F/ '{ $0=$NF } /'$modext'.*$/ { gsub(/'$modext'.*/, NIL, $0); } { print $0; }'`"
options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`"
if [ -n "$verbose" ]; then
/bin/echo -n "Loading module [$module] "
if [ -n "$options" ] ; then
echo "with options [$options]."
else
echo "without options."
fi
fi
echo "$insmod /lib/modules/$kernel/$MODULE2 $options" >> "$linuxrc"
done
}
if [ -r /etc/sysconfig/geninitrd ] ; then
. /etc/sysconfig/geninitrd
fi
if [ -r /etc/sysconfig/bootsplash ] ; then
. /etc/sysconfig/bootsplash
fi
if [ ! -x /bin/initrd-busybox ] ; then
echo "/bin/initrd-busybox is missing !"
exit 1
fi
if [ "`uname -m`" = "ia64" ]; then
IMAGESIZE=3000
else
IMAGESIZE=1500
fi
while [ $# -gt 0 ]; do
case $1 in
--fstab=*)
fstab="`echo $1 | awk -F= '{print $2;}'`"
;;
--fstab)
fstab="$2"
shift
;;
--modules-conf=*)
modulefile="`echo $1 | awk -F= '{print $2;}'`"
;;
--modules-conf)
modulefile="$2"
shift
;;
--raidtab=*)
raidtab="`echo $1 | awk -F= '{print $2;}'`"
;;
--raidtab)
raidtab="$2"
shift
;;
--use-raidstart|--with-raidstart)
USERAIDSTART="yes"
;;
--without-raidstart)
USERAIDSTART="no"
;;
--use-insmod-static|--with-insmod-static)
USEINSMODSTATIC="yes"
;;
--without-insmod-static)
USEINSMODSTATIC="no"
;;
--without-bootsplash)
BOOT_SPLASH="no"
;;
--without-suspend)
USESUSPEND="no";
;;
--lvmtoolsversion=|--lvmversion=)
LVMTOOLSVERSION="`echo $1 | awk -F= '{print $2;}'`"
;;
--lvmtoolsversion|--lvmversion)
LVMTOOLSVERSION="$2"
shift
;;
--with=*)
BASICMODULES="$BASICMODULES `echo $1 | awk -F= '{print $2;}'`"
;;
--with)
BASICMODULES="$BASICMODULES $2"
shift
;;
--version)
echo "geninitrd: version $VERSION"
exit 0
;;
-v)
verbose=-v
;;
--nocompress)
COMPRESS="no"
;;
--ifneeded)
ifneeded=1
;;
-f)
force=1
;;
--preload=*)
PREMODS="$PREMODS `echo $1 | awk -F= '{print $2;}'`"
;;
--preload)
PREMODS="$PREMODS $2"
shift
;;
--fs=*)
echo "Warning: --fs option is obsoleted. Use --initrdfs instead" 1>&2
INITRDFS="`echo $1 | awk -F= '{print $2;}'`"
;;
--fs)
echo "Warning: --fs option is obsoleted. Use --initrdfs instead" 1>&2
INITRDFS="$2"
shift
;;
--initrdfs=*)
INITRDFS="`echo $1 | awk -F= '{print $2;}'`"
;;
--initrdfs)
INITRDFS="$2"
shift
;;
--image-version)
img_vers=yes
;;
--ide-only-root)
ide_only_root="yes"
;;
*)
if [ -z "$target" ]; then
target="$1"
elif [ -z "$kernel" ]; then
kernel="$1"
else
usage
fi
;;
esac
shift
done
if [ -z "$target" -o -z "$kernel" ]; then
usage
fi
pack_version="`echo "$kernel"|awk -F. '{print sprintf("%03d%03d",$1,$2)}'`"
pack_version_long="`echo "$kernel"|awk -F. '{print sprintf("%03d%03d%03d",$1,$2,$3)}'`"
if [ "x" = "x$INITRDFS" ] ; then
if [ "x" = "x$FS" ] ; then
# default value
# if [ "$pack_version" -ge "002005" ] ; then
# INITRDFS="initramfs"
# else
INITRDFS="rom"
# fi
else
echo "Warning: FS configuration options is obsoleted. Use INITRDFS instead" 1>&2
INITRDFS="$FS"
fi
fi
if [ "$pack_version" -ge "002005" ] ; then
modext=".ko"
insmod="insmod"
fi
if is_yes "$USEINSMODSTATIC" ; then
insmod="insmod.static"
INSMOD="/sbin/insmod.static"
if [ "$pack_version" -lt "002005" -a -f /sbin/insmod.static.modutils ] ; then
INSMOD="/sbin/insmod.static.modutils"
fi
if [ ! -f "$INSMOD" ] ; then
echo "insmod.static requested but /sbin/insmod.static not found !" >&2
exit 1
fi
fi
case "$INITRDFS" in
ext2)
if [ ! -x /sbin/mke2fs ]; then
echo "/sbin/mke2fs is missing" 1>&2
exit 1
fi
;;
rom)
if [ ! -x /sbin/genromfs ]; then
echo "/sbin/genromfs is missing" 1>&2
exit 1
fi
;;
cram)
if [ ! -x /sbin/mkcramfs ]; then
echo "/sbin/mkcramfs is missing" 1>&2
exit 1
fi
;;
initramfs)
if [ ! -x /bin/cpio ]; then
echo "/bin/cpio is missing" 1>&2
exit 1
fi
if [ ! -x /usr/bin/find ]; then
echo "/usr/bin/find is missing" 1>&2
exit 1
fi
;;
*)
echo "Filesystem $INITRDFS on initrd is not supported" 1>&2
exit 1
;;
esac
if [ -n "$img_vers" ]; then
target="$target-$kernel"
fi
if [ -z "$force" -a -f "$target" ]; then
echo "$target already exists." 1>&2
exit 1
fi
if [ ! -d "/lib/modules/$kernel" ]; then
echo "/lib/modules/$kernel is not a directory." 1>&2
exit 1
fi
if [ ! -f /proc/mounts ]; then
echo "/proc filesystem not mounted, may cause wrong results or failure." 1>&2
fi
if [ "$pack_version" -lt "002005" ]; then
modulefile=/etc/modules.conf
if [ ! -f "$modulefile" -a -f /etc/conf.modules ]; then
modulefile=/etc/conf.modules
fi
else
modulefile=/etc/modprobe.conf
fi
for n in $PREMODS; do
findmodule "$n"
done
# allow forcing loading SCSI and/or IDE modules
if is_yes "$ADDSCSI" ; then
find_modules_scsi
fi
if is_yes "$ADDIDE" ; then
find_modules_ide
fi
find_root
org_rootdev="$rootdev1"
find_modules_for "$rootdev1"
findmodule "-$rootFs"
for n in $BASICMODULES; do
findmodule "$n"
done
if [ -n "$ifneeded" -a -z "$MODULES" ]; then
if [ -n "$verbose" ]; then
echo "No modules are needed -- not building initrd image."
fi
exit 0
fi
if [ -n "$verbose" ]; then
echo "Using modules: $MODULES"
fi
MNTIMAGE="`mktemp -d /tmp/initrd.XXXXXX`"
IMAGE="`mktemp -u /tmp/initrd.img-XXXXXX`"
MNTPOINT="`mktemp -d /tmp/initrd.mnt-XXXXXX`"
RCFILE="$MNTIMAGE/linuxrc"
if [ -f "$MNTIMAGE" ]; then
echo "$MNTIMAGE already exists. Remove it and try again" 1>&2
exit 1
fi
if [ -f "$IMAGE" ]; then
echo "$IMAGE already exists. Remove it and try again" 1>&2
exit 1
fi
if [ "$INITRDFS" = "ext2" ] ; then
dd if=/dev/zero of="$IMAGE" bs=1k count="$IMAGESIZE" 2> /dev/null
# We have to "echo y |" so that it doesn't complain about $IMAGE not
# being a block device
echo y | mke2fs -F "$IMAGE" "$IMAGESIZE" >/dev/null 2>/dev/null
mkdir -p "$MNTPOINT"
mount -o loop -t ext2 "$IMAGE" "$MNTPOINT"
else
mkdir -p "$MNTPOINT"
fi
mkdir -p "$MNTIMAGE"/{lib,bin,etc,dev,loopfs,var}
# We don't need this directory, so let's save space
rm -rf "$MNTPOINT"/lost+found
modules_install "$MODULES"
# mknod'ing the devices instead of copying them works both with and
# without devfs...
mknod "$MNTIMAGE/dev/console" c 5 1
mknod "$MNTIMAGE/dev/null" c 1 3
mknod "$MNTIMAGE/dev/zero" c 1 5
s="$RCFILE"
ln -s /linuxrc $MNTIMAGE/init
inst /bin/initrd-busybox "$MNTIMAGE/bin/sh"
ln -s sh "$MNTIMAGE/bin/busybox"
if is_yes "$USEINSMODSTATIC" ; then
inst "$INSMOD" $MNTIMAGE/bin/insmod.static
fi
cat > "$s" <<EOF
#! /bin/sh
set -x
EOF
chmod 755 "$s"
modules_add_linuxrc "$MODULES" "$s"
# TODO: rewrite for busybox
#if [ -n "$loopDev" ]; then
# if [ ! -d /initrd ]; then
# mkdir /initrd
# fi
#
# cp -a "$loopDev" "$MNTIMAGE/dev"
# cp -a "$rootdev1" "$MNTIMAGE/dev"
# echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE"
# echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE"
# echo "echo Setting up loopback device $rootdev1" >> $RCFILE
# echo "losetup $rootdev1 /loopfs$loopFile" >> "$RCFILE"
#fi
initrd_gen_suspend() {
MODULES=""
for mod in $SUSPENDMODS; do
is_yes "$BOOT_SPLASH" && [ "$mod" = "-suspend-text" ] && mod="-suspend_bootsplash"
findmodule "$mod"
done
modules_install "$MODULES"
mkdir -p $MNTIMAGE/sys
mkdir -p $MNTIMAGE/proc
cat << EOF >> "$s"
mount -t proc none /proc
if [ "\$(awk ' /resume2=/ { print "yes"; } ' /proc/cmdline)" = "yes" ]; then
EOF
modules_add_linuxrc "$MODULES" "$s"
cat << EOF >> "$s"
echo > /proc/software_suspend/activate
fi
umount /proc
EOF
}
initrd_gen_softraid() {
[ -n "$verbose" ] && echo "Setting up mdadm..."
if [ ! -x /sbin/initrd-mdadm -a ! -x /sbin/initrd-mdassemble ] ; then
echo "/sbin/initrd-mdadm and /sbin/initrd-mdassemble are missing !"
exit 1
fi
if [ -x /sbin/initrd-mdassemble ] ; then
do_mdassemble=1
inst /sbin/initrd-mdassemble "$MNTIMAGE/bin/mdassemble"
else
do_mdassemble=0
inst /sbin/initrd-mdadm "$MNTIMAGE/bin/mdadm"
fi
# LVM on RAID case
do_md0=1
for nr in `seq 1 $rootdev_nr`; do
eval cr_rootdev="\$rootdev${nr}"
eval cr_dev_list="\$dev_list${nr}"
[ -n "$verbose" ] && echo "Setting up array ($cr_rootdev = $cr_dev_list)"
[ "$cr_rootdev" = "/dev/md0" ] && do_md0=0
if [ "$do_mdassemble" -eq 1 ] ; then
echo "DEVICE $cr_dev_list" >> "$MNTIMAGE/etc/mdadm.conf"
cr_dev_list_md="$(echo "$cr_dev_list" | xargs | awk ' { gsub(/ +/,",",$0); print $0; }')"
echo "ARRAY $cr_rootdev devices=$cr_dev_list_md" >> "$MNTIMAGE/etc/mdadm.conf"
else
echo "mdadm --assemble $cr_rootdev $cr_dev_list" >> "$s"
fi
for f in $cr_dev_list $cr_rootdev ; do
# mkdir in case of devfs name
mkdir -p $MNTIMAGE/`my_dirname $f`
[ -n "$verbose" ] && echo "copying $f"
# this works fine with and without devfs
cp -HR $f $MNTIMAGE/$f
done
done
if [ "$do_mdassemble" -eq 1 ] ; then
echo "mdassemble" >> "$s"
fi
# needed to determine md-version
if [ "$do_md0" -eq 1 ] ; then
mknod $MNTIMAGE/dev/md0 b 9 0
fi
}
initrd_gen_nfs() {
# use root=/dev/ram0 init=/linuxrc when starting kernel or you will
# have problems like init(XX) being child process of swapper(1).
[ -n "$verbose" ] && echo "Adding rootfs on NFS support to initrd (dhcp)"
mknod "$MNTIMAGE/dev/urandom" c 1 8
mkdir "$MNTIMAGE/newroot"
echo "ifconfig lo 127.0.0.1 up" >> "$s"
echo "route add -net 127.0.0.0 netmask 255.0.0.0 lo" >> "$s"
echo "ifconfig eth0 0.0.0.0 up" >> "$s"
echo "udhcpc -i eth0 -f -q -s /bin/setdhcp" >> "$s"
cat << EOF > "$MNTIMAGE/bin/setdhcp"
#!/bin/sh
[ "\$1" != "bound" ] && exit
[ -n "\$broadcast" ] && BROADCAST="broadcast \$broadcast"
[ -n "\$subnet" ] && NETMASK="netmask \$subnet"
set -x
ifconfig \$interface \$ip \$BROADCAST \$NETMASK up
set +x
if [ -n "\$router" ]; then
for r in \$router; do
set -x
route add default gw \$r dev \$interface
set +x
done
fi
if [ -n "\$rootpath" ]; then
set -x
mount -n -t nfs -o ro,nolock,posix,tcp,wsize=8192,rsize=8192 \$rootpath /newroot
set +x
else
set +x
echo "Missing rootpath in what DHCP server sent to us. Failing..."
echo "All seen variables are listed below:"
set
set -x
fi
EOF
chmod 755 "$MNTIMAGE/bin/setdhcp"
echo "cd /newroot" >> "$s"
echo "pivot_root . initrd" >> "$s"
echo "[ -x /sbin/chroot ] && exec /sbin/chroot . /sbin/init -i < dev/console > dev/console 2>&1" >> "$s"
echo "exec /usr/sbin/chroot . /sbin/init -i < dev/console > dev/console 2>&1" >> "$s"
}
initrd_gen_lvm() {
[ -n "$verbose" ] && echo "Adding LVM support to initrd"
inst /sbin/initrd-lvm $MNTIMAGE/bin/lvm
mkdir -p $MNTIMAGE/etc
mkdir -p $MNTIMAGE/tmp
mkdir -p $MNTIMAGE/proc
mkdir -p $MNTIMAGE/newroot
echo "mount -t proc none /proc" >> "$s"
echo "mount -t devfs none /dev" >> "$s"
echo "mount -t tmpfs none /tmp" >> "$s"
if [ "$LVMTOOLSVERSION" = "1" ] ; then
echo "lvm vgscan -T" >> "$s"
echo "lvm vgchange -T -a y $VGVOLUME" >> "$s"
echo "umount /tmp" >> "$s"
# fail to umount
echo "umount /dev" >> "$s"
echo "umount /proc" >> "$s"
else
echo "cat /etc/lvm.conf > /tmp/lvm.conf" >> "$s"
echo "global {" > "$MNTIMAGE/etc/lvm.conf"
echo " locking_type = 0" >> "$MNTIMAGE/etc/lvm.conf"
echo " locking_dir = \"/tmp\"" >> "$MNTIMAGE/etc/lvm.conf"
echo "}" >> "$MNTIMAGE/etc/lvm.conf"
echo "devices {" >> "$MNTIMAGE/etc/lvm.conf"
echo " sysfs_scan=0" >> "$MNTIMAGE/etc/lvm.conf"
if is_yes "$raidfound"; then
echo " md_component_detection = 1" >> "$MNTIMAGE/etc/lvm.conf"
fi
lvm dumpconfig | awk '/filter=/' >> "$MNTIMAGE/etc/lvm.conf"
echo "}" >> "$MNTIMAGE/etc/lvm.conf"
echo "LVM_SYSTEM_DIR=/tmp lvm vgscan --ignorelockingfailure" >> "$s"
echo "LVM_SYSTEM_DIR=/tmp lvm vgchange --ignorelockingfailure -a y $VGVOLUME" >> "$s"
# Find out major/minor
echo "majmin=\"\`LVM_SYSTEM_DIR=/tmp lvm lvdisplay --ignorelockingfailure -c $org_rootdev\`\"" >> "$s"
echo "majmin=\"\${majmin#*/}\"" >> "$s"
echo "majmin=\"\${majmin#*:*:*:*:*:*:*:*:*:*:*:*}\"" >> "$s"
echo "major=\"\${majmin%:*}\"" >> "$s"
echo "minor=\"\${majmin#*:}\"" >> "$s"
# Pass it to kernel
echo "val=\$((256 * \$major + \$minor))" >> "$s"
echo "echo \$val > /proc/sys/kernel/real-root-dev" >> "$s"
echo "umount /tmp" >> "$s"
echo "umount /dev" >> "$s"
echo "umount /proc" >> "$s"
# echo "mount -n -o ro $org_rootdev /newroot" >> "$s"
# echo "cd /newroot" >> "$s"
# echo "pivot_root . initrd" >> "$s"
# echo "[ -x /sbin/chroot ] && exec /sbin/chroot . /sbin/init -i < dev/console > dev/console 2>&1" >> "$s"
# echo "exec /usr/sbin/chroot . /sbin/init -i < dev/console > dev/console 2>&1" >> "$s"
fi
}
initrd_gen_procdata() {
[ -n "$verbose" ] && echo "Adding rootfs finding based on root= option support."
mkdir -p $MNTIMAGE/proc
cat << EOF >> "$s"
set +x
mount -t proc none /proc
root="\$(busybox awk ' /root=\/dev\// { gsub(/.*root=\/dev\//,NIL,\$0); gsub(/ .*/,NIL,\$0); print \$0; } ' /proc/cmdline)"
if [ -n "\$root" ]; then
rootnr="\$(busybox awk -v root="\$root" ' { if (\$4 == root) { print 256*\$1+\$2; } } ' /proc/partitions)"
if [ -n "\$rootnr" ]; then
echo "\$rootnr" > /proc/sys/kernel/real-root-dev
fi
fi
umount /proc
set -x
EOF
}
# main generation
if is_yes "$USESUSPEND"; then
initrd_gen_suspend
fi
if is_yes "$usenfs" ; then
initrd_gen_nfs
elif is_yes "$USERAIDSTART" && is_yes "$raidfound" ; then
initrd_gen_softraid
if is_yes "$uselvm" ; then
initrd_gen_lvm
fi
elif is_yes "$uselvm" ; then
initrd_gen_lvm
else
initrd_gen_procdata
fi
chmod +x "$RCFILE"
(cd "$MNTIMAGE"; tar cf - .) | (cd "$MNTPOINT"; tar xf -)
case "$INITRDFS" in
ext2)
umount "$IMAGE"
;;
rom)
genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel"
;;
cram)
mkcramfs "$MNTPOINT" "$IMAGE"
;;
initramfs)
(cd $MNTPOINT ; find . | cpio -H newc -o > "$IMAGE")
;;
*)
echo "Filesystem $INITRDFS not supported by $0";
esac
if is_yes "$COMPRESS" ; then
gzip -9 < "$IMAGE" > "$target"
else
cp -a "$IMAGE" "$target"
fi
if is_yes "$BOOT_SPLASH"; then
if [ ! -x /bin/splash.bin ]; then
echo "Failed to execute /bin/splash.bin. Is bootsplash package installed?" 1>&2
elif [ -z "$THEME" ]; then
echo "Please configure your /etc/sysconfig/bootsplash first." 1>&2
echo "Generating bootsplashes skipped." 1>&2
else
if [ -n "$BOOT_SPLASH_RESOLUTIONS" ]; then
for res in $BOOT_SPLASH_RESOLUTIONS; do
if [ -f "/etc/bootsplash/themes/$THEME/config/bootsplash-$res.cfg" ]; then
/bin/splash.bin -s -f "/etc/bootsplash/themes/$THEME/config/bootsplash-$res.cfg" >> "$target" && \
[ -n "$verbose" ] && echo "Added $res $THEME theme to initrd."
else
echo "/etc/bootsplash/themes/$THEME/config/bootsplash-$res.cfg doesn't exist, skipped" 1>&2
fi
done
else
echo "No BOOT_SPLASH_RESOLUTIONS specified in /etc/sysconfig/bootsplash." 1>&2
echo "Not adding bootsplash to initrd." 1>&2
fi
fi
fi
rm -rf "$MNTIMAGE" "$MNTPOINT" "$IMAGE"
-------------- następna część ---------
Binarny załącznik wiadomości został usunięty...
Nazwa: ctr.vcf
Typ: text/x-vcard
Rozmiar: 359 bytes
Opis: nie znany
Adres: </mailman/pipermail/pld-users-pl/attachments/20050719/23e48b04/attachment.vcf>
Więcej informacji o liście pld-users-pl