On Tue, Jul 22, 2014 at 03:17:58PM +0800, WANG Chao wrote:
Extract functions from kdump.sh, and construct kdump-lib-initramfs.sh as kdump common functions/varaibles library.
kdump-lib-initramfs.sh will include kdump-lib.sh, because it will use the functions from there. IOW, kdump-lib-initramfs.sh will be a superset of kdump-lib.sh
So after this cleanup:
- scripts running in 1st kernel only have to include kdump-lib.sh
- scripts running in 2nd kernel only have to include kdump-lib-initramfs.sh
Signed-off-by: WANG Chao chaowang@redhat.com
Acked-by: Vivek Goyal vgoyal@redhat.com
Vivek
dracut-kdump.sh | 145 ++---------------------------------------------- dracut-module-setup.sh | 1 + kdump-lib-initramfs.sh | 146 +++++++++++++++++++++++++++++++++++++++++++++++++ kexec-tools.spec | 2 + 4 files changed, 154 insertions(+), 140 deletions(-) create mode 100755 kdump-lib-initramfs.sh
diff --git a/dracut-kdump.sh b/dracut-kdump.sh index cb13d92..08f4322 100755 --- a/dracut-kdump.sh +++ b/dracut-kdump.sh @@ -2,30 +2,14 @@
exec &> /dev/console . /lib/dracut-lib.sh -. /lib/kdump-lib.sh +. /lib/kdump-lib-initramfs.sh
if [ -f "$initdir/lib/dracut/no-emergency-shell" ]; then rm -f -- $initdir/lib/dracut/no-emergency-shell fi
set -o pipefail -KDUMP_PATH="/var/crash" -CORE_COLLECTOR="" -DEFAULT_CORE_COLLECTOR="makedumpfile -l --message-level 1 -d 31" -DMESG_COLLECTOR="/sbin/vmcore-dmesg" -DEFAULT_ACTION="reboot -f" -DATEDIR=`date +%Y.%m.%d-%T` -HOST_IP='127.0.0.1' -DUMP_INSTRUCTION="" -SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa" -KDUMP_SCRIPT_DIR="/kdumpscripts" -DD_BLKSIZE=512 -FINAL_ACTION="reboot -f" DUMP_RETVAL=0 -conf_file="/etc/kdump.conf" -KDUMP_PRE="" -KDUMP_POST="" -MOUNTS=""
export PATH=$PATH:$KDUMP_SCRIPT_DIR
@@ -43,27 +27,6 @@ do_dump() return $_ret }
-do_umount() -{
- if [ -n "$MOUNTS" ]; then
for mount in $MOUNTS; doismounted $mount && umount -R $mountdone- fi
-}
-do_final_action() -{
- do_umount
- eval $FINAL_ACTION
-}
-do_default_action() -{
- wait_for_loginit
- eval $DEFAULT_ACTION
-}
do_kdump_pre() { if [ -n "$KDUMP_PRE" ]; then @@ -83,39 +46,6 @@ add_dump_code() DUMP_INSTRUCTION=$1 }
-# dump_fs <mount point| device> -dump_fs() -{
- local _dev=$(findmnt -k -f -n -r -o SOURCE $1)
- local _mp=$(findmnt -k -f -n -r -o TARGET $1)
- echo "kdump: dump target is $_dev"
- if [ -z "$_mp" ]; then
echo "kdump: error: Dump target $_dev is not mounted."return 1- fi
- MOUNTS="$MOUNTS $_mp"
- # Remove -F in makedumpfile case. We don't want a flat format dump here.
- [[ $CORE_COLLECTOR = *makedumpfile* ]] && CORE_COLLECTOR=`echo $CORE_COLLECTOR | sed -e "s/-F//g"`
- echo "kdump: saving to $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/"
- mount -o remount,rw $_mp || return 1
- mkdir -p $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR || return 1
- save_vmcore_dmesg_fs ${DMESG_COLLECTOR} "$_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/"
- echo "kdump: saving vmcore"
- $CORE_COLLECTOR /proc/vmcore $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete || return 1
- mv $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore
- sync
- echo "kdump: saving vmcore complete"
- return 0
-}
dump_raw() { local _raw=$1 @@ -165,21 +95,6 @@ dump_ssh() return 0 }
-save_vmcore_dmesg_fs() {
- local _dmesg_collector=$1
- local _path=$2
- echo "kdump: saving vmcore-dmesg.txt"
- $_dmesg_collector /proc/vmcore > ${_path}/vmcore-dmesg-incomplete.txt
- _exitcode=$?
- if [ $_exitcode -eq 0 ]; then
mv ${_path}/vmcore-dmesg-incomplete.txt ${_path}/vmcore-dmesg.txtecho "kdump: saving vmcore-dmesg.txt complete"- else
echo "kdump: saving vmcore-dmesg.txt failed"- fi
-}
save_vmcore_dmesg_ssh() { local _dmesg_collector=$1 local _path=$2 @@ -198,7 +113,6 @@ save_vmcore_dmesg_ssh() { fi }
get_host_ip() { local _host @@ -218,61 +132,12 @@ get_host_ip()
read_kdump_conf() {
- if [ ! -f "$conf_file" ]; then
echo "kdump: $conf_file not found"
- if [ ! -f "$KDUMP_CONF" ]; then
fiecho "kdump: $KDUMP_CONF not found" return
- # first get the necessary variables
- while read config_opt config_val;
- do
# remove inline comments after the end of a directive.config_val=$(strip_comments $config_val)case "$config_opt" inpath)KDUMP_PATH="$config_val";;core_collector)[ -n "$config_val" ] && CORE_COLLECTOR="$config_val";;sshkey)if [ -f "$config_val" ]; thenSSH_KEY_LOCATION=$config_valfi;;kdump_pre)KDUMP_PRE="$config_val";;kdump_post)KDUMP_POST="$config_val";;fence_kdump_args)FENCE_KDUMP_ARGS="$config_val";;fence_kdump_nodes)FENCE_KDUMP_NODES="$config_val";;default)case $config_val inshell)DEFAULT_ACTION="_emergency_shell kdump";;reboot)DEFAULT_ACTION="do_umount; reboot -f";;halt)DEFAULT_ACTION="do_umount; halt -f";;poweroff)DEFAULT_ACTION="do_umount; poweroff -f";;dump_to_rootfs)DEFAULT_ACTION="dump_fs $NEWROOT";;esac;;esac- done < $conf_file
get_kdump_confs
# rescan for add code for dump target while read config_opt config_val;
@@ -290,7 +155,7 @@ read_kdump_conf() add_dump_code "dump_ssh $SSH_KEY_LOCATION $config_val" ;; esac
- done < $conf_file
- done < $KDUMP_CONF
}
fence_kdump_notify() diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh index 87ad072..84bf975 100755 --- a/dracut-module-setup.sh +++ b/dracut-module-setup.sh @@ -555,6 +555,7 @@ install() { inst "/sbin/vmcore-dmesg" "/sbin/vmcore-dmesg" inst_hook pre-pivot 9999 "$moddir/kdump.sh" inst "/lib/kdump/kdump-lib.sh" "/lib/kdump-lib.sh"
inst "/lib/kdump/kdump-lib-initramfs.sh" "/lib/kdump-lib-initramfs.sh"
# Check for all the devices and if any device is iscsi, bring up iscsi # target. Ideally all this should be pushed into dracut iscsi module
diff --git a/kdump-lib-initramfs.sh b/kdump-lib-initramfs.sh new file mode 100755 index 0000000..e2807c7 --- /dev/null +++ b/kdump-lib-initramfs.sh @@ -0,0 +1,146 @@ +# These variables and functions are useful in 2nd kernel
+. /lib/dracut-lib.sh +. /lib/kdump-lib.sh
+KDUMP_PATH="/var/crash" +CORE_COLLECTOR="" +DEFAULT_CORE_COLLECTOR="makedumpfile -l --message-level 1 -d 31" +DMESG_COLLECTOR="/sbin/vmcore-dmesg" +DEFAULT_ACTION="reboot -f" +DATEDIR=`date +%Y.%m.%d-%T` +HOST_IP='127.0.0.1' +DUMP_INSTRUCTION="" +SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa" +KDUMP_SCRIPT_DIR="/kdumpscripts" +DD_BLKSIZE=512 +FINAL_ACTION="reboot -f" +KDUMP_CONF="/etc/kdump.conf" +KDUMP_PRE="" +KDUMP_POST="" +NEWROOT="/sysroot" +MOUNTS=""
+get_kdump_confs() +{
- local config_opt config_val
- while read config_opt config_val;
- do
# remove inline comments after the end of a directive.config_val=$(strip_comments $config_val)case "$config_opt" inpath)KDUMP_PATH="$config_val";;core_collector)[ -n "$config_val" ] && CORE_COLLECTOR="$config_val";;sshkey)if [ -f "$config_val" ]; thenSSH_KEY_LOCATION=$config_valfi;;kdump_pre)KDUMP_PRE="$config_val";;kdump_post)KDUMP_POST="$config_val";;fence_kdump_args)FENCE_KDUMP_ARGS="$config_val";;fence_kdump_nodes)FENCE_KDUMP_NODES="$config_val";;default)case $config_val inshell)DEFAULT_ACTION="_emergency_shell kdump";;reboot)DEFAULT_ACTION="do_umount; reboot -f";;halt)DEFAULT_ACTION="do_umount; halt -f";;poweroff)DEFAULT_ACTION="do_umount; poweroff -f";;dump_to_rootfs)DEFAULT_ACTION="dump_fs $NEWROOT";;esac;;esac- done < $KDUMP_CONF
+}
+# dump_fs <mount point| device> +dump_fs() +{
- local _dev=$(findmnt -k -f -n -r -o SOURCE $1)
- local _mp=$(findmnt -k -f -n -r -o TARGET $1)
- echo "kdump: dump target is $_dev"
- if [ -z "$_mp" ]; then
echo "kdump: error: Dump target $_dev is not mounted."return 1- fi
- MOUNTS="$MOUNTS $_mp"
- # Remove -F in makedumpfile case. We don't want a flat format dump here.
- [[ $CORE_COLLECTOR = *makedumpfile* ]] && CORE_COLLECTOR=`echo $CORE_COLLECTOR | sed -e "s/-F//g"`
- echo "kdump: saving to $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/"
- mount -o remount,rw $_mp || return 1
- mkdir -p $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR || return 1
- save_vmcore_dmesg_fs ${DMESG_COLLECTOR} "$_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/"
- echo "kdump: saving vmcore"
- $CORE_COLLECTOR /proc/vmcore $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete || return 1
- mv $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore
- sync
- echo "kdump: saving vmcore complete"
+}
+save_vmcore_dmesg_fs() {
- local _dmesg_collector=$1
- local _path=$2
- echo "kdump: saving vmcore-dmesg.txt"
- $_dmesg_collector /proc/vmcore > ${_path}/vmcore-dmesg-incomplete.txt
- _exitcode=$?
- if [ $_exitcode -eq 0 ]; then
mv ${_path}/vmcore-dmesg-incomplete.txt ${_path}/vmcore-dmesg.txtecho "kdump: saving vmcore-dmesg.txt complete"- else
echo "kdump: saving vmcore-dmesg.txt failed"- fi
+}
+do_umount() +{
- if [ -n "$MOUNTS" ]; then
for mount in $MOUNTS; doismounted $mount && umount -R $mountdone- fi
+}
+do_default_action() +{
- wait_for_loginit
- eval $DEFAULT_ACTION
+}
+do_final_action() +{
- do_umount
- eval $FINAL_ACTION
+} diff --git a/kexec-tools.spec b/kexec-tools.spec index 25dae2b..a613b43 100644 --- a/kexec-tools.spec +++ b/kexec-tools.spec @@ -27,6 +27,7 @@ Source20: kdump-lib.sh Source21: kdump-in-cluster-environment.txt Source22: kdump-dep-generator.sh Source23: kdump-anaconda-addon-20140721.tar.gz +Source24: kdump-lib-initramfs.sh
####################################### # These are sources for mkdumpramfs @@ -178,6 +179,7 @@ install -m 644 kexec/kexec.8 $RPM_BUILD_ROOT%{_mandir}/man8/kexec.8 install -m 755 %{SOURCE11} $RPM_BUILD_ROOT%{_datadir}/kdump/firstboot_kdump.py install -m 644 %{SOURCE12} $RPM_BUILD_ROOT%{_mandir}/man8/mkdumprd.8 install -m 755 %{SOURCE20} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-lib.sh +install -m 755 %{SOURCE24} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-lib-initramfs.sh %ifnarch s390x # For s390x the ELF header is created in the kdump kernel and therefore kexec
# udev rules are not required
1.9.3