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
30 if [ -f /etc/sysconfig/initrd ] ; then
31 . /etc/sysconfig/initrd
40 modulefile=/etc/modules.conf
41 if [ `uname -m` = "ia64" ]; then
46 PRESCSIMODS="scsi_mod unknown sd_mod"
47 PREIDEMODS="ide-mod ide-probe-mod ide-disk"
51 echo "usage: `basename $0` [--version] [-v] [-f] [--ifneeded] [--preload <module>]" >&2
52 echo " [--omit-scsi-modules] [--omit-raid-modules] [--omit-ide-modules] [--with=<module>]" >&2
53 echo " [--image-version] [--fstab=<fstab>] [--nocompress] [--fs=rom|ext2|cram]" >&2
54 echo " <initrd-image> <kernel-version>" >&2
55 echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" >&2
62 if [ $(echo $modName | cut -b1) = "-" ]; then
64 modName=$(echo $modName | cut -b2-)
67 if [ "$modName" = "pluto" ]; then
71 if [ "$modName" = "fcal" ]; then
76 fmPath=`(cd /lib/modules/$kernel; find -type f -name $modName.o)`
78 if [ ! -f /lib/modules/$kernel/$fmPath ]; then
79 if [ -n "$skiperrors" ]; then
83 # ignore the absence of the scsi modules
84 for n in $PRESCSIMODS; do
85 if [ "$n" = "$modName" ]; then
90 # ignore the absence of the ide modules
91 for n in $PREIDEMODS; do
92 if [ "$n" = "$modName" ]; then
97 echo "No module $modName found for kernel $kernel" >&2
101 # only need to add each module once
102 tmpFmPath=`echo $fmPath|awk -F/ '{for(i=1;i<NF;i++) { printf("%s\\/",$i); } { print $NF; }}'`
103 if is_yes "`echo $MODULES | awk '/"'$tmpFmPath'"/ { print "yes"; }' `" ; then : ; else
104 MODULES="$MODULES $fmPath"
109 if [ "$#" != "2" ];then
110 echo "usage: inst <file> <destination>"
113 [ -n "$verbose" ] && echo "$1 -> $2"
118 while [ $# -gt 0 ]; do
121 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
122 fstab=`echo $1 | awk -F= '{print $2;}'`
130 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
131 modname=`echo $1 | awk -F= '{print $2;}'`
137 BASICMODULES="$BASICMODULES $modname"
141 echo "geninitrd: version $VERSION"
161 if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then
162 modname=`echo $1 | awk -F= '{print $2;}'`
167 PREMODS="$PREMODS $modname"
184 FS=`echo $1 | awk -F= '{print $2;}'`
190 if [ -z "$target" ]; then
192 elif [ -z "$kernel" ]; then
203 if [ -z "$target" -o -z "$kernel" ]; then
209 if [ ! -x /sbin/mke2fs ]; then
210 echo "mke2fs is missing"
215 if [ ! -x /sbin/genromfs ]; then
216 echo "genromfs is missing"
221 if [ ! -x /sbin/mkcramfs ]; then
222 echo "mkcramfs is missing"
227 echo "Filesystem $FS not supported"
232 if [ -n "$img_vers" ]; then
233 target="$target-$kernel"
236 if [ -z "$force" -a -f $target ]; then
237 echo "$target already exists." >&2
241 if [ ! -d /lib/modules/$kernel ]; then
242 echo "/lib/modules/$kernel is not a directory." >&2
246 for n in $PREMODS; do
250 rootdev=$(awk '{ if ($2 == "/") { print $1; }}' $fstab)
251 if is_yes "$PROBESCSI" && is_yes "`echo "$rootdev" | awk '/^\/dev\/sd/ { print "yes"; }'`" ; then
253 for n in $PRESCSIMODS; do
254 if [ "$n" = "unknown" ] ; then
255 if [ ! -f $modulefile ]; then
256 modulefile=/etc/conf.modules
258 if [ -f $modulefile ]; then
259 scsimodules=`awk '/scsi_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile| LC_ALL=C sort -u`
260 for n in $scsimodules; do
261 # for now allow scsi modules to come from anywhere. There are some
262 # RAID controllers with drivers in block/
273 if is_yes "$PROBEIDE" && is_yes "`echo "$rootdev" | awk '/^\/dev\/hd/ { print "yes"; }'`" ; then
274 for n in $PREIDEMODS; do
279 if is_yes "$PROBERAID" ; then
280 # load appropriate raid devices if necessary
281 if is_yes "`awk '/^\/dev\/md/ && ! /noauto/ { print "yes"; }' $fstab`" ; then
282 for number in $(awk '/^[\t ]*raid-level/ { print $2; }' /etc/raidtab | LC_ALL=C sort -u) ; do
285 findmodule raid$number
288 echo "raid level $number (in /etc/raidtab) not recognized" >&2
295 # check to see if we need to set up a loopback filesystem
296 if is_yes "`echo $rootdev | cut -d/ -f3 | awk '/loop/ { print "yes"; }'`" ; then
297 key="^# $(echo $rootdev | cut -d/ -f3 | tr '[a-z]' '[A-Z]'):"
298 if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`" ; then
299 echo "The root filesystem is on a $rootdev, but there is no magic entry in $fstab" 1>&2
300 echo "for this device. Consult the geninitrd man page for more information" 2>&2
304 line=`awk '/'$key'/ { print $0; }' $fstab`
305 loopDev=$(echo $line | awk '{print $3}')
306 loopFs=$(echo $line | awk '{print $4}')
307 loopFile=$(echo $line | awk '{print $5}')
309 BASICMODULES="$BASICMODULES -loop"
310 findmodule "-$loopFs"
311 BASICMODULES="$BASICMODULES -${loopFs}"
312 else # Check for other filesystems
313 rootFs=`awk '{if ($2 == "/") {print $3}}' $fstab`
314 findmodule "-$rootFs"
317 for n in $BASICMODULES; do
321 if [ -n "$ifneeded" -a -z "$MODULES" ]; then
322 if [ -n "$verbose" ]; then
323 echo "No modules are needed -- not building initrd image."
328 if [ -n "$verbose" ]; then
329 echo "Using modules: $MODULES"
332 MNTIMAGE=`mktemp -u /tmp/initrd.XXXXXX`
333 IMAGE=`mktemp -u /tmp/initrd.img-XXXXXX`
334 MNTPOINT=`mktemp -u /tmp/initrd.mnt-XXXXXX`
337 RCFILE=$MNTIMAGE/linuxrc
339 if [ -f $MNTIMAGE ]; then
340 echo "$MNTIMAGE already exists. Remove it and try again" >&2
344 if [ -f $IMAGE ]; then
345 echo "$IMAGE already exists. Remove it and try again" >&2
349 if [ "$FS" = "ext2" ] ; then
350 dd if=/dev/zero of=$IMAGE bs=1k count=$IMAGESIZE 2> /dev/null
352 # We have to "echo y |" so that it doesn't complain about $IMAGE not
353 # being a block device
354 echo y | mke2fs -F $IMAGE $IMAGESIZE >/dev/null 2>/dev/null
357 mount -o loop -t ext2 $IMAGE $MNTPOINT
363 mkdir -p $MNTIMAGE/{lib,bin,etc,dev,loopfs}
366 # We don't need this directory, so let's save space
367 rm -rf $MNTPOINT/lost+found
369 inst /bin/ash.static "$MNTIMAGE/bin/sh"
370 inst /sbin/insmod.static "$MNTIMAGE/bin/insmod"
372 for MODULE in $MODULES; do
373 cp $verbose -a /lib/modules/$kernel/$MODULE $MNTIMAGE/lib
376 # mknod'ing the devices instead of copying them works both with and
378 mknod $MNTIMAGE/dev/console c 5 1
379 mknod $MNTIMAGE/dev/null c 1 3
380 mknod $MNTIMAGE/dev/ram b 1 1
381 mknod $MNTIMAGE/dev/systty c 4 0
383 mknod $MNTIMAGE/dev/tty$i c 4 1
386 echo "#!/bin/sh" > $RCFILE
389 for MODULE in $MODULES; do
390 module=`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`
391 options=`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' $modulefile`
393 if [ -n "$verbose" ]; then
394 echo "Loading module $module with options $options"
396 echo "echo \"Loading $module module\"" >> $RCFILE
397 echo "insmod /lib/$module.o $options" >> $RCFILE
400 if [ -n "$loopDev" ]; then
401 if [ ! -d /initrd ]; then
405 cp -a $loopDev $MNTIMAGE/dev
406 cp -a $rootdev $MNTIMAGE/dev
407 echo "echo Mounting device containing loopback root filesystem" >> $RCFILE
408 echo "mount -t $loopFs $loopDev /loopfs" >> $RCFILE
409 echo "echo Setting up loopback device $rootdev" >> $RCFILE
410 echo "losetup $rootdev /loopfs$loopFile" >> $RCFILE
415 (cd $MNTIMAGE; tar cf - .) | (cd $MNTPOINT; tar xf -)
422 genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel"
425 mkcramfs "$MNTPOINT" "$IMAGE"
428 echo "Filesystem $FS not supported by $0";
431 if is_yes "$COMPRESS" ; then
432 gzip -9 < $IMAGE > $target
436 rm -rf $MNTIMAGE $MNTPOINT $IMAGE