--- mkinitrd.orig 2005-09-15 18:47:02.000000000 +0530 +++ mkinitrd 2005-09-18 20:08:57.297140856 +0530 @@ -43,6 +43,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" @@ -60,6 +63,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 @@ -269,6 +273,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 @@ -287,6 +308,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 @@ -352,10 +387,14 @@ 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 - esc=$(echo $fs | sed 's,/,\\/,g') - dev=$(mount | awk "/ on ${esc} / { print \$1 }" | sed 's/[0-9]*$//' | cut -d/ -f3) + 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 + if [ `which kudzu 2>/dev/null` ]; then host=$(kudzu --probe -b scsi | gawk '/^device: '${dev}'/,/^host:/ { if (/^host/) { print $2; exit; } }') if [ -d /proc/scsi/usb-storage-${host} -o -f /proc/scsi/usb-storage/${host} ]; then @@ -379,8 +418,9 @@ 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 + modulefile=/etc/conf.modules fi if [ -f $modulefile ]; then @@ -398,12 +438,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 - findmodule -ide-disk + 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 @@ -465,6 +508,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 @@ -512,6 +556,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 @@ -577,12 +622,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 ln -s udev $MNTIMAGE/sbin/udevstart @@ -605,6 +689,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 @@ -711,7 +802,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 @@ -719,31 +818,31 @@ 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 -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 [ "$kernelmajor" != "2.4" ]; then + if [ "$kernelmajor" != "2.4" ]; then echo "umount /sys" >> $RCFILE -fi + fi -if [ -n "$initramfs" ]; then + if [ -n "$initramfs" ]; then echo "echo Mounting root filesystem" >> $RCFILE echo "mount -o $rootopts --ro -t $rootfs $rootdev /sysroot" >> $RCFILE @@ -751,8 +850,8 @@ if [ -n "$initramfs" ]; then echo "echo Switching to new root" >> $RCFILE echo "switchroot /sysroot" >> $RCFILE -else - if [ -n "$pivot" ]; then + else + if [ -n "$pivot" ]; then echo "echo 0x0100 > /proc/sys/kernel/real-root-dev" >> $RCFILE echo "echo Mounting root filesystem" >> $RCFILE @@ -760,12 +859,13 @@ else echo "pivot_root /sysroot /sysroot/initrd" >> $RCFILE echo "umount /initrd/proc" >> $RCFILE - else + else echo "umount /proc" >> $RCFILE + fi fi -fi [ -n "$UDEV_TMPFS" ] && echo "umount /initrd/dev" >> $RCFILE +fi chmod +x $RCFILE if [ -z "$initramfs" ]; then