[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