--- mkinitrd.orig 2005-09-28 13:15:32.000000000 +0530 +++ mkinitrd 2005-09-28 18:45:13.686880808 +0530 @@ -44,6 +44,9 @@ pivot=1 initramfs="" modulefile=/etc/modules.conf rc=0 +dump_dev="" +dump_fs="" +kdump_capture=0 IMAGESIZE=8000 PRESCSIMODS="scsi_mod sd_mod unknown" @@ -61,6 +64,7 @@ usage () { echo "usage: `basename $0` [--version] [-v] [-f] [--preload ]" >&2 echo " [--omit-scsi-modules] [--omit-raid-modules] [--omit-lvm-modules]" >&2 echo " [--with=] [--image-version] [--fstab=] [--nocompress]" >&2 + echo " [--dump-dev=] [--dump-fs=]" >&2 echo " [--builtin=] [--nopivot] " >&2 echo "" >&2 echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" >&2 @@ -270,6 +274,23 @@ while [ $# -gt 0 ]; do --allow-missing) allowmissing=yes ;; + --dump-dev*) + if echo $1 | grep -q '=' ; then + dump_dev=`echo $1 | sed 's/^--dump-dev=//'` + else + dump_dev=$2 + shift + fi + dump_dev_type=$(echo $dump_dev | sed 's/[0-9]*$//' | cut -d/ -f3 ) + ;; + --dump-fs*) + if echo $1 | grep -q '=' ; then + dump_fs=`echo $1 | sed 's/^--dump-fs=//'` + else + dump_fs=$2 + shift + fi + ;; *) if [ -z "$target" ]; then target=$1 @@ -288,6 +309,20 @@ if [ -z "$target" -o -z "$kernel" ]; the usage fi +if [ -z "$dump_dev" -a -z "$dump_fs" ]; then + kdump_capture=0 +elif [ -z "$dump_dev" -a ! -z "$dump_fs" ]; then + echo 'Please specify a dump device' + usage + exit 1 +elif [ ! -z "$dump_dev" -a -z "$dump_fs" ]; then + echo 'Please specify a filesystem for the dump device' + usage + exit 1 +else + kdump_capture=1 +fi + if [ -n "$img_vers" ]; then target="$target-$kernel" fi @@ -353,8 +388,12 @@ if [ -n "$withusb" ]; then # If / or /boot is on a USB device include the driver. With root by # label we could still get some odd behaviors for fs in / /boot ; do + if [ $kdump_capture -eq 0 ]; then esc=$(echo $fs | sed 's,/,\\/,g') dev=$(mount | awk "/ on ${esc} / { print \$1 }" | sed 's/[0-9]*$//' | cut -d/ -f3) + else + dev=$dump_dev_type + fi if [ "$(echo $dev | cut -c1-2)" = sd ]; then if [ `which kudzu 2>/dev/null` ]; then host=$(kudzu --probe -b scsi | @@ -380,6 +419,7 @@ if [ -n "$needusb" ]; then fi if [ -z "$noscsi" ]; then + if [ $kdump_capture -eq 0 ] || [ $kdump_capture -eq 1 -a "$(echo $dump_dev_type | cut -c1-2)" = "sd" ];then if [ ! -f $modulefile ]; then modulefile=/etc/conf.modules fi @@ -399,12 +439,15 @@ if [ -z "$noscsi" ]; then done fi fi + fi fi # If we have ide devices and module ide, do the right thing ide=/proc/ide/ide* if [ -n "$ide" ]; then + if [ $kdump_capture -eq 0 ] || [ $kdump_capture -eq 1 -a "$(echo $dump_dev_type | cut -c1-2)" = "hd" ];then findmodule -ide-disk + fi fi # If we use LVM, include lvm-mod @@ -466,6 +509,7 @@ if [ -z "$noraid" -a -f /proc/mdstat ]; fi fi +if [ $kdump_capture -eq 0 ]; then # check to see if we need to set up a loopback filesystem rootdev=$(awk '/^[ \t]*[^#]/ { if ($2 == "/") { print $1; }}' $fstab) if echo $rootdev | cut -d/ -f3 | grep -q loop ; then @@ -518,6 +562,7 @@ if [ -n "$root_lvm" ]; then findmodule -dm-snapshot fi fi +fi #if kdump_capture -eq 0 cond for n in $basicmodules; do findmodule $n @@ -583,12 +628,51 @@ mkdir -p $MNTIMAGE/loopfs mkdir -p $MNTIMAGE/proc mkdir -p $MNTIMAGE/sys mkdir -p $MNTIMAGE/sysroot +[ $kdump_capture -eq 1 ] && mkdir -p $MNTIMAGE/dump ln -s bin $MNTIMAGE/sbin inst /sbin/nash "$MNTIMAGE/bin/nash" inst /sbin/insmod.static "$MNTIMAGE/bin/insmod" ln -s /sbin/nash $MNTIMAGE/sbin/modprobe +if [ $kdump_capture -eq 1 ]; then + bin_copy=`whereis -b dd | awk '{print $2}'` + if [ -z $bin_copy ]; then + echo 'Could not find binary for dd' + else + inst $bin_copy $MNTIMAGE/bin/. + s=`echo $(ldd $bin_copy | awk '{ for (i=1;i<=NF;i+=1 ){if ($i ~ /^\//){printf "%s ", $i };}}')` + for lib in $s; do + onlylib=`echo $lib | sed "s|.*/||"` + find_lib=`find $MNTIMAGE/lib/ -name "$onlylib"` + if [ -z "$find_lib" ]; then + cp -u $lib $MNTIMAGE/lib/. + fi + find_lib="" + done + fi + s="" + find_lib="" + only_lib="" + #using find here + bin_reboot=`find /bin /sbin -name 'reboot'` + if [ -z $bin_reboot ]; then + echo 'Could not find binary for reboot' + else + inst $bin_reboot $MNTIMAGE/bin/. + s=`echo $(ldd $bin_reboot | awk '{ for (i=1;i<=NF;i+=1 ){if ($i ~ /^\//){printf "%s ", $i };}}')` + + for lib in $s; do + onlylib=`echo $lib | sed "s|.*/||"` + find_lib=`find $MNTIMAGE/lib/ -name "$onlylib"` + if [ -z "$find_lib" ]; then + cp -u $lib $MNTIMAGE/lib/. #avoid redundancies + fi + find_lib="" + done + fi +fi + if [ -n "$USE_UDEV" ]; then inst /sbin/udev.static $MNTIMAGE/sbin/udev inst /sbin/udevstart.static $MNTIMAGE/sbin/udevstart @@ -611,6 +695,13 @@ mknod $MNTIMAGE/dev/console c 5 1 mknod $MNTIMAGE/dev/null c 1 3 mknod $MNTIMAGE/dev/ram b 1 1 mknod $MNTIMAGE/dev/systty c 4 0 +if [ $kdump_capture -eq 1 -a ! -b "$MNTIMAGE$dump_dev" ]; then + dump_maj=$(ls -l $dump_dev | cut -d " " -f 6 | cut -d "," -f 1) + dump_min=$(ls -l $dump_dev | cut -d " " -f 7) + dev_type=$(ls -l $dump_dev | cut -c 1) + mknod "$MNTIMAGE$dump_dev" $dev_type $dump_maj $dump_min +fi + for i in 1 2 3 4; do mknod $MNTIMAGE/dev/tty$i c 4 $i done @@ -717,7 +808,15 @@ if [ -z "$USE_UDEV" ]; then echo "mkdevices /dev" >> $RCFILE fi -if [ -n "$loopDev" ]; then +if [ $kdump_capture -eq 1 ]; then + echo "mount -t $dump_fs $dump_dev /dump" >> $RCFILE + echo "echo Copying the dump " >> $RCFILE + echo "dd if=/proc/vmcore of=/dump/dumpfile" >> $RCFILE + echo "umount /dump " >> $RCFILE + echo "echo Rebooting the system " >> $RCFILE + echo "reboot -f" >> $RCFILE +else + if [ -n "$loopDev" ]; then mkdir /initrd cp -a $loopDev $MNTIMAGE/dev cp -a $rootdev $MNTIMAGE/dev @@ -725,27 +824,27 @@ if [ -n "$loopDev" ]; then echo "mount -t $loopFs $loopDev /loopfs" >> $RCFILE echo "echo Setting up loopback device $rootdev" >> $RCFILE echo "losetup $rootdev /loopfs$loopFile" >> $RCFILE -elif [ -n "$root_lvm" ]; then - if [ "$kernelmajor" == "2.4" ]; then + elif [ -n "$root_lvm" ]; then + if [ "$kernelmajor" == "2.4" ]; then echo "echo Scanning logical volumes" >> $RCFILE echo "vgscan" >> $RCFILE echo "echo Activating logical volumes" >> $RCFILE echo "vgchange -ay" >> $RCFILE - else + else echo "echo Making device-mapper control node" >> $RCFILE echo "mkdmnod" >> $RCFILE echo "echo Scanning logical volumes" >> $RCFILE echo "lvm vgscan --ignorelockingfailure" >> $RCFILE echo "echo Activating logical volumes" >> $RCFILE echo "lvm vgchange -ay --ignorelockingfailure $root_vg" >> $RCFILE - fi -fi + fi + fi -echo "echo Creating root device" >> $RCFILE -echo "mkrootdev /dev/root" >> $RCFILE -rootdev=/dev/root + echo "echo Creating root device" >> $RCFILE + echo "mkrootdev /dev/root" >> $RCFILE + rootdev=/dev/root -if [ -n "$initramfs" ]; then + if [ -n "$initramfs" ]; then echo "echo Mounting root filesystem" >> $RCFILE echo "mount -o $rootopts --ro -t $rootfs $rootdev /sysroot" >> $RCFILE @@ -755,7 +854,7 @@ if [ -n "$initramfs" ]; then else echo "switchroot /sysroot" >> $RCFILE fi -else + else if [ "$kernelmajor" != "2.4" ]; then echo "umount /sys" >> $RCFILE fi @@ -772,6 +871,7 @@ else echo "umount /proc" >> $RCFILE fi + fi [ -n "$UDEV_TMPFS" ] && echo "umount /initrd/dev" >> $RCFILE fi chmod +x $RCFILE