5 # by Jacek Konieczny <jajcus@pld.org.pl>
7 # based on geninitrd 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 sd_mod unknown"
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]" >&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="$1"/"$modName".o
78 fmPath=`(cd /lib/modules/$kernel; echo */$modName.o)`
81 if [ "$1" = "fs" ] && [ ! -f /lib/modules/$kernel/$fmPath ]; then
82 fmPath="$1"/"${modName}fs".o
85 if [ ! -f /lib/modules/$kernel/$fmPath ]; then
86 if [ -n "$skiperrors" ]; then
90 # ignore the absence of the scsi modules
91 for n in $PRESCSIMODS; do
92 if [ "$n" = "$modName" ]; then
97 # ignore the absence of the ide modules
98 for n in $PREIDEMODS; do
99 if [ "$n" = "$modName" ]; then
104 echo "No module $modName found for kernel $kernel" >&2
108 # only need to add each module once
109 if echo $MODULES | grep $fmPath >/dev/null 2>&1 ; then : ; else
110 MODULES="$MODULES $fmPath"
115 if [ "$#" != "2" ];then
116 echo "usage: inst <file> <destination>"
119 [ -n "$verbose" ] && echo "$1 -> $2"
124 while [ $# -gt 0 ]; do
127 if echo $1 | grep '=' >/dev/null ; then
128 fstab=`echo $1 | sed 's/^--with=//'`
136 if echo $1 | grep '=' >/dev/null ; then
137 modname=`echo $1 | sed 's/^--with=//'`
143 BASICMODULES="$BASICMODULES $modname"
147 echo "geninitrd: version $VERSION"
167 if echo $1 | grep '=' >/dev/null ; then
168 modname=`echo $1 | sed 's/^--preload=//'`
173 PREMODS="$PREMODS $modname"
186 if echo $1 | grep '=' >/dev/null ; then
187 FS=`echo $1 | sed 's/^--fs=//'`
197 if [ -z "$target" ]; then
199 elif [ -z "$kernel" ]; then
210 if [ "$FS" != "ext2" -a "$FS" != "rom" ] ; then
211 echo "Only ext2 and rom fs are supported!"
214 if [ -z "$target" -o -z "$kernel" ]; then
218 if [ -n "$img_vers" ]; then
219 target="$target-$kernel"
222 if [ -z "$force" -a -f $target ]; then
223 echo "$target already exists." >&2
227 if [ ! -d /lib/modules/$kernel ]; then
228 echo "/lib/modules/$kernel is not a directory." >&2
232 for n in $PREMODS; do
236 rootdev=$(awk '{ if ($2 == "/") { print $1; }}' $fstab)
237 if is_yes "$PROBESCSI" && echo "$rootdev" | grep -q "^/dev/sd" ; then
239 for n in $PRESCSIMODS; do
243 if [ ! -f $modulefile ]; then
244 modulefile=/etc/conf.modules
246 if [ -f $modulefile ]; then
247 scsimodules=`grep scsi_hostadapter $modulefile | grep -v '^[ ]*#' | LC_ALL=C sort -u | awk '{ print $3 }'`
248 for n in $scsimodules; do
249 # for now allow scsi modules to come from anywhere. There are some
250 # RAID controllers with drivers in block/
256 if is_yes "$PROBEIDE" && echo "$rootdev" | grep -q "^/dev/hd" ; then
257 for n in $PREIDEMODS; do
262 if is_yes "$PROBERAID" ; then
263 # load appropriate raid devices if necessary
264 if grep '^/dev/md' $fstab | grep -v noauto >/dev/null 2>&1 ; then
265 for number in $(grep '^[ ]*raid-level' /etc/raidtab |
266 awk '{print $2}' | LC_ALL=C sort -u) ; do
269 findmodule "" raid$number
272 echo "raid level $number (in /etc/raidtab) not recognized" >&2
279 # check to see if we need to set up a loopback filesystem
280 if echo $rootdev | cut -d/ -f3 | grep loop >/dev/null; then
281 key="^# $(echo $rootdev | cut -d/ -f3 | tr '[a-z]' '[A-Z]'):"
282 if ! grep "$key" $fstab > /dev/null; then
283 echo "The root filesystem is on a $rootdev, but there is no magic entry in $fstab" 1>&2
284 echo "for this device. Consult the geninitrd man page for more information" 2>&2
288 line=$(grep "$key" $fstab)
289 loopDev=$(echo $line | awk '{print $3}')
290 loopFs=$(echo $line | awk '{print $4}')
291 loopFile=$(echo $line | awk '{print $5}')
293 BASICMODULES="$BASICMODULES -loop"
294 findmodule fs "-$loopFs"
295 BASICMODULES="$BASICMODULES -${loopFs}"
296 else # Check for other filesystems
297 rootFs=`awk '{if ($2 == "/") {print $3}}' $fstab`
298 findmodule fs "-$rootFs"
301 for n in $BASICMODULES; do
305 if [ -n "$ifneeded" -a -z "$MODULES" ]; then
306 if [ -n "$verbose" ]; then
307 echo "No modules are needed -- not building initrd image."
312 if [ -n "$verbose" ]; then
313 echo "Using modules: $MODULES"
316 MNTIMAGE=/tmp/initrd.$$
317 IMAGE=/tmp/initrd.img-$$
318 MNTPOINT=/tmp/initrd.mnt-$$
319 RCFILE=$MNTIMAGE/linuxrc
321 if [ -f $MNTIMAGE ]; then
322 echo "$MNTIMAGE already exists. Remove it and try again" >&2
326 if [ -f $IMAGE ]; then
327 echo "$IMAGE already exists. Remove it and try again" >&2
331 if [ "$FS" = "ext2" ] ; then
332 dd if=/dev/zero of=$IMAGE bs=1k count=$IMAGESIZE 2> /dev/null
334 if [ -e /dev/.devfsd ]; then
340 for devnum in 0 1 2 3 4 5 6 7 8; do
341 if losetup ${LOOPDEV}${devnum} $IMAGE 2>/dev/null ; then break; fi
344 if [ "$devnum" = "8" ]; then
345 rm -rf $MNTPOINT $IMAGE
346 echo "All of your loopback devices are in use!" >&2
350 LODEV=${LOOPDEV}${devnum}
352 # We have to "echo y |" so that it doesn't complain about $IMAGE not
353 # being a block device
354 echo y | mke2fs $LODEV $IMAGESIZE >/dev/null 2>/dev/null
356 if [ -n "$verbose" ]; then
357 echo "Using loopback device $LODEV"
361 mount -t ext2 $LODEV $MNTPOINT || {
362 echo "Can't get a loopback device"
370 mkdir -p $MNTIMAGE/lib
371 mkdir -p $MNTIMAGE/bin
372 mkdir -p $MNTIMAGE/etc
373 mkdir -p $MNTIMAGE/dev
374 mkdir -p $MNTIMAGE/loopfs
376 # We don't need this directory, so let's save space
377 rm -rf $MNTPOINT/lost+found
379 inst /bin/ash.static "$MNTIMAGE/bin/sh"
380 inst /sbin/insmod.static "$MNTIMAGE/bin/insmod"
382 for MODULE in $MODULES; do
383 cp $verbose -a /lib/modules/$kernel/$MODULE $MNTIMAGE/lib
386 # mknod'ing the devices instead of copying them works both with and
388 mknod $MNTIMAGE/dev/console c 5 1
389 mknod $MNTIMAGE/dev/null c 1 3
390 mknod $MNTIMAGE/dev/ram b 1 1
391 mknod $MNTIMAGE/dev/systty c 4 0
393 mknod $MNTIMAGE/dev/tty$i c 4 1
396 echo "#!/bin/sh" > $RCFILE
399 for MODULE in $MODULES; do
400 module=`echo $MODULE | sed "s|.*/||" | sed "s/.o$//"`
402 options=`sed -n -e "s/^options[ ][ ]*$module[ ][ ]*//p" $modulefile`
404 if [ -n "$verbose" ]; then
405 echo "Loading module $module with options $options"
407 echo "echo \"Loading $module module\"" >> $RCFILE
408 echo "insmod /lib/$module.o $options" >> $RCFILE
411 if [ -n "$loopDev" ]; then
412 if [ ! -d /initrd ]; then
416 cp -a $loopDev $MNTIMAGE/dev
417 cp -a $rootdev $MNTIMAGE/dev
418 echo "echo Mounting device containing loopback root filesystem" >> $RCFILE
419 echo "mount -t $loopFs $loopDev /loopfs" >> $RCFILE
420 echo "echo Setting up loopback device $rootdev" >> $RCFILE
421 echo "losetup $rootdev /loopfs$loopFile" >> $RCFILE
426 (cd $MNTIMAGE; tar cf - .) | (cd $MNTPOINT; tar xf -)
428 if [ "$FS" = "ext2" ] ; then
432 genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel"
436 if is_yes "$COMPRESS" ; then
437 gzip -9 < $IMAGE > $target
441 rm -rf $MNTIMAGE $MNTPOINT $IMAGE