5 # by Jacek Konieczny <jajcus@pld.org.pl>
7 # based on mkinitrd from RedHat
14 . /etc/rc.d/init.d/functions
23 if [ -f /etc/sysconfig/geninitrd ] ; then
24 . /etc/sysconfig/geninitrd
27 if is_yes $USEBSP ; then
28 [ ! -x /sbin/bsp ] && USEBSP="no"
36 modulefile=/etc/modules.conf
37 if [ "`uname -m`" = "ia64" ]; then
42 PRESCSIMODS="scsi_mod unknown sd_mod"
43 PREIDEMODS="ide-mod ide-probe ide-probe-mod ide-disk"
47 echo "usage: `basename $0` [--version] [-v] [-f] [--ifneeded] [--preload <module>]" 1>&2
48 # echo " [--omit-scsi-modules] [--omit-raid-modules] [--omit-ide-modules]" 1>&2
49 echo " [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]" 1>&2
50 echo " [--fs=rom|ext2|cram] [--no-bsp] [--modules-conf=<modules.conf>" 1>&2
51 echo " <initrd-image> <kernel-version>" 1>&2
52 echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" 1>&2
61 if [ "$name" != "build" ]; then
62 (cd $name;my_find $1/$name $2)
65 if [ -f $name -a "$name" = "$2" ]; then
73 echo $1|awk -F/ '{print substr($0, 0, length($0) - length($NF));}'
79 if [ "$(echo $modName | awk '{print(substr($0,1,1));}')" = "-" ]; then
81 modName="$(echo $modName | awk '{print(substr($0,2));}')"
84 if [ "$modName" = "pluto" ]; then
88 if [ "$modName" = "fcal" ]; then
93 fmPath="`(cd /lib/modules/$kernel; my_find . "$modName.o")`"
95 if [ ! -f "/lib/modules/$kernel/$fmPath" ]; then
96 if [ -n "$skiperrors" ]; then
100 # ignore the absence of the scsi modules
101 for n in $PRESCSIMODS; do
102 if [ "$n" = "$modName" ]; then
107 # ignore the absence of the ide modules
108 for n in $PREIDEMODS; do
109 if [ "$n" = "$modName" ]; then
114 echo "No module $modName found for kernel $kernel" 1>&2
118 # only need to add each module once
119 tmpFmPath="`echo "$fmPath"|awk -F/ '{for(i=1;i<NF;i++) { printf("%s\\\\/",$i); } { print $NF; }}'`"
120 if is_yes "`echo "$MODULES" | awk '/"'$tmpFmPath'"/ { print "yes"; }' `" ; then : ; else
121 MODULES="$MODULES $fmPath"
126 if [ "$#" != "2" ];then
127 echo "usage: inst <file> <destination>"
130 [ -n "$verbose" ] && echo "$1 -> $2"
135 /sbin/e2label $1 2> /dev/null
139 /sbin/tune2fs -l $1 2> /dev/null | awk -F: '/UUID:/ {gsub(" ",""); print $2}'
143 /sbin/xfs_admin -l $1 2> /dev/null
147 /sbin/xfs_admin -u $1 2> /dev/null
151 eval `awk '/^[\t ]*#/ {next} {if ( $2 == "/" ) {print "rootdev=\"" $1 "\"\nrootFs=\"" $3 "\""}}' $fstab`
156 if [ ! -x /sbin/e2label ] ; then
157 echo "/sbin/e2label is missing" 1>&2
160 get_label="get_label_ext2"
163 # if [ ! -x /sbin/xfs_admin ] ; then
164 # echo "/sbin/xfs_admin is missing" 1>&2
167 # get_label="get_label_xfs"
170 echo "LABEL on $rootFs in not supported by geninitrd" 1>&2
174 if [ ! -r /proc/partitions ] ; then
175 echo '/proc/partitions is not readable'; 1>&2
178 label=${rootdev#"LABEL="}
179 for dev in `awk 'BEGIN {getline;getline} {print "/dev/" $4}' /proc/partitions` ; do
180 if [ -r $dev ] && [ "$label" = "`$get_label $dev`" ] ; then
181 if [ -n "$verbose" ] ; then
182 echo "Using $dev as device for rootfs"
189 if [ "$rootdev_found" != 1 ] ; then
190 echo "geninitrd can't find real device for LABEL=$label" 1>&2
197 if [ ! -x /sbin/tune2fs ] ; then
198 echo "/sbin/tune2fs is missing" 1>&2
201 get_uuid="get_uuid_ext2"
204 # if [ ! -x /sbin/xfs_admin ] ; then
205 # echo "/sbin/xfs_admin is missing" 1>&2
208 # get_label="get_uuid_xfs"
211 echo "UUID on $rootFs in not supported by geninitrd" 1>&2
215 if [ ! -r /proc/partitions ] ; then
216 echo '/proc/partitions is not readable'; 1>&2
219 uuid=${rootdev#"UUID="}
220 for dev in `awk 'BEGIN {getline;getline} {print "/dev/" $4}' /proc/partitions` ; do
221 if [ -r $dev ] && [ "$uuid" = "`$get_uuid $dev`" ] ; then
222 if [ -n "$verbose" ] ; then
223 echo "Using $dev as device for rootfs"
230 if [ "$rootdev_found" != 1 ] ; then
231 echo "geninitrd can't find real device for UUID=$uuid" 1>&2
239 while [ $# -gt 0 ]; do
245 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
246 fstab="`echo $1 | awk -F= '{print $2;}'`"
253 modulefile="`echo $1 | awk -F= '{print $2;}'`"
260 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
261 modname="`echo $1 | awk -F= '{print $2;}'`"
267 BASICMODULES="$BASICMODULES $modname"
270 echo "geninitrd: version $VERSION"
286 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
287 modname="`echo $1 | awk -F= '{print $2;}'`"
292 PREMODS="$PREMODS $modname"
305 FS="`echo $1 | awk -F= '{print $2;}'`"
315 if [ -z "$target" ]; then
317 elif [ -z "$kernel" ]; then
328 if [ -z "$target" -o -z "$kernel" ]; then
334 if [ ! -x /sbin/mke2fs ]; then
335 echo "/sbin/mke2fs is missing" 1>&2
340 if [ ! -x /sbin/genromfs ]; then
341 echo "/sbin/genromfs is missing" 1>&2
346 if [ ! -x /sbin/mkcramfs ]; then
347 echo "/sbin/mkcramfs is missing" 1>&2
352 echo "Filesystem $FS on initrd is not supported" 1>&2
357 if [ -n "$img_vers" ]; then
358 target="$target-$kernel"
361 if [ -z "$force" -a -f "$target" ]; then
362 echo "$target already exists." 1>&2
366 if [ ! -d "/lib/modules/$kernel" ]; then
367 echo "/lib/modules/$kernel is not a directory." 1>&2
371 for n in $PREMODS; do
377 if is_yes "$PROBESCSI" && is_yes "$(echo "$rootdev" | awk '/^\/dev\/sd/ { print "yes"; }')" ; then
379 for n in $PRESCSIMODS; do
380 if [ "$n" = "unknown" ] ; then
381 if [ ! -f "$modulefile" ]; then
382 modulefile=/etc/conf.modules
384 if [ -f "$modulefile" ]; then
385 scsimodules="`awk '/scsi_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile| LC_ALL=C sort -u`"
386 for n in $scsimodules; do
387 # for now allow scsi modules to come from anywhere. There are some
388 # RAID controllers with drivers in block/
399 if is_yes "$PROBEIDE" && is_yes "`echo "$rootdev" | awk '/^\/dev\/hd/ { print "yes"; }'`" ; then
400 for n in $PREIDEMODS; do
405 if is_yes "$PROBERAID" ; then
406 # load appropriate raid devices if necessary
407 if is_yes "`awk '/^\/dev\/md/ && ! /noauto/ { print "yes"; }' "$fstab"`" ; then
408 for number in $(awk '/^[\t ]*raid-level/ { print $2; }' /etc/raidtab | LC_ALL=C sort -u) ; do
411 findmodule "raid$number"
414 echo "raid level $number (in /etc/raidtab) not recognized" 1>&2
421 if is_yes "`echo "$rootdev" | awk '/\/dev\/rd\// { print "yes"; }'`" ; then
425 if is_yes "`echo "$rootdev" | awk '/\/dev\/ida\// { print "yes"; }'`" ; then
426 findmodule "cpqarray"
429 if is_yes "`echo "$rootdev" | awk '/\/dev\/cciss\// { print "yes"; }'`" ; then
433 # check to see if we need to set up a loopback filesystem
434 if is_yes "`echo "$rootdev" | awk -F/ '{print($3);}' | awk '/loop/ { print "yes"; }'`" ; then
435 if [ ! -x /sbin/losetup ]; then
436 echo "losetup is missing"
439 key="^# $(echo $rootdev | awk -F/ '{print($3);}' | tr '[a-z]' '[A-Z]'):"
440 if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`" ; then
441 echo "The root filesystem is on a $rootdev, but there is no magic entry in $fstab" 1>&2
442 echo "for this device. Consult the geninitrd man page for more information" 1>&2
446 line="`awk '/'$key'/ { print $0; }' $fstab`"
447 loopDev="$(echo $line | awk '{print $3}')"
448 loopFs="$(echo $line | awk '{print $4}')"
449 loopFile="$(echo $line | awk '{print $5}')"
451 BASICMODULES="$BASICMODULES -loop"
452 findmodule "-$loopFs"
453 BASICMODULES="$BASICMODULES -${loopFs}"
454 # don't have any clue, how is this supposed to work,
457 else # Check for other filesystems
458 findmodule "-$rootFs"
461 for n in $BASICMODULES; do
465 if [ -n "$ifneeded" -a -z "$MODULES" ]; then
466 if [ -n "$verbose" ]; then
467 echo "No modules are needed -- not building initrd image."
472 if [ -n "$verbose" ]; then
473 echo "Using modules: $MODULES"
476 MNTIMAGE="`mktemp -d /tmp/initrd.XXXXXX`"
477 IMAGE="`mktemp -u /tmp/initrd.img-XXXXXX`"
478 MNTPOINT="`mktemp -d /tmp/initrd.mnt-XXXXXX`"
479 RCFILE="$MNTIMAGE/linuxrc"
481 if [ -f "$MNTIMAGE" ]; then
482 echo "$MNTIMAGE already exists. Remove it and try again" 1>&2
486 if [ -f "$IMAGE" ]; then
487 echo "$IMAGE already exists. Remove it and try again" 1>&2
491 if [ "$FS" = "ext2" ] ; then
492 dd if=/dev/zero of="$IMAGE" bs=1k count="$IMAGESIZE" 2> /dev/null
494 # We have to "echo y |" so that it doesn't complain about $IMAGE not
495 # being a block device
496 echo y | mke2fs -F "$IMAGE" "$IMAGESIZE" >/dev/null 2>/dev/null
499 mount -o loop -t ext2 "$IMAGE" "$MNTPOINT"
505 mkdir -p "$MNTIMAGE"/{lib,bin,etc,dev,loopfs}
508 # We don't need this directory, so let's save space
509 rm -rf "$MNTPOINT"/lost+found
511 for MODULE in $MODULES; do
512 MODULEDIR="`my_dirname "$MODULE"`"
513 mkdir -p "$MNTIMAGE/lib/modules/$kernel/$MODULEDIR"
514 cp $verbose -a "/lib/modules/$kernel/$MODULE" "$MNTIMAGE/lib/modules/$kernel/$MODULE"
517 # mknod'ing the devices instead of copying them works both with and
519 mknod "$MNTIMAGE/dev/console" c 5 1
521 if is_yes "$USEBSP" ; then
522 s="$MNTIMAGE/etc/startup"
523 inst /sbin/bsp "$RCFILE"
524 echo "# autogenerated startup" > "$s"
527 for MODULE in $MODULES; do
528 module="`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`"
529 options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`"
531 if [ -n "$verbose" ]; then
532 /bin/echo -n "Loading module $module "
534 echo "with options $options"
536 echo "without options"
539 echo "insmod /lib/modules/$kernel/$MODULE $options" >> "$s"
542 inst /bin/trash "$MNTIMAGE/bin/sh"
543 inst /sbin/insmod.static "$MNTIMAGE/bin/insmod"
545 mknod "$MNTIMAGE/dev/null" c 1 3
546 mknod "$MNTIMAGE/dev/ram" b 1 1
547 mknod "$MNTIMAGE/dev/systty" c 4 0
549 mknod "$MNTIMAGE/dev/tty$i" c 4 1
551 mknod "$MNTIMAGE/dev/zero" c 1 5
553 echo "#!/bin/sh" > "$RCFILE"
556 for MODULE in $MODULES; do
557 module="`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`"
558 if [ -f "$modulefile" ] ; then
559 options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`"
564 if [ -n "$verbose" ]; then
565 echo "Loading module $module with options $options"
567 echo "Add module $module to initrd."
568 echo "echo \"Loading $module module\"" >> "$RCFILE"
569 echo "insmod -k /lib/modules/$kernel/$MODULE $options" >> "$RCFILE"
572 if [ -n "$loopDev" ]; then
573 if [ ! -d /initrd ]; then
577 cp -a "$loopDev" "$MNTIMAGE/dev"
578 cp -a "$rootdev" "$MNTIMAGE/dev"
579 echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE"
580 echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE"
581 echo "echo Setting up loopback device $rootdev" >> $RCFILE
582 echo "losetup $rootdev /loopfs$loopFile" >> "$RCFILE"
588 (cd "$MNTIMAGE"; tar cf - .) | (cd "$MNTPOINT"; tar xf -)
595 genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel"
598 mkcramfs "$MNTPOINT" "$IMAGE"
601 echo "Filesystem $FS not supported by $0";
604 if is_yes "$COMPRESS" ; then
605 gzip -9 < "$IMAGE" > "$target"
607 cp -a "$IMAGE" "$target"
609 rm -rf "$MNTIMAGE" "$MNTPOINT" "$IMAGE"