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
|
|
|
#
|
|
|
|
|
2021-09-08 09:20:51 +00:00
|
|
|
if [[ -f /etc/sysconfig/kdump ]]; then
|
2020-10-27 09:04:22 +00:00
|
|
|
. /etc/sysconfig/kdump
|
|
|
|
fi
|
|
|
|
|
2016-11-17 04:51:12 +00:00
|
|
|
[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
|
|
|
|
. $dracutbasedir/dracut-functions.sh
|
2013-09-24 13:33:27 +00:00
|
|
|
. /lib/kdump/kdump-lib.sh
|
2021-01-19 12:10:28 +00:00
|
|
|
. /lib/kdump/kdump-logger.sh
|
2011-07-21 10:51:33 +00:00
|
|
|
export IN_KDUMP=1
|
2006-07-20 03:36:18 +00:00
|
|
|
|
2020-10-27 09:04:22 +00:00
|
|
|
#initiate the kdump logger
|
2021-09-08 09:23:16 +00:00
|
|
|
if ! dlog_init; then
|
2020-10-27 09:04:22 +00:00
|
|
|
echo "failed to initiate the kdump logger."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2022-03-25 14:47:01 +00:00
|
|
|
SSH_KEY_LOCATION=$DEFAULT_SSHKEY
|
2020-03-08 08:41:10 +00:00
|
|
|
SAVE_PATH=$(get_save_path)
|
2019-11-20 14:58:10 +00:00
|
|
|
|
|
|
|
extra_modules=""
|
2023-04-27 16:04:45 +00:00
|
|
|
dracut_args=(--add kdumpbase --quiet --hostonly --hostonly-cmdline --hostonly-i18n --hostonly-mode strict --hostonly-nics '' --aggressive-strip -o "plymouth resume ifcfg earlykdump")
|
2015-04-10 08:18:57 +00:00
|
|
|
|
2021-08-17 18:04:45 +00:00
|
|
|
MKDUMPRD_TMPDIR="$(mktemp -d -t mkdumprd.XXXXXX)"
|
mkdumprd: generate usable kdump initramfs even target is not mounted
Currently kexec-tools always depend on dump target to be mounted, which
caused some inconvenience for setup.
So for user configured target, allow kdump to start and build initramfs
even if target is not mounted.
When a mounted user configured target is used, the behavior is not
changed.
When a unmounted user configured target is used, mkdumprd will look for
corresponding mount info in fstab, and a entry with noauto option is
founded, mkdumprd will try to mount it inplace with optoins specified
in fstab and do basic checks on the device, then umount it.
If there is no fstab entry, mkdumprd will try to mount it in temporary
path with defaults option, do same basic check and umount it.
If there is a fstab entry but "noauto" option is not used, then there
must be some reason that the target device is not mounted, mkdumprd will
error out.
When path based target is used, there is no behavior change.
Signed-off-by: Kairui Song <kasong@redhat.com>
Acked-by: Pingfan Liu <piliu@redhat.com>
2020-05-12 10:47:19 +00:00
|
|
|
[ -d "$MKDUMPRD_TMPDIR" ] || perror_exit "dracut: mktemp -p -d -t dracut.XXXXXX failed."
|
2021-08-17 18:04:45 +00:00
|
|
|
MKDUMPRD_TMPMNT="$MKDUMPRD_TMPDIR/target"
|
mkdumprd: generate usable kdump initramfs even target is not mounted
Currently kexec-tools always depend on dump target to be mounted, which
caused some inconvenience for setup.
So for user configured target, allow kdump to start and build initramfs
even if target is not mounted.
When a mounted user configured target is used, the behavior is not
changed.
When a unmounted user configured target is used, mkdumprd will look for
corresponding mount info in fstab, and a entry with noauto option is
founded, mkdumprd will try to mount it inplace with optoins specified
in fstab and do basic checks on the device, then umount it.
If there is no fstab entry, mkdumprd will try to mount it in temporary
path with defaults option, do same basic check and umount it.
If there is a fstab entry but "noauto" option is not used, then there
must be some reason that the target device is not mounted, mkdumprd will
error out.
When path based target is used, there is no behavior change.
Signed-off-by: Kairui Song <kasong@redhat.com>
Acked-by: Pingfan Liu <piliu@redhat.com>
2020-05-12 10:47:19 +00:00
|
|
|
|
|
|
|
trap '
|
|
|
|
ret=$?;
|
|
|
|
is_mounted $MKDUMPRD_TMPMNT && umount -f $MKDUMPRD_TMPMNT;
|
|
|
|
[[ -d $MKDUMPRD_TMPDIR ]] && rm --one-file-system -rf -- "$MKDUMPRD_TMPDIR";
|
|
|
|
exit $ret;
|
|
|
|
' EXIT
|
|
|
|
|
|
|
|
# clean up after ourselves no matter how we die.
|
|
|
|
trap 'exit 1;' SIGINT
|
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
add_dracut_arg()
|
|
|
|
{
|
|
|
|
dracut_args+=("$@")
|
2006-07-20 03:36:18 +00:00
|
|
|
}
|
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
add_dracut_mount()
|
|
|
|
{
|
|
|
|
add_dracut_arg "--mount" "$1"
|
2011-08-01 09:19:24 +00:00
|
|
|
}
|
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
add_dracut_sshkey()
|
|
|
|
{
|
|
|
|
add_dracut_arg "--sshkey" "$1"
|
2012-02-22 03:16:09 +00:00
|
|
|
}
|
|
|
|
|
2013-03-05 08:07:36 +00:00
|
|
|
# caller should ensure $1 is valid and mounted in 1st kernel
|
2021-09-13 18:25:40 +00:00
|
|
|
to_mount()
|
|
|
|
{
|
|
|
|
local _target=$1 _fstype=$2 _options=$3 _sed_cmd _new_mntpoint _pdev
|
|
|
|
|
|
|
|
_new_mntpoint=$(get_kdump_mntpoint_from_target "$_target")
|
|
|
|
_fstype="${_fstype:-$(get_fs_type_from_target "$_target")}"
|
|
|
|
_options="${_options:-$(get_mntopt_from_target "$_target")}"
|
|
|
|
_options="${_options:-defaults}"
|
|
|
|
|
|
|
|
if [[ $_fstype == "nfs"* ]]; then
|
|
|
|
_pdev=$_target
|
2021-10-26 14:03:28 +00:00
|
|
|
_sed_cmd+='s/,\(mount\)\?addr=[^,]*//g;'
|
|
|
|
_sed_cmd+='s/,\(mount\)\?proto=[^,]*//g;'
|
2021-09-13 18:25:40 +00:00
|
|
|
_sed_cmd+='s/,clientaddr=[^,]*//;'
|
|
|
|
else
|
|
|
|
# for non-nfs _target converting to use udev persistent name
|
|
|
|
_pdev="$(kdump_get_persistent_dev "$_target")"
|
|
|
|
if [[ -z $_pdev ]]; then
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
# mount fs target as rw in 2nd kernel
|
|
|
|
_sed_cmd+='s/\(^\|,\)ro\($\|,\)/\1rw\2/g;'
|
|
|
|
# with 'noauto' in fstab nfs and non-root disk mount will fail in 2nd
|
|
|
|
# kernel, filter it out here.
|
|
|
|
_sed_cmd+='s/\(^\|,\)noauto\($\|,\)/\1/g;'
|
|
|
|
# drop nofail or nobootwait
|
|
|
|
_sed_cmd+='s/\(^\|,\)nofail\($\|,\)/\1/g;'
|
|
|
|
_sed_cmd+='s/\(^\|,\)nobootwait\($\|,\)/\1/g;'
|
|
|
|
|
|
|
|
_options=$(echo "$_options" | sed "$_sed_cmd")
|
|
|
|
|
|
|
|
echo "$_pdev $_new_mntpoint $_fstype $_options"
|
2012-06-26 09:21:54 +00:00
|
|
|
}
|
|
|
|
|
2012-06-26 09:21:53 +00:00
|
|
|
#Function: get_ssh_size
|
|
|
|
#$1=dump target
|
2013-12-24 09:37:01 +00:00
|
|
|
#called from while loop and shouldn't read from stdin, so we're using "ssh -n"
|
2021-09-13 18:25:40 +00:00
|
|
|
get_ssh_size()
|
|
|
|
{
|
|
|
|
local _out
|
|
|
|
local _opt=("-i" "$SSH_KEY_LOCATION" "-o" "BatchMode=yes" "-o" "StrictHostKeyChecking=yes")
|
2021-08-04 09:15:42 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
if ! _out=$(ssh -q -n "${_opt[@]}" "$1" "df" "--output=avail" "$SAVE_PATH"); then
|
|
|
|
perror_exit "checking remote ssh server available size failed."
|
|
|
|
fi
|
2014-03-13 06:09:15 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
echo -n "$_out" | tail -1
|
2012-06-26 09:21:53 +00:00
|
|
|
}
|
|
|
|
|
2013-06-13 08:49:38 +00:00
|
|
|
#mkdir if save path does not exist on ssh dump target
|
|
|
|
#$1=ssh dump target
|
2020-03-09 12:38:40 +00:00
|
|
|
#caller should ensure write permission on $1:$SAVE_PATH
|
2013-12-24 09:37:01 +00:00
|
|
|
#called from while loop and shouldn't read from stdin, so we're using "ssh -n"
|
2013-06-13 08:49:38 +00:00
|
|
|
mkdir_save_path_ssh()
|
|
|
|
{
|
2021-09-13 18:25:40 +00:00
|
|
|
local _opt _dir
|
|
|
|
_opt=(-i "$SSH_KEY_LOCATION" -o BatchMode=yes -o StrictHostKeyChecking=yes)
|
|
|
|
ssh -qn "${_opt[@]}" "$1" mkdir -p "$SAVE_PATH" &> /dev/null ||
|
|
|
|
perror_exit "mkdir failed on $1:$SAVE_PATH"
|
2013-06-13 08:49:38 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
# check whether user has write permission on $1:$SAVE_PATH
|
|
|
|
_dir=$(ssh -qn "${_opt[@]}" "$1" mktemp -dqp "$SAVE_PATH" 2> /dev/null) ||
|
|
|
|
perror_exit "Could not create temporary directory on $1:$SAVE_PATH. Make sure user has write permission on destination"
|
|
|
|
ssh -qn "${_opt[@]}" "$1" rmdir "$_dir"
|
2013-06-13 08:49:38 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
return 0
|
2013-06-13 08:49:38 +00:00
|
|
|
}
|
|
|
|
|
2012-11-27 04:48:56 +00:00
|
|
|
#Function: get_fs_size
|
|
|
|
#$1=dump target
|
2021-09-13 18:25:40 +00:00
|
|
|
get_fs_size()
|
|
|
|
{
|
|
|
|
df --output=avail "$(get_mntpoint_from_target "$1")/$SAVE_PATH" | tail -1
|
2012-06-26 09:21:54 +00:00
|
|
|
}
|
|
|
|
|
2012-04-28 10:01:18 +00:00
|
|
|
#Function: get_raw_size
|
|
|
|
#$1=dump target
|
2021-09-13 18:25:40 +00:00
|
|
|
get_raw_size()
|
|
|
|
{
|
|
|
|
fdisk -s "$1"
|
2012-04-28 10:01:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#Function: check_size
|
2012-06-26 09:21:54 +00:00
|
|
|
#$1: dump type string ('raw', 'fs', 'ssh')
|
2012-04-28 10:01:18 +00:00
|
|
|
#$2: dump target
|
2021-09-13 18:25:40 +00:00
|
|
|
check_size()
|
|
|
|
{
|
|
|
|
local avail memtotal
|
|
|
|
|
|
|
|
memtotal=$(awk '/MemTotal/{print $2}' /proc/meminfo)
|
|
|
|
case "$1" in
|
|
|
|
raw)
|
|
|
|
avail=$(get_raw_size "$2")
|
|
|
|
;;
|
|
|
|
ssh)
|
|
|
|
avail=$(get_ssh_size "$2")
|
|
|
|
;;
|
|
|
|
fs)
|
|
|
|
avail=$(get_fs_size "$2")
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
return
|
|
|
|
;;
|
|
|
|
esac || perror_exit "Check dump target size failed"
|
|
|
|
|
|
|
|
if [[ $avail -lt $memtotal ]]; then
|
|
|
|
dwarn "Warning: There might not be enough space to save a vmcore."
|
|
|
|
dwarn " The size of $2 should be greater than $memtotal kilo bytes."
|
|
|
|
fi
|
2012-04-28 10:01:18 +00:00
|
|
|
}
|
|
|
|
|
mkdumprd: generate usable kdump initramfs even target is not mounted
Currently kexec-tools always depend on dump target to be mounted, which
caused some inconvenience for setup.
So for user configured target, allow kdump to start and build initramfs
even if target is not mounted.
When a mounted user configured target is used, the behavior is not
changed.
When a unmounted user configured target is used, mkdumprd will look for
corresponding mount info in fstab, and a entry with noauto option is
founded, mkdumprd will try to mount it inplace with optoins specified
in fstab and do basic checks on the device, then umount it.
If there is no fstab entry, mkdumprd will try to mount it in temporary
path with defaults option, do same basic check and umount it.
If there is a fstab entry but "noauto" option is not used, then there
must be some reason that the target device is not mounted, mkdumprd will
error out.
When path based target is used, there is no behavior change.
Signed-off-by: Kairui Song <kasong@redhat.com>
Acked-by: Pingfan Liu <piliu@redhat.com>
2020-05-12 10:47:19 +00:00
|
|
|
check_save_path_fs()
|
|
|
|
{
|
2021-09-13 18:25:40 +00:00
|
|
|
local _path=$1
|
mkdumprd: generate usable kdump initramfs even target is not mounted
Currently kexec-tools always depend on dump target to be mounted, which
caused some inconvenience for setup.
So for user configured target, allow kdump to start and build initramfs
even if target is not mounted.
When a mounted user configured target is used, the behavior is not
changed.
When a unmounted user configured target is used, mkdumprd will look for
corresponding mount info in fstab, and a entry with noauto option is
founded, mkdumprd will try to mount it inplace with optoins specified
in fstab and do basic checks on the device, then umount it.
If there is no fstab entry, mkdumprd will try to mount it in temporary
path with defaults option, do same basic check and umount it.
If there is a fstab entry but "noauto" option is not used, then there
must be some reason that the target device is not mounted, mkdumprd will
error out.
When path based target is used, there is no behavior change.
Signed-off-by: Kairui Song <kasong@redhat.com>
Acked-by: Pingfan Liu <piliu@redhat.com>
2020-05-12 10:47:19 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
if [[ ! -d $_path ]]; then
|
|
|
|
perror_exit "Dump path $_path does not exist."
|
|
|
|
fi
|
mkdumprd: generate usable kdump initramfs even target is not mounted
Currently kexec-tools always depend on dump target to be mounted, which
caused some inconvenience for setup.
So for user configured target, allow kdump to start and build initramfs
even if target is not mounted.
When a mounted user configured target is used, the behavior is not
changed.
When a unmounted user configured target is used, mkdumprd will look for
corresponding mount info in fstab, and a entry with noauto option is
founded, mkdumprd will try to mount it inplace with optoins specified
in fstab and do basic checks on the device, then umount it.
If there is no fstab entry, mkdumprd will try to mount it in temporary
path with defaults option, do same basic check and umount it.
If there is a fstab entry but "noauto" option is not used, then there
must be some reason that the target device is not mounted, mkdumprd will
error out.
When path based target is used, there is no behavior change.
Signed-off-by: Kairui Song <kasong@redhat.com>
Acked-by: Pingfan Liu <piliu@redhat.com>
2020-05-12 10:47:19 +00:00
|
|
|
}
|
|
|
|
|
2021-02-20 03:55:52 +00:00
|
|
|
mount_failure()
|
|
|
|
{
|
2021-09-13 18:25:40 +00:00
|
|
|
local _target=$1
|
|
|
|
local _mnt=$2
|
|
|
|
local _fstype=$3
|
|
|
|
local msg="Failed to mount $_target"
|
2021-02-20 03:55:52 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
if [[ -n $_mnt ]]; then
|
|
|
|
msg="$msg on $_mnt"
|
|
|
|
fi
|
2021-02-20 03:55:52 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
msg="$msg for kdump preflight check."
|
2021-02-20 03:55:52 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
if [[ $_fstype == "nfs" ]]; then
|
|
|
|
msg="$msg Please make sure nfs-utils has been installed."
|
|
|
|
fi
|
2021-02-20 03:55:52 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
perror_exit "$msg"
|
2021-02-20 03:55:52 +00:00
|
|
|
}
|
|
|
|
|
mkdumprd: generate usable kdump initramfs even target is not mounted
Currently kexec-tools always depend on dump target to be mounted, which
caused some inconvenience for setup.
So for user configured target, allow kdump to start and build initramfs
even if target is not mounted.
When a mounted user configured target is used, the behavior is not
changed.
When a unmounted user configured target is used, mkdumprd will look for
corresponding mount info in fstab, and a entry with noauto option is
founded, mkdumprd will try to mount it inplace with optoins specified
in fstab and do basic checks on the device, then umount it.
If there is no fstab entry, mkdumprd will try to mount it in temporary
path with defaults option, do same basic check and umount it.
If there is a fstab entry but "noauto" option is not used, then there
must be some reason that the target device is not mounted, mkdumprd will
error out.
When path based target is used, there is no behavior change.
Signed-off-by: Kairui Song <kasong@redhat.com>
Acked-by: Pingfan Liu <piliu@redhat.com>
2020-05-12 10:47:19 +00:00
|
|
|
check_user_configured_target()
|
|
|
|
{
|
2021-09-13 18:25:40 +00:00
|
|
|
local _target=$1 _cfg_fs_type=$2 _mounted
|
|
|
|
local _mnt _opt _fstype
|
|
|
|
|
|
|
|
_mnt=$(get_mntpoint_from_target "$_target")
|
|
|
|
_opt=$(get_mntopt_from_target "$_target")
|
|
|
|
_fstype=$(get_fs_type_from_target "$_target")
|
|
|
|
|
|
|
|
if [[ -n $_fstype ]]; then
|
|
|
|
# In case of nfs4, nfs should be used instead, nfs* options is deprecated in kdump.conf
|
|
|
|
[[ $_fstype == "nfs"* ]] && _fstype=nfs
|
|
|
|
|
|
|
|
if [[ -n $_cfg_fs_type ]] && [[ $_fstype != "$_cfg_fs_type" ]]; then
|
|
|
|
perror_exit "\"$_target\" have a wrong type config \"$_cfg_fs_type\", expected \"$_fstype\""
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
_fstype="$_cfg_fs_type"
|
|
|
|
_fstype="$_cfg_fs_type"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# For noauto mount, mount it inplace with default value.
|
|
|
|
# Else use the temporary target directory
|
|
|
|
if [[ -n $_mnt ]]; then
|
|
|
|
if ! is_mounted "$_mnt"; then
|
|
|
|
if [[ $_opt == *",noauto"* ]]; then
|
|
|
|
mount "$_mnt" || mount_failure "$_target" "$_mnt" "$_fstype"
|
|
|
|
_mounted=$_mnt
|
|
|
|
else
|
|
|
|
perror_exit "Dump target \"$_target\" is neither mounted nor configured as \"noauto\""
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
_mnt=$MKDUMPRD_TMPMNT
|
|
|
|
mkdir -p "$_mnt"
|
|
|
|
mount "$_target" "$_mnt" -t "$_fstype" -o defaults || mount_failure "$_target" "" "$_fstype"
|
|
|
|
_mounted=$_mnt
|
|
|
|
fi
|
|
|
|
|
|
|
|
# For user configured target, use $SAVE_PATH as the dump path within the target
|
|
|
|
if [[ ! -d "$_mnt/$SAVE_PATH" ]]; then
|
2022-09-06 03:15:15 +00:00
|
|
|
perror_exit "Dump path \"$SAVE_PATH\" does not exist in dump target \"$_target\""
|
2021-09-13 18:25:40 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
check_size fs "$_target"
|
|
|
|
|
|
|
|
# Unmount it early, if function is interrupted and didn't reach here, the shell trap will clear it up anyway
|
|
|
|
if [[ -n $_mounted ]]; then
|
|
|
|
umount -f -- "$_mounted"
|
|
|
|
fi
|
mkdumprd: generate usable kdump initramfs even target is not mounted
Currently kexec-tools always depend on dump target to be mounted, which
caused some inconvenience for setup.
So for user configured target, allow kdump to start and build initramfs
even if target is not mounted.
When a mounted user configured target is used, the behavior is not
changed.
When a unmounted user configured target is used, mkdumprd will look for
corresponding mount info in fstab, and a entry with noauto option is
founded, mkdumprd will try to mount it inplace with optoins specified
in fstab and do basic checks on the device, then umount it.
If there is no fstab entry, mkdumprd will try to mount it in temporary
path with defaults option, do same basic check and umount it.
If there is a fstab entry but "noauto" option is not used, then there
must be some reason that the target device is not mounted, mkdumprd will
error out.
When path based target is used, there is no behavior change.
Signed-off-by: Kairui Song <kasong@redhat.com>
Acked-by: Pingfan Liu <piliu@redhat.com>
2020-05-12 10:47:19 +00:00
|
|
|
}
|
|
|
|
|
2012-06-14 01:56:10 +00:00
|
|
|
# $1: core_collector config value
|
2021-09-13 18:25:40 +00:00
|
|
|
verify_core_collector()
|
|
|
|
{
|
|
|
|
local _cmd="${1%% *}"
|
|
|
|
local _params="${1#* }"
|
|
|
|
|
|
|
|
if [[ $_cmd != "makedumpfile" ]]; then
|
|
|
|
if is_raw_dump_target; then
|
|
|
|
dwarn "Warning: specifying a non-makedumpfile core collector, you will have to recover the vmcore manually."
|
|
|
|
fi
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
|
|
|
|
if is_ssh_dump_target || is_raw_dump_target; then
|
|
|
|
if ! strstr "$_params" "-F"; then
|
|
|
|
perror_exit 'The specified dump target needs makedumpfile "-F" option.'
|
|
|
|
fi
|
|
|
|
_params="$_params vmcore"
|
|
|
|
else
|
|
|
|
_params="$_params vmcore dumpfile"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# shellcheck disable=SC2086
|
|
|
|
if ! $_cmd --check-params $_params; then
|
|
|
|
perror_exit "makedumpfile parameter check failed."
|
|
|
|
fi
|
2012-06-14 01:56:10 +00:00
|
|
|
}
|
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
add_mount()
|
|
|
|
{
|
|
|
|
local _mnt
|
kdumpctl: remove "root=X" for kdump boot
Since the current dracut of Fedora already supports not always
mounting root device, we can remove "root=X" from the command
line directly, and always get the dump target specified in
"/etc/kdump.conf" and mount it. If the dump target is located
at root filesystem, we will add the root mount info explicitly
from kdump side instead of from dracut side.
For example, in case of nfs/ssh/usb/raw/etc(non-root) dumping,
kdump will not mount the unnecessary root fs after this change.
This patch removes "root=X" via the "KDUMP_COMMANDLINE_REMOVE"
(if "default dump_to_rootfs" is specified, don't remove "root=X"),
and mounts non-root target under "/kdumproot", the root target
still under "/sysroot"(to be align with systemd sysroot.mount).
After removing "root=X", we now add root fs mount information
explicitly from the kdump side.
Changed check_dump_fs_modified() a little to avoid rebuild when
dump target is root, since we add root fs mount explicitly now.
Signed-off-by: Xunlei Pang <xlpang@redhat.com>
Acked-by: Pratyush Anand <panand@redhat.com>
Acked-by:Dave Young <dyoung@redhat.com>
2017-04-05 11:34:12 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
_mnt=$(to_mount "$@") || exit 1
|
kdumpctl: remove "root=X" for kdump boot
Since the current dracut of Fedora already supports not always
mounting root device, we can remove "root=X" from the command
line directly, and always get the dump target specified in
"/etc/kdump.conf" and mount it. If the dump target is located
at root filesystem, we will add the root mount info explicitly
from kdump side instead of from dracut side.
For example, in case of nfs/ssh/usb/raw/etc(non-root) dumping,
kdump will not mount the unnecessary root fs after this change.
This patch removes "root=X" via the "KDUMP_COMMANDLINE_REMOVE"
(if "default dump_to_rootfs" is specified, don't remove "root=X"),
and mounts non-root target under "/kdumproot", the root target
still under "/sysroot"(to be align with systemd sysroot.mount).
After removing "root=X", we now add root fs mount information
explicitly from the kdump side.
Changed check_dump_fs_modified() a little to avoid rebuild when
dump target is root, since we add root fs mount explicitly now.
Signed-off-by: Xunlei Pang <xlpang@redhat.com>
Acked-by: Pratyush Anand <panand@redhat.com>
Acked-by:Dave Young <dyoung@redhat.com>
2017-04-05 11:34:12 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
add_dracut_mount "$_mnt"
|
2012-01-25 08:58:35 +00:00
|
|
|
}
|
|
|
|
|
pass mount info to dracut when default target is a separate disk
When user does not specify dump target explicitly, it's better to
dump to the "path" specified. That means after dump user enter into
1st kernel, can find vmcore in the "path". If that path is in root
fs, vmcore is stored in root fs. If separate disk is mounted on
any tier of "path", we just dump vmcore into the left path on the
left separate disk.
E.g in kdump.conf
path /mnt/nfs
in mount info,
/dev/vdb on /mnt type ext4 (rw,relatime,seclabel,data=ordered)
Then vmcore will be saved in /nfs of /dev/vdb.
In this patch, pass mount info to dracut in this case if separate
disk is mounted on any tier of "path".
Meanwhile introduce a function in kdump-lib.sh to check if any
target is specified.
v4->v5:
Per Vivek's comment, add a helper function is_fs_dump_target.
Then is_user_configured_dump_target is rewrite with these helper
functions.
v5->v7:
No v6 for this patch. Just use newly introduced function
is_fs_type_nfs in handle_default_dump_target.
Signed-off-by: Baoquan He <bhe@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-04-11 12:27:01 +00:00
|
|
|
#handle the case user does not specify the dump target explicitly
|
|
|
|
handle_default_dump_target()
|
2014-03-05 03:17:57 +00:00
|
|
|
{
|
2021-09-13 18:25:40 +00:00
|
|
|
local _target
|
|
|
|
local _mntpoint
|
2014-03-05 03:17:57 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
is_user_configured_dump_target && return
|
2014-03-05 03:17:57 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
check_save_path_fs "$SAVE_PATH"
|
pass mount info to dracut when default target is a separate disk
When user does not specify dump target explicitly, it's better to
dump to the "path" specified. That means after dump user enter into
1st kernel, can find vmcore in the "path". If that path is in root
fs, vmcore is stored in root fs. If separate disk is mounted on
any tier of "path", we just dump vmcore into the left path on the
left separate disk.
E.g in kdump.conf
path /mnt/nfs
in mount info,
/dev/vdb on /mnt type ext4 (rw,relatime,seclabel,data=ordered)
Then vmcore will be saved in /nfs of /dev/vdb.
In this patch, pass mount info to dracut in this case if separate
disk is mounted on any tier of "path".
Meanwhile introduce a function in kdump-lib.sh to check if any
target is specified.
v4->v5:
Per Vivek's comment, add a helper function is_fs_dump_target.
Then is_user_configured_dump_target is rewrite with these helper
functions.
v5->v7:
No v6 for this patch. Just use newly introduced function
is_fs_type_nfs in handle_default_dump_target.
Signed-off-by: Baoquan He <bhe@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-04-11 12:27:01 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
_save_path=$(get_bind_mount_source "$SAVE_PATH")
|
|
|
|
_target=$(get_target_from_path "$_save_path")
|
|
|
|
_mntpoint=$(get_mntpoint_from_target "$_target")
|
2015-04-17 08:26:27 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
SAVE_PATH=${_save_path##"$_mntpoint"}
|
|
|
|
add_mount "$_target"
|
|
|
|
check_size fs "$_target"
|
2014-03-05 03:17:57 +00:00
|
|
|
}
|
|
|
|
|
2013-03-29 08:25:39 +00:00
|
|
|
check_crypt()
|
|
|
|
{
|
2021-09-13 18:25:40 +00:00
|
|
|
local _dev
|
2013-03-29 08:25:39 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
for _dev in $(get_kdump_targets); do
|
|
|
|
if [[ -n $(get_luks_crypt_dev "$(get_maj_min "$_dev")") ]]; then
|
|
|
|
derror "Device $_dev is encrypted." && return 1
|
|
|
|
fi
|
|
|
|
done
|
2013-03-29 08:25:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ! check_crypt; then
|
2021-09-13 18:25:40 +00:00
|
|
|
dwarn "Warning: Encrypted device is in dump path, which is not recommended, see kexec-kdump-howto.txt for more details."
|
2013-03-29 08:25:39 +00:00
|
|
|
fi
|
|
|
|
|
2012-04-28 10:01:18 +00:00
|
|
|
# firstly get right SSH_KEY_LOCATION
|
2021-08-03 17:58:04 +00:00
|
|
|
keyfile=$(kdump_get_conf_val sshkey)
|
2021-09-13 18:25:40 +00:00
|
|
|
if [[ -f $keyfile ]]; then
|
|
|
|
# canonicalize the path
|
|
|
|
SSH_KEY_LOCATION=$(/usr/bin/readlink -m "$keyfile")
|
2012-04-28 10:01:18 +00:00
|
|
|
fi
|
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
while read -r config_opt config_val; do
|
|
|
|
# remove inline comments after the end of a directive.
|
|
|
|
case "$config_opt" in
|
|
|
|
extra_modules)
|
|
|
|
extra_modules="$extra_modules $config_val"
|
|
|
|
;;
|
2022-09-23 10:13:11 +00:00
|
|
|
ext[234] | xfs | btrfs | minix | nfs | virtiofs)
|
2021-09-13 18:25:40 +00:00
|
|
|
check_user_configured_target "$config_val" "$config_opt"
|
|
|
|
add_mount "$config_val" "$config_opt"
|
|
|
|
;;
|
|
|
|
raw)
|
|
|
|
# checking raw disk writable
|
|
|
|
dd if="$config_val" count=1 of=/dev/null > /dev/null 2>&1 || {
|
|
|
|
perror_exit "Bad raw disk $config_val"
|
|
|
|
}
|
|
|
|
_praw=$(persistent_policy="by-id" kdump_get_persistent_dev "$config_val")
|
|
|
|
if [[ -z $_praw ]]; then
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
add_dracut_arg "--device" "$_praw"
|
|
|
|
check_size raw "$config_val"
|
|
|
|
;;
|
|
|
|
ssh)
|
|
|
|
if strstr "$config_val" "@"; then
|
|
|
|
mkdir_save_path_ssh "$config_val"
|
|
|
|
check_size ssh "$config_val"
|
|
|
|
add_dracut_sshkey "$SSH_KEY_LOCATION"
|
|
|
|
else
|
|
|
|
perror_exit "Bad ssh dump target $config_val"
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
core_collector)
|
|
|
|
verify_core_collector "$config_val"
|
|
|
|
;;
|
|
|
|
dracut_args)
|
2022-12-23 08:03:38 +00:00
|
|
|
|
|
|
|
# When users specify nfs dumping via dracut_args, kexec-tools won't
|
|
|
|
# mount nfs fs beforehand thus nfsv4-related drivers won't be installed
|
|
|
|
# because we call dracut with --hostonly-mode strict. So manually install
|
|
|
|
# nfsv4-related drivers.
|
|
|
|
if [[ $(get_dracut_args_fstype "$config_val") == nfs* ]]; then
|
|
|
|
add_dracut_arg "--add-drivers" nfs_layout_nfsv41_files
|
|
|
|
fi
|
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
while read -r dracut_arg; do
|
|
|
|
add_dracut_arg "$dracut_arg"
|
|
|
|
done <<< "$(echo "$config_val" | xargs -n 1 echo)"
|
|
|
|
;;
|
|
|
|
*) ;;
|
|
|
|
|
|
|
|
esac
|
2021-08-03 11:49:51 +00:00
|
|
|
done <<< "$(kdump_read_conf)"
|
2006-07-20 03:36:18 +00:00
|
|
|
|
pass mount info to dracut when default target is a separate disk
When user does not specify dump target explicitly, it's better to
dump to the "path" specified. That means after dump user enter into
1st kernel, can find vmcore in the "path". If that path is in root
fs, vmcore is stored in root fs. If separate disk is mounted on
any tier of "path", we just dump vmcore into the left path on the
left separate disk.
E.g in kdump.conf
path /mnt/nfs
in mount info,
/dev/vdb on /mnt type ext4 (rw,relatime,seclabel,data=ordered)
Then vmcore will be saved in /nfs of /dev/vdb.
In this patch, pass mount info to dracut in this case if separate
disk is mounted on any tier of "path".
Meanwhile introduce a function in kdump-lib.sh to check if any
target is specified.
v4->v5:
Per Vivek's comment, add a helper function is_fs_dump_target.
Then is_user_configured_dump_target is rewrite with these helper
functions.
v5->v7:
No v6 for this patch. Just use newly introduced function
is_fs_type_nfs in handle_default_dump_target.
Signed-off-by: Baoquan He <bhe@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-04-11 12:27:01 +00:00
|
|
|
handle_default_dump_target
|
|
|
|
|
2022-01-05 09:42:12 +00:00
|
|
|
if ! have_compression_in_dracut_args; then
|
Seperate dracut and dracut-squash compressor for zstd
Previously kexec-tools will pass "--compress zstd" to dracut. It
will make dracut to decide whether: a) call mksquashfs to make a
zstd format squash-root.img, b) call cmd zstd to make a initramfs.
Since dracut(>= 057) has decoupled the compressor for dracut and
dracut-squash, So in this patch, we will pass the compressor seperately.
Note:
The is_squash_available && !dracut_has_option --squash-compressor
&& !is_zsdt_command_available case is left unprocessed on purpose.
Actually, the situation when we want to call zstd compression is:
1) If squash function OK, we want dracut to invoke mksquashfs to make
a zstd format squash-root.img within initramfs.
2) If squash function is not OK, and cmd zstd presents, we want dracut
to invoke cmd zstd to make a zstd format initramfs.
is_zstd_command_available check can handle case 2 completely.
However, for the is_squash_available check, it cannot handle case 1
completely. It only checks if the kernel supports squashfs, it doesn't
check whether the squash module has been added by dracut when making
initramfs. In fact, in kexec-tools we are unable to do the check,
there are multiple ways to forbit dracut to load a module, such as
"dracut -o module" and "omit_dracutmodules in dracut.conf".
When squash dracut module is omitted, is_squash_available check will
still pass, so "--compress zstd" will be appended to dracut cmdline,
and it will call cmd zstd to do the compression. However cmd zstd may
not exist, so it fails.
The previous "--compress zstd" is ambiguous, after the intro of
"--squash-compressor", "--squash-compressor" only effect for
mksquashfs and "--compress" only effect for specific cmd.
So for the is_squash_available && !dracut_has_option
--squash-compressor && !is_zsdt_command_available case, we just leave
it to be handled the default way.
Reviewed-by: Philipp Rudo <prudo@redhat.com>
Signed-off-by: Tao Liu <ltao@redhat.com>
2022-10-08 04:09:08 +00:00
|
|
|
if is_squash_available && dracut_have_option "--squash-compressor"; then
|
|
|
|
add_dracut_arg "--squash-compressor" "zstd"
|
2023-09-06 08:49:37 +00:00
|
|
|
elif has_command zstd; then
|
2022-01-10 13:51:16 +00:00
|
|
|
add_dracut_arg "--compress" "zstd"
|
|
|
|
fi
|
2022-01-05 09:42:12 +00:00
|
|
|
fi
|
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
if [[ -n $extra_modules ]]; then
|
|
|
|
add_dracut_arg "--add-drivers" "$extra_modules"
|
2010-06-13 19:20:48 +00:00
|
|
|
fi
|
|
|
|
|
2021-06-23 14:36:48 +00:00
|
|
|
# TODO: The below check is not needed anymore with the introduction of
|
|
|
|
# 'zz-fadumpinit' module, that isolates fadump's capture kernel initrd,
|
|
|
|
# but still sysroot.mount unit gets generated based on 'root=' kernel
|
|
|
|
# parameter available in fadump case. So, find a way to fix that first
|
|
|
|
# before removing this check.
|
2017-08-30 08:45:46 +00:00
|
|
|
if ! is_fadump_capable; then
|
2021-09-13 18:25:40 +00:00
|
|
|
# The 2nd rootfs mount stays behind the normal dump target mount,
|
|
|
|
# so it doesn't affect the logic of check_dump_fs_modified().
|
|
|
|
is_dump_to_rootfs && add_mount "$(to_dev_name "$(get_root_fs_device)")"
|
2017-08-30 08:45:47 +00:00
|
|
|
|
2021-09-13 18:25:40 +00:00
|
|
|
add_dracut_arg "--no-hostonly-default-device"
|
mkdumprd: call dracut with --add-device to install the drivers needed by /boot partition automatically for FIPS
Currently, kdump doesn't work on many FIPS-enabled systems including
Azure, ESXI, Hyper, POWER and etc. When FIPS is enabled, it needs to
access /boot//.vmlinuz-xxx.hmac to verify the integrity of the kernel.
However, on those systems, /boot fails to be mounted due to a lack of
fs and block device drivers and the system just halted after failing to
verify the integrity of the kernel. For example, on Hyper-V, sd_mod, sg,
scsi_transport_fc, hv_storvsc and hv_vmbus need to be installed in order
for /boot to be mounted.
mkdumprd calls dracut with the --no-hostonly-default-device. Following
the documentation (man dracut),
--no-hostonly-default-device
Do not generate implicit host devices like root, swap, fstab, etc.
Use "--mount" or "--add-device" to explicitly add devices as needed
this patch uses "--add-device" to explicitly add the device of /boot.
Note there is already an attempt to fix it in dracut's 01fips module
i.e. via the commit 83651776 ("fips: ensure fs module for /boot is
installed"). Unfortunately it only installs the file system driver e.g.
xfs.
Reviewed-by: Philipp Rudo <prudo@redhat.com>
Signed-off-by: Coiby Xu <coxu@redhat.com>
2023-05-24 04:01:45 +00:00
|
|
|
|
2023-06-01 08:05:05 +00:00
|
|
|
if fips-mode-setup --is-enabled 2> /dev/null; then
|
mkdumprd: call dracut with --add-device to install the drivers needed by /boot partition automatically for FIPS
Currently, kdump doesn't work on many FIPS-enabled systems including
Azure, ESXI, Hyper, POWER and etc. When FIPS is enabled, it needs to
access /boot//.vmlinuz-xxx.hmac to verify the integrity of the kernel.
However, on those systems, /boot fails to be mounted due to a lack of
fs and block device drivers and the system just halted after failing to
verify the integrity of the kernel. For example, on Hyper-V, sd_mod, sg,
scsi_transport_fc, hv_storvsc and hv_vmbus need to be installed in order
for /boot to be mounted.
mkdumprd calls dracut with the --no-hostonly-default-device. Following
the documentation (man dracut),
--no-hostonly-default-device
Do not generate implicit host devices like root, swap, fstab, etc.
Use "--mount" or "--add-device" to explicitly add devices as needed
this patch uses "--add-device" to explicitly add the device of /boot.
Note there is already an attempt to fix it in dracut's 01fips module
i.e. via the commit 83651776 ("fips: ensure fs module for /boot is
installed"). Unfortunately it only installs the file system driver e.g.
xfs.
Reviewed-by: Philipp Rudo <prudo@redhat.com>
Signed-off-by: Coiby Xu <coxu@redhat.com>
2023-05-24 04:01:45 +00:00
|
|
|
add_dracut_arg --add-device "$(findmnt -n -o SOURCE --target /boot)"
|
|
|
|
fi
|
2017-08-30 08:45:46 +00:00
|
|
|
fi
|
|
|
|
|
2021-08-03 19:50:04 +00:00
|
|
|
dracut "${dracut_args[@]}" "$@"
|