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 if echo $MODULES | grep $fmPath >/dev/null 2>&1 ; then : ; else
103 MODULES="$MODULES $fmPath"
108 if [ "$#" != "2" ];then
109 echo "usage: inst <file> <destination>"
112 [ -n "$verbose" ] && echo "$1 -> $2"
117 while [ $# -gt 0 ]; do
120 if echo $1 | grep '=' >/dev/null ; then
121 fstab=`echo $1 | sed 's/^--fstab=//'`
129 if echo $1 | grep '=' >/dev/null ; then
130 modname=`echo $1 | sed 's/^--with=//'`
136 BASICMODULES="$BASICMODULES $modname"
140 echo "geninitrd: version $VERSION"
160 if echo $1 | grep '=' >/dev/null ; then
161 modname=`echo $1 | sed 's/^--preload=//'`
166 PREMODS="$PREMODS $modname"
183 FS=`echo $1 | sed 's/^--fs=//'`
189 if [ -z "$target" ]; then
191 elif [ -z "$kernel" ]; then
202 if [ -z "$target" -o -z "$kernel" ]; then
208 if [ ! -x /sbin/losetup ]; then
209 echo "losetup is missing"
214 if [ ! -x /sbin/genromfs ]; then
215 echo "genromfs is missing"
220 if [ ! -x /sbin/mkcramfs ]; then
221 echo "mkcramfs is missing"
226 echo "Filesystem $FS not supported"
231 if [ -n "$img_vers" ]; then
232 target="$target-$kernel"
235 if [ -z "$force" -a -f $target ]; then
236 echo "$target already exists." >&2
240 if [ ! -d /lib/modules/$kernel ]; then
241 echo "/lib/modules/$kernel is not a directory." >&2
245 for n in $PREMODS; do
249 rootdev=$(awk '{ if ($2 == "/") { print $1; }}' $fstab)
250 if is_yes "$PROBESCSI" && echo "$rootdev" | grep -q "^/dev/sd" ; then
252 for n in $PRESCSIMODS; do
253 if [ "$n" = "unknown" ] ; then
254 if [ ! -f $modulefile ]; then
255 modulefile=/etc/conf.modules
257 if [ -f $modulefile ]; then
258 scsimodules=`grep scsi_hostadapter $modulefile | grep -v '^[ ]*#' | LC_ALL=C sort -u | awk '{ print $3 }'`
259 for n in $scsimodules; do
260 # for now allow scsi modules to come from anywhere. There are some
261 # RAID controllers with drivers in block/
272 if is_yes "$PROBEIDE" && echo "$rootdev" | grep -q "^/dev/hd" ; then
273 for n in $PREIDEMODS; do
278 if is_yes "$PROBERAID" ; then
279 # load appropriate raid devices if necessary
280 if grep '^/dev/md' $fstab | grep -v noauto >/dev/null 2>&1 ; then
281 for number in $(grep '^[ ]*raid-level' /etc/raidtab |
282 awk '{print $2}' | 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 echo $rootdev | cut -d/ -f3 | grep loop >/dev/null; then
297 key="^# $(echo $rootdev | cut -d/ -f3 | tr '[a-z]' '[A-Z]'):"
298 if ! grep "$key" $fstab > /dev/null; 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=$(grep "$key" $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 -d /tmp/initrd.XXXXXX`
333 IMAGE=`mktemp /tmp/initrd.img-XXXXXX`
334 MNTPOINT=`mktemp -d /tmp/initrd.mnt-XXXXXX`
335 RCFILE=$MNTIMAGE/linuxrc
337 if [ -f $MNTIMAGE ]; then
338 echo "$MNTIMAGE already exists. Remove it and try again" >&2
342 if [ -f $IMAGE ]; then
343 echo "$IMAGE already exists. Remove it and try again" >&2
347 if [ "$FS" = "ext2" ] ; then
348 dd if=/dev/zero of=$IMAGE bs=1k count=$IMAGESIZE 2> /dev/null
350 if [ -e /dev/.devfsd ]; then
356 for devnum in 0 1 2 3 4 5 6 7 8; do
357 if losetup ${LOOPDEV}${devnum} $IMAGE 2>/dev/null ; then break; fi
360 if [ "$devnum" = "8" ]; then
361 rm -rf $MNTPOINT $IMAGE
362 echo "All of your loopback devices are in use!" >&2
366 LODEV=${LOOPDEV}${devnum}
368 # We have to "echo y |" so that it doesn't complain about $IMAGE not
369 # being a block device
370 echo y | mke2fs $LODEV $IMAGESIZE >/dev/null 2>/dev/null
372 if [ -n "$verbose" ]; then
373 echo "Using loopback device $LODEV"
377 mount -t ext2 $LODEV $MNTPOINT || {
378 echo "Can't get a loopback device"
386 mkdir -p $MNTIMAGE/{lib,bin,etc,dev,loopfs}
389 # We don't need this directory, so let's save space
390 rm -rf $MNTPOINT/lost+found
392 inst /bin/ash.static "$MNTIMAGE/bin/sh"
393 inst /sbin/insmod.static "$MNTIMAGE/bin/insmod"
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
402 mknod $MNTIMAGE/dev/null c 1 3
403 mknod $MNTIMAGE/dev/ram b 1 1
404 mknod $MNTIMAGE/dev/systty c 4 0
406 mknod $MNTIMAGE/dev/tty$i c 4 1
409 echo "#!/bin/sh" > $RCFILE
412 for MODULE in $MODULES; do
413 module=`echo $MODULE | sed "s|.*/||" | sed "s/.o$//"`
415 options=`sed -n -e "s/^options[ ][ ]*$module[ ][ ]*//p" $modulefile`
417 if [ -n "$verbose" ]; then
418 echo "Loading module $module with options $options"
420 echo "echo \"Loading $module module\"" >> $RCFILE
421 echo "insmod /lib/$module.o $options" >> $RCFILE
424 if [ -n "$loopDev" ]; then
425 if [ ! -d /initrd ]; then
429 cp -a $loopDev $MNTIMAGE/dev
430 cp -a $rootdev $MNTIMAGE/dev
431 echo "echo Mounting device containing loopback root filesystem" >> $RCFILE
432 echo "mount -t $loopFs $loopDev /loopfs" >> $RCFILE
433 echo "echo Setting up loopback device $rootdev" >> $RCFILE
434 echo "losetup $rootdev /loopfs$loopFile" >> $RCFILE
439 (cd $MNTIMAGE; tar cf - .) | (cd $MNTPOINT; tar xf -)
447 genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel"
450 mkcramfs "$MNTPOINT" "$IMAGE"
453 echo "Filesystem $FS not supported by $0";
456 if is_yes "$COMPRESS" ; then
457 gzip -9 < $IMAGE > $target
461 rm -rf $MNTIMAGE $MNTPOINT $IMAGE