[kexec-tools/f16: 1/2] mkdumprd: switch back to old mkdumprd and add the new one too
Cong Wang
wangcong at fedoraproject.org
Mon Aug 15 08:10:18 UTC 2011
commit 80d725561b9afaeda3493835b001e13a5e9a410c
Author: Amerigo Wang <amwang at redhat.com>
Date: Mon Aug 15 16:08:05 2011 +0800
mkdumprd: switch back to old mkdumprd and add the new one too
kdump_dracut_modules/99kdumpbase/check | 10 --
kdump_dracut_modules/99kdumpbase/install | 5 -
kdump_dracut_modules/99kdumpbase/kdump.sh | 164 ++++++++++++++++++++++
kdump_dracut_modules/99kdumpbase/module-setup.sh | 140 ++++++++++++++++++
kdump_sample_manifests/manifest.localrootfs | 9 --
kdumpctl | 17 +--
mkdumprd2 | 94 ++++++++++++
7 files changed, 399 insertions(+), 40 deletions(-)
---
diff --git a/kdump_dracut_modules/99kdumpbase/kdump.sh b/kdump_dracut_modules/99kdumpbase/kdump.sh
new file mode 100755
index 0000000..6869e6a
--- /dev/null
+++ b/kdump_dracut_modules/99kdumpbase/kdump.sh
@@ -0,0 +1,164 @@
+#!/bin/sh
+
+. /lib/dracut-lib.sh
+
+set -x
+KDUMP_PATH="/var/crash"
+CORE_COLLECTOR="makedumpfile -d 31 -c"
+DEFAULT_ACTION="dump_rootfs"
+DATEDIR=`date +%d.%m.%y-%T`
+DUMP_INSTRUCTION=""
+
+do_default_action()
+{
+ wait_for_loginit
+ $DEFAULT_ACTION
+}
+
+add_dump_code()
+{
+ if [ -z "$DUMP_INSTRUCTION" ]
+ then
+ DUMP_INSTRUCTION="$1"
+ else
+ DUMP_INSTRUCTION="$DUMP_INSTRUCTION && $1"
+ fi
+}
+
+add_to_fstab()
+{
+ local _mp
+ while read dev mp fs opts rest; do
+ if [ "$dev" = "$1" ]; then
+ _mp=$NEWROOT$mp
+ echo "$dev $NEWROOT$mp $fs ${opts},rw $rest"
+ break
+ fi
+ done < "$NEWROOT/etc/fstab" >> /etc/fstab
+ echo "$_mp"
+}
+
+to_dev_name()
+{
+ local dev="$1"
+
+ case "$dev" in
+ UUID=*)
+ dev=`blkid -U "${dev#UUID=}"`
+ ;;
+ LABEL=*)
+ dev=`blkid -L "${dev#LABEL=}"`
+ ;;
+ esac
+ echo $dev
+}
+
+dump_localfs()
+{
+ local _dev=`to_dev_name $1`
+ local _mp=`add_to_fstab $_dev`
+ if [ $_mp = "$NEWROOT/" ] || [ $_mp = "$NEWROOT" ]
+ then
+ mount -o remount,rw $_mp || return 1
+ else
+ mount $_mp || return 1
+ fi
+ mkdir -p $_mp/$KDUMP_PATH/$DATEDIR
+ $CORE_COLLECTOR /proc/vmcore $_mp/$KDUMP_PATH/$DATEDIR/vmcore || return 1
+ umount $_mp || return 1
+ return 0
+}
+
+dump_raw()
+{
+ CORE_COLLECTOR=`echo $CORE_COLLECTOR | sed -e's/\(^makedumpfile\)\(.*$\)/\1 -F \2/'`
+ $CORE_COLLECTOR /proc/vmcore | dd of=$1 bs=512 || return 1
+ return 0
+}
+
+dump_rootfs()
+{
+ mount -o remount,rw $NEWROOT/ || return 1
+ mkdir -p $NEWROOT/$KDUMP_PATH/$DATEDIR
+ $CORE_COLLECTOR /proc/vmcore $NEWROOT/$KDUMP_PATH/$DATEDIR/vmcore || return 1
+ sync
+ reboot -f
+ return 0
+}
+
+dump_nfs()
+{
+ mount -o remount,rw $NEWROOT/ || return 1
+ [ -d $NEWROOT/mnt ] || mkdir -p $NEWROOT/mnt
+ mount -o nolock -o tcp -t nfs $1 $NEWROOT/mnt/
+ mkdir -p $NEWROOT/mnt/$KDUMP_PATH/$DATEDIR || return 1
+ $CORE_COLLECTOR /proc/vmcore $NEWROOT/mnt/$KDUMP_PATH/$DATEDIR/vmcore || return 1
+ umount $NEWROOT/mnt/ || return 1
+ return 0
+}
+
+dump_ssh()
+{
+ ssh -q -o BatchMode=yes -o StrictHostKeyChecking=yes $1 mkdir -p $KDUMP_PATH/$DATEDIR || return 1
+ scp -q -o BatchMode=yes -o StrictHostKeyChecking=yes /proc/vmcore "$1:$KDUMP_PATH/$DATEDIR" || return 1
+ return 0
+}
+
+read_kdump_conf()
+{
+ local conf_file="/etc/kdump.conf"
+ if [ -f "$conf_file" ]; then
+ while read config_opt config_val;
+ do
+ case "$config_opt" in
+ ext[234]|xfs|btrfs|minix)
+ add_dump_code "dump_localfs $config_val || do_default_action"
+ ;;
+ raw)
+ add_dump_code "dump_raw $config_val || do_default_action"
+ ;;
+ path)
+ KDUMP_PATH="$config_val"
+ ;;
+ core_collector)
+ CORE_COLLECTOR="$config_val"
+ ;;
+ net)
+ if [ -n "$(echo $config_val | grep @)" ]
+ then
+ add_dump_code "dump_ssh $config_val || do_default_action"
+ else
+ add_dump_code "dump_nfs $config_val || do_default_action"
+ fi
+ ;;
+ default)
+ case $config_val in
+ shell)
+ DEFAULT_ACTION="sh -i -l"
+ ;;
+ reboot)
+ DEFAULT_ACTION="reboot -f"
+ ;;
+ halt)
+ DEFAULT_ACTION="halt -f"
+ ;;
+ poweroff)
+ DEFAULT_ACTION="poweroff -f"
+ ;;
+ esac
+ ;;
+ esac
+ done < $conf_file
+ fi
+}
+
+read_kdump_conf
+
+if [ -n "$DUMP_INSTRUCTION" ]
+then
+ eval "$DUMP_INSTRUCTION && reboot -f"
+else
+ dump_rootfs
+fi
+
+
diff --git a/kdump_dracut_modules/99kdumpbase/module-setup.sh b/kdump_dracut_modules/99kdumpbase/module-setup.sh
new file mode 100755
index 0000000..8378404
--- /dev/null
+++ b/kdump_dracut_modules/99kdumpbase/module-setup.sh
@@ -0,0 +1,140 @@
+#!/bin/bash
+
+check() {
+ [[ $debug ]] && set -x
+ #kdumpctl sets this explicitly
+ if [ -z "$IN_KDUMP" ] || [ ! -f /etc/kdump.conf ]
+ then
+ return 1
+ fi
+ return 0
+}
+
+is_lvm() { [[ $(get_fs_type /dev/block/$1) = LVM2_member ]]; }
+is_mdraid() { [[ -d "/sys/dev/block/$1/md" ]]; }
+is_btrfs() { get_fs_type /dev/block/$1 | grep -q btrfs; }
+is_mpath() {
+ [ -e /sys/dev/block/$1/dm/uuid ] || return 1
+ [[ $(cat /sys/dev/block/$1/dm/uuid) =~ ^mpath- ]] && return 0
+ return 1
+}
+is_dmraid() { get_fs_type /dev/block/$1 |grep -v linux_raid_member | \
+ grep -q _raid_member; }
+
+is_iscsi() (
+ [[ -L /sys/dev/block/$1 ]] || return
+ cd "$(readlink -f /sys/dev/block/$1)"
+ until [[ -d sys || -d iscsi_session ]]; do
+ cd ..
+ done
+ [[ -d iscsi_session ]]
+)
+
+pull_dracut_modules() {
+ local _dev=$1
+ local _is_uuid=`echo $1 | grep UUID`
+ local _is_label=`echo $1 | grep LABEL`
+
+ if [ -n "$_is_uuid" -o -n "$_is_label" ]
+ then
+ _dev=`findfs $1`
+ fi
+
+ . $dracutfunctions
+ unset MAJOR MINOR
+ eval $(udevadm info --query=env --name="$_dev" | egrep '^(MAJOR|MINOR)')
+ check_block_and_slaves is_btrfs "$MAJOR:$MINOR" && echo -n "btrfs "
+ check_block_and_slaves is_lvm "$MAJOR:$MINOR" && echo -n "lvm "
+ check_block_and_slaves is_mdraid "$MAJOR:$MINOR" && echo -n "mdraid "
+ check_block_and_slaves is_mpath "$MAJOR:$MINOR" && echo -n "multipath "
+ check_block_and_slaves is_iscsi "$MAJOR:$MINOR" && echo -n "iscsi "
+ check_block_and_slaves is_dmraid "$MAJOR:$MINOR" && echo -n "dmraid "
+ unset MAJOR MINOR
+}
+
+to_udev_name() {
+ local dev="$1"
+
+ case "$dev" in
+ UUID=*)
+ dev=`blkid -U "${dev#UUID=}"`
+ ;;
+ LABEL=*)
+ dev=`blkid -L "${dev#LABEL=}"`
+ ;;
+ esac
+ echo ${dev#/dev/}
+}
+
+add_lvm_code() {
+ local dev="/dev/$(to_udev_name $1)"
+ local lv
+ printf "lvm lvchange -ay --sysinit ">> $moddir/kdump-prepare.sh
+ lv=$(lvm lvdisplay $dev | awk '/LV Name/ {print $3}')
+ echo ${lv#/dev/} >> $moddir/kdump-prepare.sh
+}
+
+udevmatch() {
+ case "$1" in
+ UUID=????????-????-????-????-????????????|LABEL=*)
+ printf 'ENV{ID_FS_%s}=="%s"' "${1%%=*}" "${1#*=}"
+ ;;
+ UUID=*)
+ printf 'ENV{ID_FS_UUID}=="%s*"' "${1#*=}"
+ ;;
+ /dev/?*) printf 'KERNEL=="%s"' "${1#/dev/}" ;;
+ esac
+ printf ', SYMLINK+="'$(to_udev_name $1)'"\n'
+}
+
+add_udev_rules() {
+ udevmatch $1 >> $moddir/90-localfs.rules
+}
+
+gen_new_conf () {
+ if [ ! -f $2 ]
+ then
+ sed -ne '/^#/!p' /etc/kdump.conf > $2
+ fi
+ sed -i -e "s#$1#/dev/$(to_udev_name $1)#" $2
+}
+
+depends() {
+ local _deps="base shutdown"
+ while read config_opt config_val;
+ do
+ case "$config_opt" in
+ ext[234]|xfs|btrfs|minix|raw)
+ _deps="$_deps `pull_dracut_modules "$config_val"`"
+ ;;
+ esac
+ done < /etc/kdump.conf
+ echo $_deps
+ return 0
+}
+
+install() {
+ echo -n "" > $moddir/90-localfs.rules
+ printf '#!/bin/sh\n' > $moddir/kdump-prepare.sh
+ chmod +x $moddir/kdump-prepare.sh
+
+ while read config_opt config_val;
+ do
+ case "$config_opt" in
+ ext[234]|xfs|btrfs|minix|raw)
+ add_udev_rules $config_val
+ add_lvm_code $config_val
+ gen_new_conf $config_val /tmp/$$-kdump.conf
+ ;;
+ esac
+ done < /etc/kdump.conf
+
+ inst "/bin/date" "/bin/date"
+ inst "/bin/sync" "/bin/sync"
+ inst "/sbin/makedumpfile" "/sbin/makedumpfile"
+ inst "/tmp/$$-kdump.conf" "/etc/kdump.conf"
+ inst_hook pre-pivot 01 "$moddir/kdump-prepare.sh"
+ inst_hook pre-pivot 02 "$moddir/kdump.sh"
+ inst_rules "$moddir/90-localfs.rules"
+}
+
diff --git a/kdumpctl b/kdumpctl
index 05d225e..69da168 100755
--- a/kdumpctl
+++ b/kdumpctl
@@ -9,6 +9,7 @@ KDUMP_KERNELVER=""
KDUMP_COMMANDLINE=""
KEXEC_ARGS=""
KDUMP_CONFIG_FILE="/etc/kdump.conf"
+MKDUMPRD="/sbin/mkdumprd -d -f"
LOGGER="/usr/bin/logger -p info -t kdump"
@@ -45,22 +46,6 @@ function save_core()
function check_config()
{
- if [ -f /etc/kdump-adv-conf/initramfs.conf ]
- then
- $LOGGER "Using Kdump advanced configuration service"
- if [ -n "$DRACUT_CMD" ]
- then
- MKDUMPRD=$DRACUT_CMD
- else
- MKDUMPRD="dracut -f -c /etc/kdump-adv-conf/initramfs.conf"
- fi
- # We always rebuild here, since it takes longer
- # to figure out if anything has changed
- touch /etc/kdump.conf
- else
- MKDUMPRD="/sbin/mkdumprd -d -f"
- fi
-
if [ -z "$KDUMP_KERNELVER" ]; then
local running_kernel=`uname -r`
diff --git a/mkdumprd2 b/mkdumprd2
new file mode 100644
index 0000000..e2edc64
--- /dev/null
+++ b/mkdumprd2
@@ -0,0 +1,94 @@
+#!/bin/bash --norc
+# New mkdumprd
+#
+# Copyright 2011 Red Hat, Inc.
+#
+# Written by Cong Wang <amwang at redhat.com>
+#
+
+export IN_KDUMP=1
+
+conf_file="/etc/kdump.conf"
+extra_modules=""
+dracut_args="-m kdumpbase --add dash -c /dev/null"
+
+add_dracut_arg() {
+ dracut_args="$dracut_args $*"
+}
+
+add_dracut_module() {
+ add_dracut_arg "--add $1"
+}
+
+while [ $# -gt 0 ]; do
+ case $1 in
+ -d)
+ shift
+ ;;
+ --noconf)
+ conf_file=""
+ shift
+ ;;
+ --debug)
+ add_dracut_arg "-v"
+ set -x
+ shift
+ ;;
+ *)
+ break
+ ;;
+ esac
+done
+
+# $1 target device
+# $2 if this is a raw dump
+check_local() {
+ return
+}
+
+# $1 remote target
+check_remote() {
+ return
+}
+
+if [ -n "$conf_file" ]; then
+ while read config_opt config_val;
+ do
+ case "$config_opt" in
+ extra_modules)
+ extra_modules="$extra_modules $config_val"
+ ;;
+ ext[234]|xfs|btrfs|minix)
+ check_local "$config_val" 0
+ ;;
+ raw)
+ check_local "$config_val" 1
+ ;;
+ net)
+ check_remote "$config_val"
+ add_dracut_module "nfs"
+ ;;
+ core_collector)
+ add_dracut_arg "-I ${config_val% *}"
+ ;;
+ extra_bins)
+ add_dracut_arg "-I $config_val"
+ ;;
+ *)
+ if [ -n $(echo $config_opt | grep "^#.*$") ]
+ then
+ continue
+ fi
+ ;;
+ esac
+ done < $conf_file
+fi
+
+if [ -n "$extra_modules" ]
+then
+ add_dracut_arg "--add-drivers $extra_modules"
+fi
+
+dracut $dracut_args -M "$@"
+exit $?
+
More information about the scm-commits
mailing list