]> git.pld-linux.org Git - projects/geninitrd.git/blobdiff - geninitrd
- when comparing pci IDs make sure they will be compared as strings
[projects/geninitrd.git] / geninitrd
index 7a0d8d4bdfbe5273d98ec68f77e883aa5fdd6b6d..fb1611c8cd19b6c491fa4363426db780105a5bc4 100755 (executable)
--- a/geninitrd
+++ b/geninitrd
 #
 #      by Jacek Konieczny <jajcus@pld.org.pl>
 #
-# based on geninitrd written by Erik Troan <ewt@redhat.com>
-# and contributors:
-#      Elliot Lee <sopwith@cuc.edu>
-#      Miguel de Icaza <miguel@nuclecu.unam.mx>
-#      Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
-#      Michael K. Johnson <johnsonm@redhat.com>
-#      Pierre Habraken <Pierre.Habraken@ujf-grenoble.fr>
-#      Jakub Jelinek <jj@ultra.linux.cz>
-#      Carlo Arenas Belon (carenas@chasqui.lared.net.pe>
-#
+# based on mkinitrd from RedHat
+
+RCSID='$Id: geninitrd,v 2.36 2003/08/09 23:42:04 baggins Exp $'
 PATH=/sbin:$PATH
 export PATH
 
-VERSION=%VERSIONTAG%
+VERSION="`echo "$RCSID"|awk '{print $3}'`"
 
 . /etc/rc.d/init.d/functions
 
 COMPRESS="yes"
-FS="rom"
-PROBESCSI="yes"
-PROBEIDE="yes"
-PROBERAID="yes"
-
-if [ -f /etc/sysconfig/initrd ] ; then
-       . /etc/sysconfig/initrd
-fi
-
+# INITRDFS is set later (catch obsoleted FS option)
+#INITRDFS="rom"
+USERAIDSTART="yes"
+USEMDADMSTATIC="no"
+USEINSMODSTATIC="no"
+uselvm="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"
 target=""
 kernel=""
 force=""
 verbose=""
 MODULES=""
 img_vers=""
-modulefile=/etc/modules.conf
-if [ `uname -m` = "ia64" ]; then
-  IMAGESIZE=3000
-else
-  IMAGESIZE=1500
-fi
-PRESCSIMODS="scsi_mod sd_mod unknown"
-PREIDEMODS="ide-mod ide-probe-mod ide-disk"
+modulefile="/etc/modules.conf"
+raidtab="/etc/raidtab"
 fstab="/etc/fstab"
+insmod="insmod"
+modext=".o"
 
 usage () {
-    echo "usage: `basename $0` [--version] [-v] [-f] [--ifneeded] [--preload <module>]" >&2
-    echo "       [--omit-scsi-modules] [--omit-raid-modules] [--omit-ide-modules] [--with=<module>]" >&2
-    echo "       [--image-version] [--fstab=<fstab>] [--nocompress] [--fs=rom|ext2]" >&2
-    echo "       <initrd-image> <kernel-version>" >&2
-    echo "       (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" >&2
-    exit 1
+       echo "usage: `basename $0` [--version] [-v] [-f] [--ifneeded] [--preload <module>]" 1>&2
+       echo "       [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]" 1>&2
+       echo "       [--initrdfs=rom|ext2|cram] [--modules-conf=<modules.conf>]" 1>&2
+       echo "       [--with-raidstart] [--without-raidstart] [--with-insmod-static]" 1>&2
+       echo "       [--with-mdadm-static]" 1>&2
+       echo "       <initrd-image> <kernel-version>" 1>&2
+       echo "       (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" 1>&2
+       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=$2
-    if [ $(echo $modName | cut -b1) = "-" ]; then
-       skiperrors=1
-       modName=$(echo $modName | cut -b2-)
-    fi
-
-    if [ "$modName" = "pluto" ]; then
-       findmodule "" fc4
-       findmodule "" soc
-    fi
-    if [ "$modName" = "fcal" ]; then
-       findmodule "" fc4
-       findmodule "" socal
-    fi
-    if [ -n "$1" ]; then
-       fmPath="$1"/"$modName".o
-    else
-       fmPath=`(cd /lib/modules/$kernel; echo */$modName.o)`
-    fi
-
-    if [ "$1" = "fs" ] && [ ! -f /lib/modules/$kernel/$fmPath ]; then
-       fmPath="$1"/"${modName}fs".o
-    fi
-
-    if [ ! -f /lib/modules/$kernel/$fmPath ]; then
+       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
-           return
+               allModulesToFind=`find_depmod silent $modName`
+       else
+               allModulesToFind=`find_depmod normal $modName`
+               if [ $? != 0 ] ; then
+                       exit 1
+               fi
+       fi
+       
+       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
+}
 
-        # ignore the absence of the scsi modules
+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
+
+}
+
+find_modules_softraid() {
+       eval `awk -v rootdev="$1" 'BEGIN {
+       found="no";
+       dev_list="";
+}
+
+{
+       gsub("\t"," ");
+       gsub("  +", " ");
+       gsub("^ ","");
+       if (/^[\t ]*#/)
+               next;
+       if (/^raiddev/) {
+               if ($2 == rootdev) {
+                       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 `
+       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
+       fi
+       for device in $dev_list; do
+               find_modules_for $device
+       done
+}
+
+find_modules_scsi() {
        for n in $PRESCSIMODS; do
-           if [ "$n" = "$modName" ]; then
-               return;
-           fi
-       done;
-    
-        # ignore the absence of the ide modules
-       for n in $PREIDEMODS; do
-           if [ "$n" = "$modName" ]; then
-               return;
-           fi
-       done;
-    
-       echo "No module $modName found for kernel $kernel" >&2
-       exit 1
-    fi
+               if [ "X$n" = "Xunknown" ] ; then
+                       if [ "$pack_version" -ge "002005" ]; then
+                               modulefile=/etc/modprobe.conf
+                       fi
+                       if [ ! -f "$modulefile" ]; then
+                               modulefile=/etc/conf.modules
+                       fi
+                       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
+                                       findmodule "$n"
+                               done
+                       fi
+               else
+                       findmodule "$n"
+               fi
+       done
+}
+
+find_modules_ide() {
+       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 [ "$pack_version" -ge "002005" ]; then
+                               modulefile=/etc/modprobe.conf
+                   fi
+                   if [ ! -f "$modulefile" ]; then
+                       modulefile=/etc/conf.modules
+                   fi
+                   if [ -f "$modulefile" ]; then
+                        [ -n "$verbose" ] && echo "Finding IDE modules using ide_hostadapter"
+                       idemodules="`awk '/ide_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile`"
+                       for n in $idemodules; do
+                           tryauto=0;
+                           findmodule "$n"
+                       done
+                   fi
+
+                   if [ "$tryauto" -eq 1 ]; then
+                       [ -n "$verbose" ] && echo "Finding IDE modules using PCI ID database"
+                       idemodules=""
+                       for n in $(awk ' { print $2 } ' /proc/bus/pci/devices); do
+                           eval `awk -v pciid="$n" '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;
+               max_kernel=$3;
+               exit 0;
+       }
+}
 
-    # only need to add each module once
-    if echo $MODULES | grep $fmPath >/dev/null 2>&1 ; then : ; else
-       MODULES="$MODULES $fmPath"
-    fi
+END {
+       print "module=" module "\nmin_kernel=" min_kernel "\nmax_kernel=\"" max_kernel "\"\n";
+}' /usr/share/pci-database/ide.pci`
+                           if [ -n "$module" ]; then
+                               echo "$module"
+                               gomin=1
+                               gomax=1
+                               [ -n "$min_kernel" -a "$pack_version_long" -lt "$min_kernel" ] && gomin=0
+                               [ -n "$max_kernel" -a "$pack_version_long" -gt "$max_kernel" ] && gomax=0
+                               [ "$gomax" -ne 0 -a "$gomin" -ne 0 ] && idemodules="$idemodules $module"
+                           fi
+                       done
+                       idemodules=$(for n in $idemodules; do echo "$n"; done | xargs)
+                       for n in $idemodules; do
+                           findmodule "$n"
+                       done
+                   fi
+               fi
+               findmodule "$n"
+           done
+       fi
 }
 
-inst() {
-    if [ "$#" != "2" ];then
-        echo "usage: inst <file> <destination>"
-        return
-    fi 
-    [ -n "$verbose" ] && echo "$1 -> $2"
-    cp $1 $2
+find_modules_for() {
+       if 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|ataraid)/ { print "yes"; }'`" ; then
+               find_modules_ide
+       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
+               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 ls -l "$1"|awk '{if (/^b/) { if ($5 == "58,") { exit 0; } else { exit 1; } } else { exit 1; }}'; then
+               if [ ! -f /sbin/initrd-lvm ] ; then
+                       echo "ERROR: root on LVM but /sbin/initrd-lvm not found."
+                       echo "Please install lvm-initrd package and rerun $0."
+                       exit 1
+               fi
+               if [ -n "$PVDEVICES" ] ; then
+                       for device in $PVDEVICES; do
+                               find_modules_for $device
+                       done
+               else
+                       echo "ERROR: Sorry, but searching for PV isn't implemented yet."
+                       echo "Use PVDEVICES in /etc/sysconfig/geninitrd to set it."
+                       exit 1
+               fi
+               findmodule "-lvm"
+               findmodule "-lvm-mod"
+               uselvm="yes"
+       fi
 }
 
+if [ -r /etc/sysconfig/geninitrd ] ; then
+       . /etc/sysconfig/geninitrd
+fi
+
+if [ "x" = "x$INITRDFS" ] ; then
+       if [ "x" = "x$FS" ] ; then
+               # default value
+               INITRDFS="rom"
+       else
+               echo "Warning: FS configuration options is obsoleted. Use INITRDFS instead" 1>&2
+               INITRDFS="$FS"
+       fi
+fi
 
+if [ ! -x /sbin/bsp ] ; then 
+       echo "/sbin/bsp is missing !"
+       exit 1
+fi
+if [ "`uname -m`" = "ia64" ]; then
+       IMAGESIZE=3000
+else
+       IMAGESIZE=1500
+fi
 while [ $# -gt 0 ]; do
-    case $1 in
-       --fstab*)
-           if echo $1 | grep '=' >/dev/null ; then
-               fstab=`echo $1 | sed 's/^--with=//'`
-           else
-               fstab=$2
+       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
-           fi              
-           ;;
-
-       --with*)
-           if echo $1 | grep '=' >/dev/null ; then
-               modname=`echo $1 | sed 's/^--with=//'`
-           else
-               modname=$2
+               ;;
+       --raidtab=*)
+               raidtab="`echo $1 | awk -F= '{print $2;}'`"
+               ;;
+       --raidtab)
+               raidtab="$2"
                shift
-           fi              
-
-           BASICMODULES="$BASICMODULES $modname"
-           ;;
-
+               ;;
+       --use-raidstart|--with-raidstart)
+               USERAIDSTART="yes"
+               ;;
+       --without-raidstart)
+               USERAIDSTART="no"
+               ;;
+       --use-mdadm-static|--with-mdadm-static)
+               USEMDADMSTATIC="yes"
+               ;;
+       --use-insmod-static|--with-insmod-static)
+               USEINSMODSTATIC="yes"
+               ;;
+       --without-insmod-static)
+               USEINSMODSTATIC="no"
+               ;;
+       --with=*)
+               BASICMODULES="$BASICMODULES `echo $1 | awk -F= '{print $2;}'`"
+               ;;
+       --with)
+               BASICMODULES="$BASICMODULES $2"
+               shift
+               ;;
        --version)
-           echo "geninitrd: version $VERSION"
-           exit 0
-           ;;
-
+               echo "geninitrd: version $VERSION"
+               exit 0
+               ;;
        -v)
-           verbose=-v
-           ;;
-
+               verbose=-v
+               ;;
        --nocompress)
-           COMPRESS="no"
-           ;;
-
+               COMPRESS="no"
+               ;;
        --ifneeded)
-           ifneeded=1
-           ;;
-
+               ifneeded=1
+               ;;
        -f)
-           force=1
-           ;;
+               force=1
+               ;;
+       --preload=*)
+               PREMODS="$PREMODS `echo $1 | awk -F= '{print $2;}'`"
+               ;;
        --preload)
-           if echo $1 | grep '=' >/dev/null ; then
-               modname=`echo $1 | sed 's/^--preload=//'`
-           else
-               modname=$2
+               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
-           fi              
-           PREMODS="$PREMODS $modname"
-           ;;
-       --omit-scsi-modules)
-           PRESCSIMODS=""
-           PROBESCSI="no";
-           ;;
-       --omit-raid-modules)
-           PROBERAID="no";
-           ;;
-       --omit-ide-modules)
-           PROBEIDE="no";
-           ;;
-       --with-fs)
-           if echo $1 | grep '=' >/dev/null ; then
-               FS=`echo $1 | sed 's/^--fs=//'`
-           else
-               FS=$2
+               ;;
+       --initrdfs=*)
+               INITRDFS="`echo $1 | awk -F= '{print $2;}'`"
+               ;;
+       --initrdfs)
+               INITRDFS="$2"
                shift
-           fi              
-           ;;
+               ;;
        --image-version)
-           img_vers=yes
-           ;;
+               img_vers=yes
+               ;;
        *)
-           if [ -z "$target" ]; then
-               target=$1
-           elif [ -z "$kernel" ]; then
-               kernel=$1
-           else
-               usage
-           fi
-           ;;
-    esac
-
-    shift
+               if [ -z "$target" ]; then
+                       target="$1"
+               elif [ -z "$kernel" ]; then
+                       kernel="$1"
+               else
+                       usage
+               fi
+               ;;
+       esac
+
+       shift
 done
 
-if [ "$FS" != "ext2" -a "$FS" != "rom" ] ; then
-    echo "Only ext2 and rom fs are supported!"
+if [ -z "$target" -o -z "$kernel" ]; then
+       usage
 fi
 
-if [ -z "$target" -o -z "$kernel" ]; then
-    usage
+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 [ "$pack_version" -ge "002005" ] ; then
+       modext=".ko"
+       insmod="insmod_ng"
 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
+               ;;
+       *)
+               echo "Filesystem $INITRDFS on initrd is not supported" 1>&2
+               exit 1
+               ;;
+esac
+
 if [ -n "$img_vers" ]; then
-    target="$target-$kernel"
+       target="$target-$kernel"
 fi
 
-if [ -z "$force" -a -f $target ]; then
-    echo "$target already exists." >&2
-    exit 1
+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." >&2
-    exit 1
+if [ ! -d "/lib/modules/$kernel" ]; then
+       echo "/lib/modules/$kernel is not a directory." 1>&2
+       exit 1
 fi
 
 for n in $PREMODS; do
-       findmodule "" $n
+       findmodule "$n"
 done
 
-rootdev=$(awk '{ if ($2 == "/") { print $1; }}' $fstab)
-if is_yes "$PROBSCSI" && echo "$rootdev" | grep -q "^/dev/sd" ; then
-
-    for n in $PRESCSIMODS; do
-           findmodule scsi $n
-    done
-
-    if [ ! -f $modulefile ]; then
-        modulefile=/etc/conf.modules
-    fi
-    if [ -f $modulefile ]; then
-       scsimodules=`grep scsi_hostadapter $modulefile | grep -v '^[    ]*#' | LC_ALL=C sort -u | awk '{ print $3 }'`
-       for n in $scsimodules; do
-    # for now allow scsi modules to come from anywhere.  There are some
-    # RAID controllers with drivers in block/
-           findmodule "" $n
-       done
-    fi
+# allow forcing loading SCSI and/or IDE modules
+if is_yes "$ADDSCSI" ; then
+       find_modules_scsi
 fi
 
-if is_yes "$PROBEIDE" && echo "$rootdev" | grep -q "^/dev/hd" ; then
-    for n in $PREIDEMODS; do
-           findmodule block $n
-    done
+if is_yes "$ADDIDE" ; then
+       find_modules_ide
 fi
 
-if is_yes "$PROBERAID" ; then
-    # load appropriate raid devices if necessary
-    if grep '^/dev/md' $fstab | grep -v noauto >/dev/null 2>&1 ; then
-       for number in $(grep '^[        ]*raid-level' /etc/raidtab |
-                         awk '{print $2}' | LC_ALL=C sort -u) ; do
-           case $number in
-           [0145])
-               findmodule "" raid$number
-               ;;
-           *)
-               echo "raid level $number (in /etc/raidtab) not recognized" >&2
-               ;;
-           esac
-       done
-    fi
-fi
+find_root
 
-# check to see if we need to set up a loopback filesystem
-if echo $rootdev | cut -d/ -f3 | grep loop >/dev/null; then
-    key="^# $(echo $rootdev | cut -d/ -f3 | tr '[a-z]' '[A-Z]'):"
-    if ! grep "$key" $fstab > /dev/null; then
-       echo "The root filesystem is on a $rootdev, but there is no magic entry in $fstab" 1>&2
-       echo "for this device. Consult the geninitrd man page for more information" 2>&2
-       exit 1
-    fi
-
-    line=$(grep "$key" $fstab)
-    loopDev=$(echo $line | awk '{print $3}')
-    loopFs=$(echo $line | awk '{print $4}')
-    loopFile=$(echo $line | awk '{print $5}')
-
-    BASICMODULES="$BASICMODULES -loop"
-    findmodule fs "-$loopFs"
-    BASICMODULES="$BASICMODULES -${loopFs}"
-else # Check for other filesystems
-    rootFs=`awk '{if ($2 == "/") {print $3}}' $fstab`
-    findmodule fs "-$rootFs"
-fi
+find_modules_for "$rootdev"
+
+findmodule "-$rootFs"
 
-for n in $BASICMODULES; do 
-    findmodule "" $n
+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
+       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"
+       echo "Using modules: $MODULES"
 fi
 
-MNTIMAGE=/tmp/initrd.$$
-IMAGE=/tmp/initrd.img-$$
-MNTPOINT=/tmp/initrd.mnt-$$
-RCFILE=$MNTIMAGE/linuxrc
+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" >&2
-    exit 1
+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" >&2
-    exit 1
+if [ -f "$IMAGE" ]; then
+       echo "$IMAGE already exists. Remove it and try again" 1>&2
+       exit 1
 fi
 
-if [ "$FS" = "ext2" ] ; then
-       dd if=/dev/zero of=$IMAGE bs=1k count=$IMAGESIZE 2> /dev/null
-
-       if [ -e /dev/.devfsd ]; then
-               LOOPDEV=/dev/loop/
-       else
-               LOOPDEV=/dev/loop
-       fi
-
-       for devnum in 0 1 2 3 4 5 6 7 8; do
-           if losetup ${LOOPDEV}${devnum} $IMAGE 2>/dev/null ; then break; fi
-       done
-
-       if [ "$devnum" = "8" ]; then
-           rm -rf $MNTPOINT $IMAGE
-           echo "All of your loopback devices are in use!" >&2
-           exit 1
-       fi
-
-       LODEV=${LOOPDEV}${devnum}
+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 $LODEV $IMAGESIZE >/dev/null 2>/dev/null
-
-       if [ -n "$verbose" ]; then
-           echo "Using loopback device $LODEV"
-       fi
+       echo y | mke2fs -F "$IMAGE" "$IMAGESIZE" >/dev/null 2>/dev/null
 
-       mkdir -p $MNTPOINT
-       mount -t ext2 $LODEV $MNTPOINT || {
-               echo "Can't get a loopback device"
-               exit 1
-       }
+       mkdir -p "$MNTPOINT"
+       mount -o loop -t ext2 "$IMAGE" "$MNTPOINT"
 else
-       mkdir -p $MNTPOINT
+       mkdir -p "$MNTPOINT"
 fi
 
-mkdir -p $MNTIMAGE
-mkdir -p $MNTIMAGE/lib
-mkdir -p $MNTIMAGE/bin
-mkdir -p $MNTIMAGE/etc
-mkdir -p $MNTIMAGE/dev
-mkdir -p $MNTIMAGE/loopfs
 
-# We don't need this directory, so let's save space
-rm -rf $MNTPOINT/lost+found
+mkdir -p "$MNTIMAGE"/{lib,bin,etc,dev,loopfs}
+
 
-inst /bin/ash.static "$MNTIMAGE/bin/sh"
-inst /sbin/insmod.static "$MNTIMAGE/bin/insmod"
+# We don't need this directory, so let's save space
+rm -rf "$MNTPOINT"/lost+found
 
 for MODULE in $MODULES; do
-    cp $verbose -a /lib/modules/$kernel/$MODULE $MNTIMAGE/lib
+       MODULEDIR="`my_dirname "$MODULE"`"
+       mkdir -p "$MNTIMAGE/lib/modules/$kernel/$MODULEDIR"
+       cp $verbose -a "/lib/modules/$kernel/$MODULE" "$MNTIMAGE/lib/modules/$kernel/$MODULE"
+       gunzip "$MNTIMAGE/lib/modules/$kernel/$MODULE" 2> /dev/null
 done
 
 # 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/ram b 1 1
-mknod $MNTIMAGE/dev/systty c 4 0
-for i in 1 2 3 4; do
-    mknod $MNTIMAGE/dev/tty$i c 4 1
-done
+mknod "$MNTIMAGE/dev/console" c 5 1
 
-echo "#!/bin/sh" > $RCFILE
-echo "" >> $RCFILE
+s="$MNTIMAGE/etc/startup"
 
-for MODULE in $MODULES; do
-    module=`echo $MODULE | sed "s|.*/||" | sed "s/.o$//"`
+if [ -f /sbin/bsp-raidless ] ; then
+       inst /sbin/bsp-raidless "$RCFILE"
+else
+       inst /sbin/bsp "$RCFILE"
+fi
 
-    options=`sed -n -e "s/^options[    ][      ]*$module[      ][      ]*//p" $modulefile`
+if is_yes "$USEINSMODSTATIC" ; then
+       inst "$INSMOD" $MNTIMAGE/bin/insmod.static
+fi
 
-    if [ -n "$verbose" ]; then
-        echo "Loading module $module with options $options"
-    fi
-    echo "echo \"Loading $module module\"" >> $RCFILE
-    echo "insmod /lib/$module.o $options" >> $RCFILE
-done
+echo "# autogenerated startup" > "$s"
+echo "" >> "$s"
 
-if [ -n "$loopDev" ]; then
-    if [ ! -d /initrd ]; then
-       mkdir /initrd
-    fi
-
-    cp -a $loopDev $MNTIMAGE/dev
-    cp -a $rootdev $MNTIMAGE/dev
-    echo "echo Mounting device containing loopback root filesystem" >> $RCFILE
-    echo "mount -t $loopFs $loopDev /loopfs" >> $RCFILE
-    echo "echo Setting up loopback device $rootdev" >> $RCFILE
-    echo "losetup $rootdev /loopfs$loopFile" >> $RCFILE
-fi
+for MODULE in $MODULES; do
+       MODULE2="`my_dirname "$MODULE"`"
+       NAME2=`basename "$MODULE" .gz`
+       MODULE2=$MODULE2/$NAME2
+       module="`echo $MODULE | awk -F/ '{ $0=$NF } /'$modext'$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`"
+       options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`"
 
-chmod +x $RCFILE
+       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" >> "$s"
+done
 
-(cd $MNTIMAGE; tar cf - .) | (cd $MNTPOINT; tar xf -)
+# TODO: rewrite for bsp
+#if [ -n "$loopDev" ]; then
+#      if [ ! -d /initrd ]; then
+#              mkdir /initrd
+#      fi
+#
+#      cp -a "$loopDev" "$MNTIMAGE/dev"
+#      cp -a "$rootdev" "$MNTIMAGE/dev"
+#      echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE"
+#      echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE"
+#      echo "echo Setting up loopback device $rootdev" >> $RCFILE
+#      echo "losetup $rootdev /loopfs$loopFile" >> "$RCFILE"
+#fi
+
+if is_yes "$USERAIDSTART" && is_yes "$raidfound" ; then
+       if is_yes "$USEMDADMSTATIC" ; then
+               [ -n "$verbose" ] && echo "Setting up mdadm"
+               inst /sbin/initrd-mdadm "$MNTIMAGE/bin/mdadm"
+               echo "mdadm --assemble $rootdev $dev_list" >> "$s"
+       else
+               [ -n "$verbose" ] && echo "Adding raidstart to initrd"
+               inst "$raidtab" "$MNTIMAGE/etc/raidtab"
+               # don't use raidless version
+               inst /sbin/bsp "$RCFILE"
+               echo "raidstart $rootdev" >> "$s"
+       fi
 
-if [ "$FS" = "ext2" ] ; then
-       mount $MNTPOINT
-       losetup -d $LODEV
-else
-       genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel"
+       # needed to determine md-version
+       if [ "$rootdev" != /dev/md0 ] ; then
+               mknod $MNTIMAGE/dev/md0 b 9 0
+       fi
        
+       for f in $dev_list $rootdev ; do
+               # mkdir in case of devfs name
+               mkdir -p `my_dirname $f`
+               [ -n "$verbose" ] && echo "copying $f"
+               # this works fine with and without devfs
+               cp -HR $f $MNTIMAGE/$f
+       done
+fi
+
+if is_yes "$uselvm" ; then
+       [ -n "$verbose" ] && echo "Adding LVM support to initrd"
+       inst /sbin/initrd-lvm $MNTIMAGE/bin/lvm
+       mkdir $MNTIMAGE/tmp
+       mkdir $MNTIMAGE/proc
+       echo "mount none /proc proc" >> "$s"
+       echo "mount none /tmp tmpfs" >> "$s"
+       echo "mount none /dev devfs" >> "$s"
+       echo "lvm vgscan -T" >> "$s"
+       echo "lvm vgchange -T -a y" >> "$s"
+       echo "umount /tmp" >> "$s"
+       echo "umount /proc" >> "$s"
+       # fail to umount
+       #echo "umount /devfs" >> "$s"
 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"
+               ;;
+       *)
+               echo "Filesystem $INITRDFS not supported by $0";
+esac
+
 if is_yes "$COMPRESS" ; then
-    gzip -9 < $IMAGE > $target
+       gzip -9 < "$IMAGE" > "$target"
 else
-    cp -a $IMAGE $target
+       cp -a "$IMAGE" "$target"
 fi
-rm -rf $MNTIMAGE $MNTPOINT $IMAGE
-
+rm -rf "$MNTIMAGE" "$MNTPOINT" "$IMAGE"
This page took 0.071347 seconds and 4 git commands to generate.