015dd4c67c
BZ: 817044 Harald suggested that we use --add kdumpbase instead of -m kdumpbsae. As -m means only use modules specified on the command line. I am not sure that kdump will ever know the list of modules it wants to use. It might be a good idea to let dracut decide it based on --mount option. Also start using --hostonly to make sure atleast our default dumping to root disk always works. I also noticed that with --add and --hostonly initramfs size came down. So for the time being just bring down the initramfs size. But it still looks big and this area will require more experimentation and bug fixing to make sure we are generatiing optimal size images for kdump purposes and get rid of bloat. I am just beginning to understand dracut, so expect more churn in this area down the line from me. I am posting this patch for the bz opened again F18. As it is reducing initramfs size significantly, I think it is a good idea to commit it in F17 branch also. Following is image size comparision. Dump to root disk. ------------------ vanilla compressed: 13MB hostonly compressed: 7.5MB Dump to nfs ----------- vanilla compressed: 24MB hostonly compressed: 13MB Dump over ssh ------------- vanilla compressed: 23.5 MB hostonly compressed: 12 MB Signed-off-by: Vivek Goyal <vgoyal@redhat.com> Acked-by: Dave Young <dyoung@redhat.com>
200 lines
4.1 KiB
Bash
200 lines
4.1 KiB
Bash
#!/bin/bash --norc
|
|
# New mkdumprd
|
|
#
|
|
# Copyright 2011 Red Hat, Inc.
|
|
#
|
|
# Written by Cong Wang <amwang@redhat.com>
|
|
#
|
|
|
|
export IN_KDUMP=1
|
|
|
|
conf_file="/etc/kdump.conf"
|
|
SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa"
|
|
extra_modules=""
|
|
dracut_args=("--hostonly" "--add" "kdumpbase" "--add" "dash" "--add" "fstab-sys" "--add" "kernel-modules" "-c" "/dev/null" "-I" "/sbin/makedumpfile")
|
|
|
|
add_dracut_arg() {
|
|
while [ $# -gt 0 ];
|
|
do
|
|
dracut_args+=("$1")
|
|
shift
|
|
done
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
while [ $# -gt 0 ]; do
|
|
case $1 in
|
|
-d)
|
|
shift
|
|
;;
|
|
--noconf)
|
|
conf_file=""
|
|
shift
|
|
;;
|
|
--debug)
|
|
add_dracut_arg "-v"
|
|
set -x
|
|
shift
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# 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
|
|
}
|
|
|
|
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)"
|
|
}
|
|
|
|
# $1 remote target
|
|
check_remote() {
|
|
return
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
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"
|
|
add_mount "$config_val"
|
|
if [ $? -ne 0 ]; then
|
|
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
|
|
|
|
if [ -n "$extra_modules" ]
|
|
then
|
|
add_dracut_arg "--add-drivers" "$extra_modules"
|
|
fi
|
|
|
|
dracut "${dracut_args[@]}" -M "$@"
|
|
_rc=$?
|
|
sync
|
|
exit $_rc
|
|
|