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>]" >&2
48 echo " [--omit-scsi-modules] [--omit-raid-modules] [--omit-ide-modules]" >&2
49 echo " [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]" >&2
50 echo " [--fs=rom|ext2|cram] [--no-bsp]" >&2
51 echo " <initrd-image> <kernel-version>" >&2
52 echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" >&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" >&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
141 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
142 fstab="`echo $1 | awk -F= '{print $2;}'`"
149 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
150 modname="`echo $1 | awk -F= '{print $2;}'`"
156 BASICMODULES="$BASICMODULES $modname"
159 echo "geninitrd: version $VERSION"
175 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
176 modname="`echo $1 | awk -F= '{print $2;}'`"
181 PREMODS="$PREMODS $modname"
198 FS="`echo $1 | awk -F= '{print $2;}'`"
204 if [ -z "$target" ]; then
206 elif [ -z "$kernel" ]; then
217 if [ -z "$target" -o -z "$kernel" ]; then
223 if [ ! -x /sbin/mke2fs ]; then
224 echo "/sbin/mke2fs is missing"
229 if [ ! -x /sbin/genromfs ]; then
230 echo "/sbin/genromfs is missing"
235 if [ ! -x /sbin/mkcramfs ]; then
236 echo "/sbin/mkcramfs is missing"
241 echo "Filesystem $FS not supported"
246 if [ -n "$img_vers" ]; then
247 target="$target-$kernel"
250 if [ -z "$force" -a -f "$target" ]; then
251 echo "$target already exists." >&2
255 if [ ! -d "/lib/modules/$kernel" ]; then
256 echo "/lib/modules/$kernel is not a directory." >&2
260 for n in $PREMODS; do
264 rootdev="$(awk '{ if ($2 == "/") { print $1; }}' $fstab)"
265 if is_yes "$PROBESCSI" && is_yes "$(echo "$rootdev" | awk '/^\/dev\/sd/ { print "yes"; }')" ; then
267 for n in $PRESCSIMODS; do
268 if [ "$n" = "unknown" ] ; then
269 if [ ! -f "$modulefile" ]; then
270 modulefile=/etc/conf.modules
272 if [ -f "$modulefile" ]; then
273 scsimodules="`awk '/scsi_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile| LC_ALL=C sort -u`"
274 for n in $scsimodules; do
275 # for now allow scsi modules to come from anywhere. There are some
276 # RAID controllers with drivers in block/
287 if is_yes "$PROBEIDE" && is_yes "`echo "$rootdev" | awk '/^\/dev\/hd/ { print "yes"; }'`" ; then
288 for n in $PREIDEMODS; do
293 if is_yes "$PROBERAID" ; then
294 # load appropriate raid devices if necessary
295 if is_yes "`awk '/^\/dev\/md/ && ! /noauto/ { print "yes"; }' "$fstab"`" ; then
296 for number in $(awk '/^[\t ]*raid-level/ { print $2; }' /etc/raidtab | LC_ALL=C sort -u) ; do
299 findmodule "raid$number"
302 echo "raid level $number (in /etc/raidtab) not recognized" >&2
309 # check to see if we need to set up a loopback filesystem
310 if is_yes "`echo "$rootdev" | awk -F/ '{print($3);}' | awk '/loop/ { print "yes"; }'`" ; then
311 if [ ! -x /sbin/losetup ]; then
312 echo "losetup is missing"
315 key="^# $(echo $rootdev | awk -F/ '{print($3);}' | tr '[a-z]' '[A-Z]'):"
316 if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`" ; then
317 echo "The root filesystem is on a $rootdev, but there is no magic entry in $fstab" 1>&2
318 echo "for this device. Consult the geninitrd man page for more information" 2>&2
322 line="`awk '/'$key'/ { print $0; }' $fstab`"
323 loopDev="$(echo $line | awk '{print $3}')"
324 loopFs="$(echo $line | awk '{print $4}')"
325 loopFile="$(echo $line | awk '{print $5}')"
327 BASICMODULES="$BASICMODULES -loop"
328 findmodule "-$loopFs"
329 BASICMODULES="$BASICMODULES -${loopFs}"
330 # don't have any clue, how is this supposed to work,
333 else # Check for other filesystems
334 rootFs="`awk '{if ($2 == "/") {print $3}}' $fstab`"
335 findmodule "-$rootFs"
338 for n in $BASICMODULES; do
342 if [ -n "$ifneeded" -a -z "$MODULES" ]; then
343 if [ -n "$verbose" ]; then
344 echo "No modules are needed -- not building initrd image."
349 if [ -n "$verbose" ]; then
350 echo "Using modules: $MODULES"
353 MNTIMAGE="`mktemp -d /tmp/initrd.XXXXXX`"
354 IMAGE="`mktemp -u /tmp/initrd.img-XXXXXX`"
355 MNTPOINT="`mktemp -d /tmp/initrd.mnt-XXXXXX`"
356 RCFILE="$MNTIMAGE/linuxrc"
358 if [ -f "$MNTIMAGE" ]; then
359 echo "$MNTIMAGE already exists. Remove it and try again" >&2
363 if [ -f "$IMAGE" ]; then
364 echo "$IMAGE already exists. Remove it and try again" >&2
368 if [ "$FS" = "ext2" ] ; then
369 dd if=/dev/zero of="$IMAGE" bs=1k count="$IMAGESIZE" 2> /dev/null
371 # We have to "echo y |" so that it doesn't complain about $IMAGE not
372 # being a block device
373 echo y | mke2fs -F "$IMAGE" "$IMAGESIZE" >/dev/null 2>/dev/null
376 mount -o loop -t ext2 "$IMAGE" "$MNTPOINT"
382 mkdir -p "$MNTIMAGE"/{lib,bin,etc,dev,loopfs}
385 # We don't need this directory, so let's save space
386 rm -rf "$MNTPOINT"/lost+found
388 for MODULE in $MODULES; do
389 MODULEDIR="`my_dirname "$MODULE"`"
390 mkdir -p "$MNTIMAGE/lib/modules/$kernel/$MODULEDIR"
391 cp $verbose -a "/lib/modules/$kernel/$MODULE" "$MNTIMAGE/lib/modules/$kernel/$MODULE"
394 # mknod'ing the devices instead of copying them works both with and
396 mknod "$MNTIMAGE/dev/console" c 5 1
398 if is_yes "$USEBSP" ; then
399 s="$MNTIMAGE/etc/startup"
400 inst /sbin/bsp "$RCFILE"
401 echo "# autogenerated startup" > "$s"
404 for MODULE in $MODULES; do
405 module="`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`"
406 options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`"
408 if [ -n "$verbose" ]; then
409 echo "Loading module $module with options $options"
411 echo "insmod /lib/modules/$kernel/$MODULE $options" >> "$s"
414 inst /bin/trash "$MNTIMAGE/bin/sh"
415 inst /sbin/insmod.static "$MNTIMAGE/bin/insmod"
417 mknod "$MNTIMAGE/dev/null" c 1 3
418 mknod "$MNTIMAGE/dev/ram" b 1 1
419 mknod "$MNTIMAGE/dev/systty" c 4 0
421 mknod "$MNTIMAGE/dev/tty$i" c 4 1
423 mknod "$MNTIMAGE/dev/zero" c 1 5
425 echo "#!/bin/sh" > "$RCFILE"
428 for MODULE in $MODULES; do
429 module="`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`"
430 options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`"
432 if [ -n "$verbose" ]; then
433 echo "Loading module $module with options $options"
435 echo "Add module $module to initrd."
436 echo "echo \"Loading $module module\"" >> "$RCFILE"
437 echo "insmod -k /lib/modules/$kernel/$MODULE $options" >> "$RCFILE"
440 if [ -n "$loopDev" ]; then
441 if [ ! -d /initrd ]; then
445 cp -a "$loopDev" "$MNTIMAGE/dev"
446 cp -a "$rootdev" "$MNTIMAGE/dev"
447 echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE"
448 echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE"
449 echo "echo Setting up loopback device $rootdev" >> $RCFILE
450 echo "losetup $rootdev /loopfs$loopFile" >> "$RCFILE"
456 (cd "$MNTIMAGE"; tar cf - .) | (cd "$MNTPOINT"; tar xf -)
463 genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel"
466 mkcramfs "$MNTPOINT" "$IMAGE"
469 echo "Filesystem $FS not supported by $0";
472 if is_yes "$COMPRESS" ; then
473 gzip -9 < "$IMAGE" > "$target"
475 cp -a "$IMAGE" "$target"
477 rm -rf "$MNTIMAGE" "$MNTPOINT" "$IMAGE"