kexec-tools/mkdumprd

180 lines
3.9 KiB
Plaintext
Raw Normal View History

2006-07-20 03:36:18 +00:00
#!/bin/bash --norc
2011-07-21 10:51:33 +00:00
# New mkdumprd
2006-07-20 03:36:18 +00:00
#
2011-07-21 10:51:33 +00:00
# Copyright 2011 Red Hat, Inc.
2006-07-20 03:36:18 +00:00
#
2011-07-21 10:51:33 +00:00
# Written by Cong Wang <amwang@redhat.com>
2006-07-20 03:36:18 +00:00
#
2011-07-21 10:51:33 +00:00
export IN_KDUMP=1
2006-07-20 03:36:18 +00:00
2011-07-21 10:51:33 +00:00
conf_file="/etc/kdump.conf"
SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa"
2011-07-21 10:51:33 +00:00
extra_modules=""
dracut_args=("--hostonly" "--add" "kdumpbase" "--add" "fstab-sys" "--add" "kernel-modules" "-c" "/dev/null" "-I" "/sbin/makedumpfile" "-o" "plymouth")
2006-07-20 03:36:18 +00:00
2011-07-21 10:51:33 +00:00
add_dracut_arg() {
while [ $# -gt 0 ];
do
dracut_args+=("$1")
shift
done
2006-07-20 03:36:18 +00:00
}
add_dracut_module() {
add_dracut_arg "--add" "$1"
}
add_dracut_mount() {
add_dracut_arg "--mount" "$1"
}
add_dracut_sshkey() {
add_dracut_arg "--sshkey" "$1"
}
#Function: get_raw_size
#$1=dump target
get_raw_size() {
echo -n $(fdisk -s "$1")
}
#Function: check_size
#$1: dump type string ('raw', 'local', 'ssh', 'nfs')
#$2: dump target
check_size() {
local avail memtotal
memtotal=$(awk '/MemTotal/{print $2}' /proc/meminfo)
case "$1" in
raw)
avail=$(get_raw_size "$2")
;;
*)
return
esac
if [ $avail -lt $memtotal ]; then
echo "Warning: There is not enough space to save a vmcore."
echo " The size of $2 should be much greater than $memtotal kilo bytes."
fi
}
# Generic substring function. If $2 is in $1, return 0.
strstr() { [[ $1 =~ $2 ]]; }
to_dev_name() {
local dev="$1"
case "$dev" in
UUID=*)
dev=`blkid -U "${dev#UUID=}"`
;;
LABEL=*)
dev=`blkid -L "${dev#LABEL=}"`
;;
esac
echo $dev
}
2012-01-25 04:18:51 +00:00
get_rootdev() {
mount | grep 'on / ' | grep -v rootfs | awk '{print $1}'
}
to_mount() {
local _dev=$(to_dev_name $1)
echo "$(grep "$_dev" /proc/mounts | cut -d' ' -f1-4)"
2006-07-20 03:36:18 +00:00
}
2011-07-21 10:51:33 +00:00
# $1 remote target
check_remote() {
2011-07-21 10:51:33 +00:00
return
2006-07-20 03:36:18 +00:00
}
2012-01-25 08:58:35 +00:00
add_mount() {
local _dev=$(to_dev_name "$1")
local _mnt=$(to_mount "$1")
if [ "$_dev" = "$(get_rootdev)" ]; then
:
elif [ -n "$_mnt" ]; then
add_dracut_mount "$_mnt"
else
return 1
fi
return 0
}
2012-01-25 04:18:51 +00:00
add_dracut_mount "$(to_mount "$(get_rootdev)")"
# firstly get right SSH_KEY_LOCATION
keyfile=$(awk '/sshkey/ {print $2}' $conf_file)
if [ -f "$keyfile" ]; then
# canonicalize the path
SSH_KEY_LOCATION=$(/usr/bin/readlink -m $keyfile)
fi
while read config_opt config_val;
do
case "$config_opt" in
extra_modules)
extra_modules="$extra_modules $config_val"
;;
ext[234]|xfs|btrfs|minix)
add_mount "$config_val"
if [ $? -ne 0 ]; then
echo "Dump target $config_val is probably not mounted."
exit 1
fi
;;
raw)
#checking raw disk writable
dd if=$config_val count=1 of=/dev/null > /dev/null 2>&1 || {
echo "Bad raw disk $config_val"
exit 1
}
check_size raw $config_val
;;
net)
check_remote "$config_val"
if strstr "$config_val" "@";
then
add_dracut_module "ssh-client"
add_dracut_sshkey "$SSH_KEY_LOCATION"
else
add_dracut_module "nfs"
2012-01-25 08:58:35 +00:00
add_mount "$config_val"
if [ $? -ne 0 ]; then
2012-01-25 04:18:51 +00:00
echo "Dump target $config_val is probably not mounted."
exit 1
fi
fi
;;
core_collector)
if grep -q "^raw" $conf_file && [ "${config_val%% *}" != "makedumpfile" ]; then
echo "Warning: specifying a non-makedumpfile core collector, you will have to recover the vmcore manually."
fi
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
2006-07-20 03:36:18 +00:00
2011-07-21 10:51:33 +00:00
if [ -n "$extra_modules" ]
then
2012-01-10 14:34:47 +00:00
add_dracut_arg "--add-drivers" "$extra_modules"
fi
dracut "${dracut_args[@]}" -M "$@"
2012-01-25 04:18:51 +00:00
_rc=$?
sync
2012-01-25 04:18:51 +00:00
exit $_rc