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/initrd ] ; then
32 . /etc/sysconfig/initrd
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-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 (cd $name;my_find $1/$name $2)
71 [ -f $name -a "$name" = "$2" ] && echo $1/$name
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" >&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 while [ $# -gt 0 ]; do
142 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
143 fstab="`echo $1 | awk -F= '{print $2;}'`"
151 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
152 modname="`echo $1 | awk -F= '{print $2;}'`"
158 BASICMODULES="$BASICMODULES $modname"
162 echo "geninitrd: version $VERSION"
182 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
183 modname="`echo $1 | awk -F= '{print $2;}'`"
188 PREMODS="$PREMODS $modname"
205 FS="`echo $1 | awk -F= '{print $2;}'`"
211 if [ -z "$target" ]; then
213 elif [ -z "$kernel" ]; then
224 if [ -z "$target" -o -z "$kernel" ]; then
230 if [ ! -x /sbin/mke2fs ]; then
231 echo "mke2fs is missing"
236 if [ ! -x /sbin/genromfs ]; then
237 echo "genromfs is missing"
242 if [ ! -x /sbin/mkcramfs ]; then
243 echo "mkcramfs is missing"
248 echo "Filesystem $FS not supported"
253 if [ -n "$img_vers" ]; then
254 target="$target-$kernel"
257 if [ -z "$force" -a -f "$target" ]; then
258 echo "$target already exists." >&2
262 if [ ! -d "/lib/modules/$kernel" ]; then
263 echo "/lib/modules/$kernel is not a directory." >&2
267 for n in $PREMODS; do
271 rootdev="$(awk '{ if ($2 == "/") { print $1; }}' $fstab)"
272 if is_yes "$PROBESCSI" && is_yes "$(echo "$rootdev" | awk '/^\/dev\/sd/ { print "yes"; }')" ; then
274 for n in $PRESCSIMODS; do
275 if [ "$n" = "unknown" ] ; then
276 if [ ! -f "$modulefile" ]; then
277 modulefile=/etc/conf.modules
279 if [ -f "$modulefile" ]; then
280 scsimodules="`awk '/scsi_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile| LC_ALL=C sort -u`"
281 for n in $scsimodules; do
282 # for now allow scsi modules to come from anywhere. There are some
283 # RAID controllers with drivers in block/
294 if is_yes "$PROBEIDE" && is_yes "`echo "$rootdev" | awk '/^\/dev\/hd/ { print "yes"; }'`" ; then
295 for n in $PREIDEMODS; do
300 if is_yes "$PROBERAID" ; then
301 # load appropriate raid devices if necessary
302 if is_yes "`awk '/^\/dev\/md/ && ! /noauto/ { print "yes"; }' "$fstab"`" ; then
303 for number in $(awk '/^[\t ]*raid-level/ { print $2; }' /etc/raidtab | LC_ALL=C sort -u) ; do
306 findmodule "raid$number"
309 echo "raid level $number (in /etc/raidtab) not recognized" >&2
316 # check to see if we need to set up a loopback filesystem
317 if is_yes "`echo "$rootdev" | awk -F/ '{print($3);}' | awk '/loop/ { print "yes"; }'`" ; then
318 if [ ! -x /sbin/losetup ]; then
319 echo "losetup is missing"
322 key="^# $(echo $rootdev | awk -F/ '{print($3);}' | tr '[a-z]' '[A-Z]'):"
323 if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`" ; then
324 echo "The root filesystem is on a $rootdev, but there is no magic entry in $fstab" 1>&2
325 echo "for this device. Consult the geninitrd man page for more information" 2>&2
329 line="`awk '/'$key'/ { print $0; }' $fstab`"
330 loopDev="$(echo $line | awk '{print $3}')"
331 loopFs="$(echo $line | awk '{print $4}')"
332 loopFile="$(echo $line | awk '{print $5}')"
334 BASICMODULES="$BASICMODULES -loop"
335 findmodule "-$loopFs"
336 BASICMODULES="$BASICMODULES -${loopFs}"
337 # don't have any clue, how is this supposed to work,
340 else # Check for other filesystems
341 rootFs="`awk '{if ($2 == "/") {print $3}}' $fstab`"
342 findmodule "-$rootFs"
345 for n in $BASICMODULES; do
349 if [ -n "$ifneeded" -a -z "$MODULES" ]; then
350 if [ -n "$verbose" ]; then
351 echo "No modules are needed -- not building initrd image."
356 if [ -n "$verbose" ]; then
357 echo "Using modules: $MODULES"
360 MNTIMAGE="`mktemp -d /tmp/initrd.XXXXXX`"
361 IMAGE="`mktemp -u /tmp/initrd.img-XXXXXX`"
362 MNTPOINT="`mktemp -d /tmp/initrd.mnt-XXXXXX`"
363 RCFILE="$MNTIMAGE/linuxrc"
365 if [ -f "$MNTIMAGE" ]; then
366 echo "$MNTIMAGE already exists. Remove it and try again" >&2
370 if [ -f "$IMAGE" ]; then
371 echo "$IMAGE already exists. Remove it and try again" >&2
375 if [ "$FS" = "ext2" ] ; then
376 dd if=/dev/zero of="$IMAGE" bs=1k count="$IMAGESIZE" 2> /dev/null
378 # We have to "echo y |" so that it doesn't complain about $IMAGE not
379 # being a block device
380 echo y | mke2fs -F "$IMAGE" "$IMAGESIZE" >/dev/null 2>/dev/null
383 mount -o loop -t ext2 "$IMAGE" "$MNTPOINT"
389 mkdir -p "$MNTIMAGE"/{lib,bin,etc,dev,loopfs}
392 # We don't need this directory, so let's save space
393 rm -rf "$MNTPOINT"/lost+found
395 for MODULE in $MODULES; do
396 cp $verbose -a "/lib/modules/$kernel/$MODULE" "$MNTIMAGE/lib"
399 # mknod'ing the devices instead of copying them works both with and
401 mknod "$MNTIMAGE/dev/console" c 5 1
403 if is_yes "$USEBSP" ; then
404 s="$MNTIMAGE/etc/startup"
405 inst /sbin/bsp "$RCFILE"
406 echo "# autogenerated startup" > "$s"
409 for MODULE in $MODULES; do
410 module="`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`"
411 options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`"
413 if [ -n "$verbose" ]; then
414 echo "Loading module $module with options $options"
416 echo "insmod $module.o $options" >> "$s"
419 inst /bin/trash "$MNTIMAGE/bin/sh"
420 inst /sbin/insmod.static "$MNTIMAGE/bin/insmod"
422 mknod "$MNTIMAGE/dev/null" c 1 3
423 mknod "$MNTIMAGE/dev/ram" b 1 1
424 mknod "$MNTIMAGE/dev/systty" c 4 0
426 mknod "$MNTIMAGE/dev/tty$i" c 4 1
428 mknod "$MNTIMAGE/dev/zero" c 1 5
430 echo "#!/bin/sh" > "$RCFILE"
433 for MODULE in $MODULES; do
434 module="`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`"
435 options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`"
437 if [ -n "$verbose" ]; then
438 echo "Loading module $module with options $options"
440 echo "echo \"Loading $module module\"" >> "$RCFILE"
441 echo "insmod /lib/$module.o $options" >> "$RCFILE"
444 if [ -n "$loopDev" ]; then
445 if [ ! -d /initrd ]; then
449 cp -a "$loopDev" "$MNTIMAGE/dev"
450 cp -a "$rootdev" "$MNTIMAGE/dev"
451 echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE"
452 echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE"
453 echo "echo Setting up loopback device $rootdev" >> $RCFILE
454 echo "losetup $rootdev /loopfs$loopFile" >> "$RCFILE"
460 (cd "$MNTIMAGE"; tar cf - .) | (cd "$MNTPOINT"; tar xf -)
467 genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel"
470 mkcramfs "$MNTPOINT" "$IMAGE"
473 echo "Filesystem $FS not supported by $0";
476 if is_yes "$COMPRESS" ; then
477 gzip -9 < "$IMAGE" > "$target"
479 cp -a "$IMAGE" "$target"
481 rm -rf "$MNTIMAGE" "$MNTPOINT" "$IMAGE"