5 # by Jacek Konieczny <jajcus@pld.org.pl>
7 # based on mkinitrd written by Erik Troan <ewt@redhat.com>
9 # Elliot Lee <sopwith@cuc.edu>
10 # Miguel de Icaza <miguel@nuclecu.unam.mx>
11 # Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
12 # Michael K. Johnson <johnsonm@redhat.com>
13 # Pierre Habraken <Pierre.Habraken@ujf-grenoble.fr>
14 # Jakub Jelinek <jj@ultra.linux.cz>
15 # Carlo Arenas Belon (carenas@chasqui.lared.net.pe>
22 . /etc/rc.d/init.d/functions
31 if [ -f /etc/sysconfig/geninitrd ] ; then
32 . /etc/sysconfig/geninitrd
35 if is_yes $USEBSP ; then
36 [ ! -x /sbin/bsp ] && USEBSP="no"
44 modulefile=/etc/modules.conf
45 if [ "`uname -m`" = "ia64" ]; then
50 PRESCSIMODS="scsi_mod unknown sd_mod"
51 PREIDEMODS="ide-mod ide-probe ide-probe-mod ide-disk"
55 echo "usage: `basename $0` [--version] [-v] [-f] [--ifneeded] [--preload <module>]" >&2
56 echo " [--omit-scsi-modules] [--omit-raid-modules] [--omit-ide-modules]" >&2
57 echo " [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]" >&2
58 echo " [--fs=rom|ext2|cram] [--no-bsp]" >&2
59 echo " <initrd-image> <kernel-version>" >&2
60 echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" >&2
69 if [ "$name" != "build" ]; then
70 (cd $name;my_find $1/$name $2)
73 [ -f $name -a "$name" = "$2" ] && echo $1/$name
79 echo $1|awk -F/ '{print substr($0, 0, length($0) - length($NF));}'
85 if [ "$(echo $modName | awk '{print(substr($0,1,1));}')" = "-" ]; then
87 modName="$(echo $modName | awk '{print(substr($0,2));}')"
90 if [ "$modName" = "pluto" ]; then
94 if [ "$modName" = "fcal" ]; then
99 fmPath="`(cd /lib/modules/$kernel; my_find . "$modName.o")`"
101 if [ ! -f "/lib/modules/$kernel/$fmPath" ]; then
102 if [ -n "$skiperrors" ]; then
106 # ignore the absence of the scsi modules
107 for n in $PRESCSIMODS; do
108 if [ "$n" = "$modName" ]; then
113 # ignore the absence of the ide modules
114 for n in $PREIDEMODS; do
115 if [ "$n" = "$modName" ]; then
120 echo "No module $modName found for kernel $kernel" >&2
124 # only need to add each module once
125 tmpFmPath="`echo "$fmPath"|awk -F/ '{for(i=1;i<NF;i++) { printf("%s\\\\/",$i); } { print $NF; }}'`"
126 if is_yes "`echo "$MODULES" | awk '/"'$tmpFmPath'"/ { print "yes"; }' `" ; then : ; else
127 MODULES="$MODULES $fmPath"
132 if [ "$#" != "2" ];then
133 echo "usage: inst <file> <destination>"
136 [ -n "$verbose" ] && echo "$1 -> $2"
141 while [ $# -gt 0 ]; do
148 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
149 fstab="`echo $1 | awk -F= '{print $2;}'`"
157 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
158 modname="`echo $1 | awk -F= '{print $2;}'`"
164 BASICMODULES="$BASICMODULES $modname"
168 echo "geninitrd: version $VERSION"
188 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
189 modname="`echo $1 | awk -F= '{print $2;}'`"
194 PREMODS="$PREMODS $modname"
211 FS="`echo $1 | awk -F= '{print $2;}'`"
217 if [ -z "$target" ]; then
219 elif [ -z "$kernel" ]; then
230 if [ -z "$target" -o -z "$kernel" ]; then
236 if [ ! -x /sbin/mke2fs ]; then
237 echo "/sbin/mke2fs is missing"
242 if [ ! -x /sbin/genromfs ]; then
243 echo "/sbin/genromfs is missing"
248 if [ ! -x /sbin/mkcramfs ]; then
249 echo "/sbin/mkcramfs is missing"
254 echo "Filesystem $FS not supported"
259 if [ -n "$img_vers" ]; then
260 target="$target-$kernel"
263 if [ -z "$force" -a -f "$target" ]; then
264 echo "$target already exists." >&2
268 if [ ! -d "/lib/modules/$kernel" ]; then
269 echo "/lib/modules/$kernel is not a directory." >&2
273 for n in $PREMODS; do
277 rootdev="$(awk '{ if ($2 == "/") { print $1; }}' $fstab)"
278 if is_yes "$PROBESCSI" && is_yes "$(echo "$rootdev" | awk '/^\/dev\/sd/ { print "yes"; }')" ; then
280 for n in $PRESCSIMODS; do
281 if [ "$n" = "unknown" ] ; then
282 if [ ! -f "$modulefile" ]; then
283 modulefile=/etc/conf.modules
285 if [ -f "$modulefile" ]; then
286 scsimodules="`awk '/scsi_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile| LC_ALL=C sort -u`"
287 for n in $scsimodules; do
288 # for now allow scsi modules to come from anywhere. There are some
289 # RAID controllers with drivers in block/
300 if is_yes "$PROBEIDE" && is_yes "`echo "$rootdev" | awk '/^\/dev\/hd/ { print "yes"; }'`" ; then
301 for n in $PREIDEMODS; do
306 if is_yes "$PROBERAID" ; then
307 # load appropriate raid devices if necessary
308 if is_yes "`awk '/^\/dev\/md/ && ! /noauto/ { print "yes"; }' "$fstab"`" ; then
309 for number in $(awk '/^[\t ]*raid-level/ { print $2; }' /etc/raidtab | LC_ALL=C sort -u) ; do
312 findmodule "raid$number"
315 echo "raid level $number (in /etc/raidtab) not recognized" >&2
322 # check to see if we need to set up a loopback filesystem
323 if is_yes "`echo "$rootdev" | awk -F/ '{print($3);}' | awk '/loop/ { print "yes"; }'`" ; then
324 if [ ! -x /sbin/losetup ]; then
325 echo "losetup is missing"
328 key="^# $(echo $rootdev | awk -F/ '{print($3);}' | tr '[a-z]' '[A-Z]'):"
329 if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`" ; then
330 echo "The root filesystem is on a $rootdev, but there is no magic entry in $fstab" 1>&2
331 echo "for this device. Consult the geninitrd man page for more information" 2>&2
335 line="`awk '/'$key'/ { print $0; }' $fstab`"
336 loopDev="$(echo $line | awk '{print $3}')"
337 loopFs="$(echo $line | awk '{print $4}')"
338 loopFile="$(echo $line | awk '{print $5}')"
340 BASICMODULES="$BASICMODULES -loop"
341 findmodule "-$loopFs"
342 BASICMODULES="$BASICMODULES -${loopFs}"
343 # don't have any clue, how is this supposed to work,
346 else # Check for other filesystems
347 rootFs="`awk '{if ($2 == "/") {print $3}}' $fstab`"
348 findmodule "-$rootFs"
351 for n in $BASICMODULES; do
355 if [ -n "$ifneeded" -a -z "$MODULES" ]; then
356 if [ -n "$verbose" ]; then
357 echo "No modules are needed -- not building initrd image."
362 if [ -n "$verbose" ]; then
363 echo "Using modules: $MODULES"
366 MNTIMAGE="`mktemp -d /tmp/initrd.XXXXXX`"
367 IMAGE="`mktemp -u /tmp/initrd.img-XXXXXX`"
368 MNTPOINT="`mktemp -d /tmp/initrd.mnt-XXXXXX`"
369 RCFILE="$MNTIMAGE/linuxrc"
371 if [ -f "$MNTIMAGE" ]; then
372 echo "$MNTIMAGE already exists. Remove it and try again" >&2
376 if [ -f "$IMAGE" ]; then
377 echo "$IMAGE already exists. Remove it and try again" >&2
381 if [ "$FS" = "ext2" ] ; then
382 dd if=/dev/zero of="$IMAGE" bs=1k count="$IMAGESIZE" 2> /dev/null
384 # We have to "echo y |" so that it doesn't complain about $IMAGE not
385 # being a block device
386 echo y | mke2fs -F "$IMAGE" "$IMAGESIZE" >/dev/null 2>/dev/null
389 mount -o loop -t ext2 "$IMAGE" "$MNTPOINT"
395 mkdir -p "$MNTIMAGE"/{lib,bin,etc,dev,loopfs}
398 # We don't need this directory, so let's save space
399 rm -rf "$MNTPOINT"/lost+found
401 for MODULE in $MODULES; do
402 MODULEDIR="`my_dirname "$MODULE"`"
403 mkdir -p "$MNTIMAGE/lib/modules/$kernel/$MODULEDIR"
404 cp $verbose -a "/lib/modules/$kernel/$MODULE" "$MNTIMAGE/lib/modules/$kernel/$MODULE"
407 # mknod'ing the devices instead of copying them works both with and
409 mknod "$MNTIMAGE/dev/console" c 5 1
411 if is_yes "$USEBSP" ; then
412 s="$MNTIMAGE/etc/startup"
413 inst /sbin/bsp "$RCFILE"
414 echo "# autogenerated startup" > "$s"
417 for MODULE in $MODULES; do
418 module="`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`"
419 options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`"
421 if [ -n "$verbose" ]; then
422 echo "Loading module $module with options $options"
424 echo "insmod /lib/modules/$kernel/$MODULE $options" >> "$s"
427 inst /bin/trash "$MNTIMAGE/bin/sh"
428 inst /sbin/insmod.static "$MNTIMAGE/bin/insmod"
430 mknod "$MNTIMAGE/dev/null" c 1 3
431 mknod "$MNTIMAGE/dev/ram" b 1 1
432 mknod "$MNTIMAGE/dev/systty" c 4 0
434 mknod "$MNTIMAGE/dev/tty$i" c 4 1
436 mknod "$MNTIMAGE/dev/zero" c 1 5
438 echo "#!/bin/sh" > "$RCFILE"
441 for MODULE in $MODULES; do
442 module="`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`"
443 options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`"
445 if [ -n "$verbose" ]; then
446 echo "Loading module $module with options $options"
448 echo "Add module $module to initrd."
449 echo "echo \"Loading $module module\"" >> "$RCFILE"
450 echo "insmod -k /lib/modules/$kernel/$MODULE $options" >> "$RCFILE"
453 if [ -n "$loopDev" ]; then
454 if [ ! -d /initrd ]; then
458 cp -a "$loopDev" "$MNTIMAGE/dev"
459 cp -a "$rootdev" "$MNTIMAGE/dev"
460 echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE"
461 echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE"
462 echo "echo Setting up loopback device $rootdev" >> $RCFILE
463 echo "losetup $rootdev /loopfs$loopFile" >> "$RCFILE"
469 (cd "$MNTIMAGE"; tar cf - .) | (cd "$MNTPOINT"; tar xf -)
476 genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel"
479 mkcramfs "$MNTPOINT" "$IMAGE"
482 echo "Filesystem $FS not supported by $0";
485 if is_yes "$COMPRESS" ; then
486 gzip -9 < "$IMAGE" > "$target"
488 cp -a "$IMAGE" "$target"
490 rm -rf "$MNTIMAGE" "$MNTPOINT" "$IMAGE"