import kexec-tools-2.0.25-13.el9_2

This commit is contained in:
CentOS Sources 2023-05-09 05:35:01 +00:00 committed by Stepan Oksanichenko
parent 603ceaf5ab
commit 899c5f5857
19 changed files with 772 additions and 509 deletions

4
.gitignore vendored
View File

@ -1,3 +1,3 @@
SOURCES/eppic-e8844d3.tar.gz SOURCES/eppic-e8844d3.tar.gz
SOURCES/kexec-tools-2.0.24.tar.xz SOURCES/kexec-tools-2.0.25.tar.xz
SOURCES/makedumpfile-1.7.1.tar.gz SOURCES/makedumpfile-1.7.2.tar.gz

View File

@ -1,3 +1,3 @@
80ac3f5e77d3c79883edadf14428734db4720009 SOURCES/eppic-e8844d3.tar.gz 80ac3f5e77d3c79883edadf14428734db4720009 SOURCES/eppic-e8844d3.tar.gz
62b7a99779d66ffd07a1684f7b640d32c9697f0c SOURCES/kexec-tools-2.0.24.tar.xz 78d5d4f7e9d358ca234db9c84a551d9d411eb0b5 SOURCES/kexec-tools-2.0.25.tar.xz
8f8485c2a1edbc730f4fa1b96ae3ec8d8f1f9761 SOURCES/makedumpfile-1.7.1.tar.gz 24bce02cd42cdbb960ada4d9e733355582e35784 SOURCES/makedumpfile-1.7.2.tar.gz

31
SOURCES/60-fadump.install Executable file
View File

@ -0,0 +1,31 @@
#!/usr/bin/bash
COMMAND="$1"
KERNEL_VERSION="$2"
if ! [[ ${KERNEL_INSTALL_MACHINE_ID-x} ]]; then
exit 0
fi
# Currently, fadump is supported only in environments with
# writable /boot directory.
if [[ ! -w "/boot" ]]; then
exit 0
fi
FADUMP_INITRD="/boot/.initramfs-${KERNEL_VERSION}.img.default"
FADUMP_INITRD_CHECKSUM="$FADUMP_INITRD.checksum"
ret=0
case "$COMMAND" in
add)
# Do nothing, fadump initramfs is strictly host only
# and managed by kdump service
;;
remove)
rm -f -- "$FADUMP_INITRD"
rm -f -- "$FADUMP_INITRD_CHECKSUM"
ret=$?
;;
esac
exit $ret

View File

@ -7,7 +7,7 @@ KERNEL_IMAGE="$4"
case "$COMMAND" in case "$COMMAND" in
add) add)
kdumpctl reset-crashkernel-for-installed_kernel "$KERNEL_VERSION" kdumpctl _reset-crashkernel-for-installed_kernel "$KERNEL_VERSION"
exit 0 exit 0
;; ;;
esac esac

View File

@ -82,6 +82,8 @@ kernels to the default value is:
grubby --update-kernel ALL --args "crashkernel=$(kdumpctl get-default-crashkernel)" grubby --update-kernel ALL --args "crashkernel=$(kdumpctl get-default-crashkernel)"
NOTE: On s390x you also need to run zipl for the change to take effect.
Estimate crashkernel Estimate crashkernel
==================== ====================

View File

@ -162,9 +162,15 @@ dump_fs()
$CORE_COLLECTOR /proc/vmcore "$_dump_fs_path/vmcore-incomplete" $CORE_COLLECTOR /proc/vmcore "$_dump_fs_path/vmcore-incomplete"
_dump_exitcode=$? _dump_exitcode=$?
if [ $_dump_exitcode -eq 0 ]; then if [ $_dump_exitcode -eq 0 ]; then
sync -f "$_dump_fs_path/vmcore-incomplete"
_sync_exitcode=$?
if [ $_sync_exitcode -eq 0 ]; then
mv "$_dump_fs_path/vmcore-incomplete" "$_dump_fs_path/vmcore" mv "$_dump_fs_path/vmcore-incomplete" "$_dump_fs_path/vmcore"
sync
dinfo "saving vmcore complete" dinfo "saving vmcore complete"
else
derror "sync vmcore failed, exitcode:$_sync_exitcode"
return 1
fi
else else
derror "saving vmcore failed, exitcode:$_dump_exitcode" derror "saving vmcore failed, exitcode:$_dump_exitcode"
fi fi
@ -472,27 +478,54 @@ save_vmcore_dmesg_ssh()
fi fi
} }
wait_online_network()
{
# In some cases, network may still not be ready because nm-online is called
# with "-s" which means to wait for NetworkManager startup to complete, rather
# than waiting for network connectivity specifically. Wait 10mins more for the
# network to be truely ready in these cases.
_loop=0
while [ $_loop -lt 600 ]; do
sleep 1
_loop=$((_loop + 1))
if _route=$(kdump_get_ip_route "$1" 2> /dev/null); then
printf "%s" "$_route"
return
fi
done
derror "Oops. The network still isn't ready after waiting 10mins."
exit 1
}
get_host_ip() get_host_ip()
{ {
if is_nfs_dump_target || is_ssh_dump_target; then
kdumpnic=$(getarg kdumpnic=) if ! is_nfs_dump_target && ! is_ssh_dump_target; then
if [ -z "$kdumpnic" ]; then
derror "failed to get kdumpnic!"
return 1
fi
if ! kdumphost=$(ip addr show dev "$kdumpnic" | grep '[ ]*inet'); then
derror "wrong kdumpnic: $kdumpnic"
return 1
fi
kdumphost=$(echo "$kdumphost" | head -n 1 | awk '{print $2}')
kdumphost="${kdumphost%%/*}"
if [ -z "$kdumphost" ]; then
derror "wrong kdumpnic: $kdumpnic"
return 1
fi
HOST_IP=$kdumphost
fi
return 0 return 0
fi
_kdump_remote_ip=$(getarg kdump_remote_ip=)
if [ -z "$_kdump_remote_ip" ]; then
derror "failed to get remote IP address!"
return 1
fi
if ! _route=$(wait_online_network "$_kdump_remote_ip"); then
return 1
fi
_netdev=$(kdump_get_ip_route_field "$_route" "dev")
if ! _kdumpip=$(ip addr show dev "$_netdev" | grep '[ ]*inet'); then
derror "Failed to get IP of $_netdev"
return 1
fi
_kdumpip=$(echo "$_kdumpip" | head -n 1 | awk '{print $2}')
_kdumpip="${_kdumpip%%/*}"
HOST_IP=$_kdumpip
} }
read_kdump_confs() read_kdump_confs()
@ -515,7 +548,7 @@ read_kdump_confs()
DUMP_INSTRUCTION="dump_fs $config_val" DUMP_INSTRUCTION="dump_fs $config_val"
fi fi
;; ;;
ext[234] | xfs | btrfs | minix | nfs) ext[234] | xfs | btrfs | minix | nfs | virtiofs)
config_val=$(get_mntpoint_from_target "$config_val") config_val=$(get_mntpoint_from_target "$config_val")
DUMP_INSTRUCTION="dump_fs $config_val" DUMP_INSTRUCTION="dump_fs $config_val"
;; ;;

View File

@ -1,10 +1,22 @@
#!/bin/bash #!/bin/bash
_DRACUT_KDUMP_NM_TMP_DIR="$DRACUT_TMPDIR/$$-DRACUT_KDUMP_NM"
_save_kdump_netifs() {
unique_netifs[$1]=1
}
_get_kdump_netifs() {
echo -n "${!unique_netifs[@]}"
}
kdump_module_init() { kdump_module_init() {
if ! [[ -d "${initdir}/tmp" ]]; then if ! [[ -d "${initdir}/tmp" ]]; then
mkdir -p "${initdir}/tmp" mkdir -p "${initdir}/tmp"
fi fi
mkdir -p "$_DRACUT_KDUMP_NM_TMP_DIR"
. /lib/kdump/kdump-lib.sh . /lib/kdump/kdump-lib.sh
} }
@ -40,6 +52,14 @@ depends() {
_dep="$_dep ssh-client" _dep="$_dep ssh-client"
fi fi
if is_lvm2_thinp_dump_target; then
if grep -q lvmthinpool-monitor <<< $(dracut --list-modules); then
add_opt_module lvmthinpool-monitor
else
dwarning "Required lvmthinpool-monitor modules is missing! Please upgrade dracut >= 057."
fi
fi
if [[ "$(uname -m)" == "s390x" ]]; then if [[ "$(uname -m)" == "s390x" ]]; then
_dep="$_dep znet" _dep="$_dep znet"
fi fi
@ -84,39 +104,6 @@ source_ifcfg_file() {
fi fi
} }
kdump_setup_dns() {
local _netdev="$1"
local _conpath="$2"
local _nameserver _dns _tmp array
local _dnsfile=${initdir}/etc/cmdline.d/42dns.conf
_tmp=$(get_nmcli_field_by_conpath "IP4.DNS" "$_conpath")
# shellcheck disable=SC2206
array=(${_tmp//|/ })
if [[ ${array[*]} ]]; then
for _dns in "${array[@]}"; do
echo "nameserver=$_dns" >> "$_dnsfile"
done
else
dwarning "Failed to get DNS info via nmcli output. Now try sourcing ifcfg script"
source_ifcfg_file "$_netdev"
[[ -n $DNS1 ]] && echo "nameserver=$DNS1" > "$_dnsfile"
[[ -n $DNS2 ]] && echo "nameserver=$DNS2" >> "$_dnsfile"
fi
while read -r content; do
_nameserver=$(echo "$content" | grep ^nameserver)
[[ -z $_nameserver ]] && continue
_dns=$(echo "$_nameserver" | awk '{print $2}')
[[ -z $_dns ]] && continue
if [[ ! -f $_dnsfile ]] || ! grep -q "$_dns" "$_dnsfile"; then
echo "nameserver=$_dns" >> "$_dnsfile"
fi
done < "/etc/resolv.conf"
}
# $1: repeat times # $1: repeat times
# $2: string to be repeated # $2: string to be repeated
# $3: separator # $3: separator
@ -227,89 +214,6 @@ cal_netmask_by_prefix() {
fi fi
} }
#$1: netdev name
#$2: srcaddr
#if it use static ip echo it, or echo null
kdump_static_ip() {
local _netdev="$1" _srcaddr="$2" kdumpnic="$3" _ipv6_flag
local _netmask _gateway _ipaddr _target _nexthop _prefix
_ipaddr=$(ip addr show dev "$_netdev" permanent | awk "/ $_srcaddr\/.* /{print \$2}")
if is_ipv6_address "$_srcaddr"; then
_ipv6_flag="-6"
fi
if [[ -n $_ipaddr ]]; then
_gateway=$(ip $_ipv6_flag route list dev "$_netdev" \
| awk '/^default /{print $3}' | head -n 1)
if [[ "x" != "x"$_ipv6_flag ]]; then
# _ipaddr="2002::56ff:feb6:56d5/64", _netmask is the number after "/"
_netmask=${_ipaddr#*\/}
_srcaddr="[$_srcaddr]"
_gateway="[$_gateway]"
else
_prefix=$(cut -d'/' -f2 <<< "$_ipaddr")
if ! _netmask=$(cal_netmask_by_prefix "$_prefix" "$_ipv6_flag"); then
derror "Failed to calculate netmask for $_ipaddr"
exit 1
fi
fi
echo -n "${_srcaddr}::${_gateway}:${_netmask}::"
fi
/sbin/ip $_ipv6_flag route show | grep -v default \
| grep ".*via.* $_netdev " | grep -v "^[[:space:]]*nexthop" \
| while read -r _route; do
_target=$(echo "$_route" | awk '{print $1}')
_nexthop=$(echo "$_route" | awk '{print $3}')
if [[ "x" != "x"$_ipv6_flag ]]; then
_target="[$_target]"
_nexthop="[$_nexthop]"
fi
echo "rd.route=$_target:$_nexthop:$kdumpnic"
done >> "${initdir}/etc/cmdline.d/45route-static.conf"
kdump_handle_mulitpath_route "$_netdev" "$_srcaddr" "$kdumpnic"
}
kdump_handle_mulitpath_route() {
local _netdev="$1" _srcaddr="$2" kdumpnic="$3" _ipv6_flag
local _target _nexthop _route _weight _max_weight _rule
if is_ipv6_address "$_srcaddr"; then
_ipv6_flag="-6"
fi
while IFS="" read -r _route; do
if [[ $_route =~ [[:space:]]+nexthop ]]; then
_route=${_route##[[:space:]]}
# Parse multipath route, using previous _target
[[ $_target == 'default' ]] && continue
[[ $_route =~ .*via.*\ $_netdev ]] || continue
_weight=$(echo "$_route" | cut -d ' ' -f7)
if [[ $_weight -gt $_max_weight ]]; then
_nexthop=$(echo "$_route" | cut -d ' ' -f3)
_max_weight=$_weight
if [[ "x" != "x"$_ipv6_flag ]]; then
_rule="rd.route=[$_target]:[$_nexthop]:$kdumpnic"
else
_rule="rd.route=$_target:$_nexthop:$kdumpnic"
fi
fi
else
[[ -n $_rule ]] && echo "$_rule"
_target=$(echo "$_route" | cut -d ' ' -f1)
_rule="" _max_weight=0 _weight=0
fi
done >> "${initdir}/etc/cmdline.d/45route-static.conf" \
<<< "$(/sbin/ip $_ipv6_flag route show)"
[[ -n $_rule ]] && echo "$_rule" >> "${initdir}/etc/cmdline.d/45route-static.conf"
}
kdump_get_mac_addr() { kdump_get_mac_addr() {
cat "/sys/class/net/$1/address" cat "/sys/class/net/$1/address"
} }
@ -326,192 +230,293 @@ kdump_get_perm_addr() {
fi fi
} }
# Prefix kernel assigned names with "kdump-". EX: eth0 -> kdump-eth0 apply_nm_initrd_generator_timeouts() {
# Because kernel assigned names are not persistent between 1st and 2nd local _timeout_conf
# kernel. We could probably end up with eth0 being eth1, eth0 being
# eth1, and naming conflict happens.
kdump_setup_ifname() {
local _ifname
# If ifname already has 'kdump-' prefix, we must be switching from _timeout_conf=$_DRACUT_KDUMP_NM_TMP_DIR/timeout_conf
# fadump to kdump. Skip prefixing 'kdump-' in this case as adding cat << EOF > "$_timeout_conf"
# another prefix may truncate the ifname. Since an ifname with [device-95-kdump]
# 'kdump-' is already persistent, this should be fine. carrier-wait-timeout=30000
if [[ $1 =~ eth* ]] && [[ ! $1 =~ ^kdump-* ]]; then
_ifname="kdump-$1" [connection-95-kdump]
else ipv4.dhcp-timeout=90
_ifname="$1" ipv6.dhcp-timeout=90
EOF
inst "$_timeout_conf" "/etc/NetworkManager/conf.d/95-kdump-timeouts.conf"
}
use_ipv4_or_ipv6() {
local _netif=$1 _uuid=$2
if [[ -v "ipv4_usage[$_netif]" ]]; then
nmcli connection modify --temporary "$_uuid" ipv4.may-fail no &> >(ddebug)
fi fi
echo "$_ifname" if [[ -v "ipv6_usage[$_netif]" ]]; then
nmcli connection modify --temporary "$_uuid" ipv6.may-fail no &> >(ddebug)
fi
if [[ -v "ipv4_usage[$_netif]" ]] && [[ ! -v "ipv6_usage[$_netif]" ]]; then
nmcli connection modify --temporary "$_uuid" ipv6.method disabled &> >(ddebug)
elif [[ ! -v "ipv4_usage[$_netif]" ]] && [[ -v "ipv6_usage[$_netif]" ]]; then
nmcli connection modify --temporary "$_uuid" ipv4.method disabled &> >(ddebug)
fi
}
_clone_nmconnection() {
local _clone_output _name _unique_id
_unique_id=$1
_name=$(nmcli --get-values connection.id connection show "$_unique_id")
if _clone_output=$(nmcli connection clone --temporary uuid "$_unique_id" "$_name"); then
sed -E -n "s/.* \(.*\) cloned as.*\((.*)\)\.$/\1/p" <<< "$_clone_output"
return 0
fi
return 1
}
_match_nmconnection_by_mac() {
local _unique_id _dev _mac _mac_field
_unique_id=$1
_dev=$2
_mac=$(kdump_get_perm_addr "$_dev")
[[ $_mac != 'not set' ]] || return
_mac_field=$(nmcli --get-values connection.type connection show "$_unique_id").mac-address
nmcli connection modify --temporary "$_unique_id" "$_mac_field" "$_mac" &> >(ddebug)
nmcli connection modify --temporary "$_unique_id" "connection.interface-name" "" &> >(ddebug)
}
# Clone and modify NM connection profiles
#
# This function makes use of "nmcli clone" to automatically convert ifcfg-*
# files to Networkmanager .nmconnection connection profiles and also modify the
# properties of .nmconnection if necessary.
clone_and_modify_nmconnection() {
local _dev _cloned_nmconnection_file_path _tmp_nmconnection_file_path _old_uuid _uuid
_dev=$1
_nmconnection_file_path=$2
_old_uuid=$(nmcli --get-values connection.uuid connection show filename "$_nmconnection_file_path")
if ! _uuid=$(_clone_nmconnection "$_old_uuid"); then
derror "Failed to clone $_old_uuid"
exit 1
fi
use_ipv4_or_ipv6 "$_dev" "$_uuid"
nmcli connection modify --temporary uuid "$_uuid" connection.wait-device-timeout 60000 &> >(ddebug)
# For physical NIC i.e. non-user created NIC, ask NM to match a
# connection profile based on MAC address
_match_nmconnection_by_mac "$_uuid" "$_dev"
_cloned_nmconnection_file_path=$(nmcli --get-values UUID,FILENAME connection show | sed -n "s/^${_uuid}://p")
_tmp_nmconnection_file_path=$_DRACUT_KDUMP_NM_TMP_DIR/$(basename "$_nmconnection_file_path")
cp "$_cloned_nmconnection_file_path" "$_tmp_nmconnection_file_path"
# change uuid back to old value in case it's refered by other connection
# profile e.g. connection.master could be interface name of the master
# device or UUID of the master connection.
sed -i -E "s/(^uuid=).*$/\1${_old_uuid}/g" "$_tmp_nmconnection_file_path"
nmcli connection del "$_uuid" &> >(ddebug)
echo -n "$_tmp_nmconnection_file_path"
}
_install_nmconnection() {
local _src _nmconnection_name _dst
_src=$1
_nmconnection_name=$(basename "$_src")
_dst="/etc/NetworkManager/system-connections/$_nmconnection_name"
inst "$_src" "$_dst"
}
kdump_install_nmconnections() {
local _netif _nm_conn_path _cloned_nm_path
while IFS=: read -r _netif _nm_conn_path; do
[[ -v "unique_netifs[$_netif]" ]] || continue
if _cloned_nm_path=$(clone_and_modify_nmconnection "$_netif" "$_nm_conn_path"); then
_install_nmconnection "$_cloned_nm_path"
else
derror "Failed to install the .nmconnection for $_netif"
exit 1
fi
done <<< "$(nmcli -t -f device,filename connection show --active)"
# Stop dracut 35network-manger to calling nm-initrd-generator.
# Note this line of code can be removed after NetworkManager >= 1.35.2
# gets released.
echo > "${initdir}/usr/libexec/nm-initrd-generator"
}
kdump_install_nm_netif_allowlist() {
local _netif _except_netif _netif_allowlist _netif_allowlist_nm_conf
for _netif in $1; do
_per_mac=$(kdump_get_perm_addr "$_netif")
if [[ "$_per_mac" != 'not set' ]]; then
_except_netif="mac:$_per_mac"
else
_except_netif="interface-name:$_netif"
fi
_netif_allowlist="${_netif_allowlist}except:${_except_netif};"
done
_netif_allowlist_nm_conf=$_DRACUT_KDUMP_NM_TMP_DIR/netif_allowlist_nm_conf
cat << EOF > "$_netif_allowlist_nm_conf"
[device-others]
match-device=${_netif_allowlist}
managed=false
EOF
inst "$_netif_allowlist_nm_conf" "/etc/NetworkManager/conf.d/10-kdump-netif_allowlist.conf"
}
_get_nic_driver() {
ethtool -i "$1" | sed -n -E "s/driver: (.*)/\1/p"
}
_get_hpyerv_physical_driver() {
local _physical_nic
_physical_nic=$(find /sys/class/net/"$1"/ -name 'lower_*' | sed -En "s/\/.*lower_(.*)/\1/p")
[[ -n $_physical_nic ]] || return
_get_nic_driver "$_physical_nic"
}
kdump_install_nic_driver() {
local _netif _driver _drivers
_drivers=()
for _netif in $1; do
[[ $_netif == lo ]] && continue
_driver=$(_get_nic_driver "$_netif")
if [[ -z $_driver ]]; then
derror "Failed to get the driver of $_netif"
exit 1
fi
if [[ $_driver == "802.1Q VLAN Support" ]]; then
# ethtool somehow doesn't return the driver name for a VLAN NIC
_driver=8021q
elif [[ $_driver == "team" ]]; then
# install the team mode drivers like team_mode_roundrobin.ko as well
_driver='=drivers/net/team'
elif [[ $_driver == "hv_netvsc" ]]; then
# A Hyper-V VM may have accelerated networking
# https://learn.microsoft.com/en-us/azure/virtual-network/accelerated-networking-overview
# Install the driver of physical NIC as well
_drivers+=("$(_get_hpyerv_physical_driver "$_netif")")
fi
_drivers+=("$_driver")
done
[[ -n ${_drivers[*]} ]] || return
instmods "${_drivers[@]}"
} }
kdump_setup_bridge() { kdump_setup_bridge() {
local _netdev=$1 local _netdev=$1
local _brif _dev _mac _kdumpdev local _dev
for _dev in "/sys/class/net/$_netdev/brif/"*; do for _dev in "/sys/class/net/$_netdev/brif/"*; do
[[ -e $_dev ]] || continue [[ -e $_dev ]] || continue
_dev=${_dev##*/} _dev=${_dev##*/}
_kdumpdev=$_dev
if kdump_is_bond "$_dev"; then if kdump_is_bond "$_dev"; then
(kdump_setup_bond "$_dev" "$(get_nmcli_connection_apath_by_ifname "$_dev")") || exit 1 kdump_setup_bond "$_dev" || return 1
elif kdump_is_team "$_dev"; then elif kdump_is_team "$_dev"; then
kdump_setup_team "$_dev" kdump_setup_team "$_dev"
elif kdump_is_vlan "$_dev"; then elif kdump_is_vlan "$_dev"; then
kdump_setup_vlan "$_dev" kdump_setup_vlan "$_dev"
else
_mac=$(kdump_get_mac_addr "$_dev")
_kdumpdev=$(kdump_setup_ifname "$_dev")
echo -n " ifname=$_kdumpdev:$_mac" >> "${initdir}/etc/cmdline.d/41bridge.conf"
fi fi
_brif+="$_kdumpdev," _save_kdump_netifs "$_dev"
done done
echo " bridge=$_netdev:${_brif%,}" >> "${initdir}/etc/cmdline.d/41bridge.conf"
} }
# drauct takes bond=<bondname>[:<bondslaves>:[:<options>]] syntax to parse
# bond. For example:
# bond=bond0:eth0,eth1:mode=balance-rr
kdump_setup_bond() { kdump_setup_bond() {
local _netdev="$1" local _netdev="$1"
local _conpath="$2" local _dev
local _dev _mac _slaves _kdumpdev _bondoptions
for _dev in $(cat "/sys/class/net/$_netdev/bonding/slaves"); do for _dev in $(< "/sys/class/net/$_netdev/bonding/slaves"); do
_mac=$(kdump_get_perm_addr "$_dev") _save_kdump_netifs "$_dev"
_kdumpdev=$(kdump_setup_ifname "$_dev")
echo -n " ifname=$_kdumpdev:$_mac" >> "${initdir}/etc/cmdline.d/42bond.conf"
_slaves+="$_kdumpdev,"
done done
echo -n " bond=$_netdev:${_slaves%,}" >> "${initdir}/etc/cmdline.d/42bond.conf"
_bondoptions=$(get_nmcli_field_by_conpath "bond.options" "$_conpath")
if [[ -z $_bondoptions ]]; then
dwarning "Failed to get bond configuration via nmlci output. Now try sourcing ifcfg script."
source_ifcfg_file "$_netdev"
_bondoptions="$(echo "$BONDING_OPTS" | xargs echo | tr " " ",")"
fi
if [[ -z $_bondoptions ]]; then
derror "Get empty bond options"
exit 1
fi
echo ":$_bondoptions" >> "${initdir}/etc/cmdline.d/42bond.conf"
} }
kdump_setup_team() { kdump_setup_team() {
local _netdev=$1 local _netdev=$1
local _dev _mac _slaves _kdumpdev local _dev
for _dev in $(teamnl "$_netdev" ports | awk -F':' '{print $2}'); do for _dev in $(teamnl "$_netdev" ports | awk -F':' '{print $2}'); do
_mac=$(kdump_get_perm_addr "$_dev") _save_kdump_netifs "$_dev"
_kdumpdev=$(kdump_setup_ifname "$_dev")
echo -n " ifname=$_kdumpdev:$_mac" >> "${initdir}/etc/cmdline.d/44team.conf"
_slaves+="$_kdumpdev,"
done done
echo " team=$_netdev:${_slaves%,}" >> "${initdir}/etc/cmdline.d/44team.conf"
#Buggy version teamdctl outputs to stderr!
#Try to use the latest version of teamd.
if ! teamdctl "$_netdev" config dump > "${initdir}/tmp/$$-$_netdev.conf"; then
derror "teamdctl failed."
exit 1
fi
inst_dir /etc/teamd
inst_simple "${initdir}/tmp/$$-$_netdev.conf" "/etc/teamd/$_netdev.conf"
rm -f "${initdir}/tmp/$$-$_netdev.conf"
} }
kdump_setup_vlan() { kdump_setup_vlan() {
local _netdev=$1 local _netdev=$1
local _phydev local _parent_netif
local _netmac
local _kdumpdev
_phydev="$(awk '/^Device:/{print $2}' /proc/net/vlan/"$_netdev")" _parent_netif="$(awk '/^Device:/{print $2}' /proc/net/vlan/"$_netdev")"
_netmac="$(kdump_get_mac_addr "$_phydev")"
#Just support vlan over bond and team #Just support vlan over bond and team
if kdump_is_bridge "$_phydev"; then if kdump_is_bridge "$_parent_netif"; then
derror "Vlan over bridge is not supported!" derror "Vlan over bridge is not supported!"
exit 1 exit 1
elif kdump_is_bond "$_phydev"; then elif kdump_is_bond "$_parent_netif"; then
(kdump_setup_bond "$_phydev" "$(get_nmcli_connection_apath_by_ifname "$_phydev")") || exit 1 kdump_setup_bond "$_parent_netif" || return 1
echo " vlan=$(kdump_setup_ifname "$_netdev"):$_phydev" > "${initdir}/etc/cmdline.d/43vlan.conf" elif kdump_is_team "$_parent_netif"; then
else kdump_setup_team "$_parent_netif" || return 1
_kdumpdev="$(kdump_setup_ifname "$_phydev")"
echo " vlan=$(kdump_setup_ifname "$_netdev"):$_kdumpdev ifname=$_kdumpdev:$_netmac" > "${initdir}/etc/cmdline.d/43vlan.conf"
fi fi
_save_kdump_netifs "$_parent_netif"
} }
# find online znet device _find_znet_nmconnection() {
# return ifname (_netdev) LANG=C grep -s -E -i -l \
# code reaped from the list_configured function of "^s390-subchannels=([0-9]\.[0-9]\.[a-f0-9]+;){0,2}" \
# https://github.com/hreinecke/s390-tools/blob/master/zconf/znetconf "$1"/*.nmconnection | LC_ALL=C sed -e "$2"
find_online_znet_device() {
local CCWGROUPBUS_DEVICEDIR="/sys/bus/ccwgroup/devices"
local NETWORK_DEVICES d ifname ONLINE
[[ ! -d $CCWGROUPBUS_DEVICEDIR ]] && return
NETWORK_DEVICES=$(find $CCWGROUPBUS_DEVICEDIR)
for d in $NETWORK_DEVICES; do
[[ ! -f "$d/online" ]] && continue
read -r ONLINE < "$d/online"
if [[ $ONLINE -ne 1 ]]; then
continue
fi
# determine interface name, if there (only for qeth and if
# device is online)
if [[ -f $d/if_name ]]; then
read -r ifname < "$d/if_name"
elif [[ -d $d/net ]]; then
ifname=$(ls "$d/net/")
fi
[[ -n $ifname ]] && break
done
echo -n "$ifname"
} }
# setup s390 znet cmdline # setup s390 znet
# $1: netdev (ifname) #
# $2: nmcli connection path # Note part of code is extracted from ccw_init provided by s390utils
kdump_setup_znet() { kdump_setup_znet() {
local _netdev="$1" local _config_file _unique_name _NM_conf_dir
local _conpath="$2" local __sed_discard_ignored_files='/\(~\|\.bak\|\.old\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
local s390_prefix="802-3-ethernet.s390-"
local _options=""
local NETTYPE
local SUBCHANNELS
NETTYPE=$(get_nmcli_field_by_conpath "${s390_prefix}nettype" "$_conpath") if [[ "$(uname -m)" != "s390x" ]]; then
SUBCHANNELS=$(get_nmcli_field_by_conpath "${s390_prefix}subchannels" "$_conpath") return
_options=$(get_nmcli_field_by_conpath "${s390_prefix}options" "$_conpath")
if [[ -z $NETTYPE || -z $SUBCHANNELS || -z $_options ]]; then
dwarning "Failed to get znet configuration via nmlci output. Now try sourcing ifcfg script."
source_ifcfg_file "$_netdev"
for i in $OPTIONS; do
_options=${_options},$i
done
fi fi
if [[ -z $NETTYPE || -z $SUBCHANNELS || -z $_options ]]; then _NM_conf_dir="/etc/NetworkManager/system-connections"
exit 1
_config_file=$(_find_znet_nmconnection "$initdir/$_NM_conf_dir" "$__sed_discard_ignored_files")
if [[ -n "$_config_file" ]]; then
ddebug "$_config_file has already contained the znet config"
return
fi fi
echo "rd.znet=${NETTYPE},${SUBCHANNELS},${_options} rd.znet_ifname=$_netdev:${SUBCHANNELS}" > "${initdir}/etc/cmdline.d/30znet.conf" _config_file=$(LANG=C grep -s -E -i -l \
} "^[[:space:]]*SUBCHANNELS=['\"]?([0-9]\.[0-9]\.[a-f0-9]+,){0,2}" \
/etc/sysconfig/network-scripts/ifcfg-* \
| LC_ALL=C sed -e "$__sed_discard_ignored_files")
kdump_get_ip_route() { if [[ -z "$_config_file" ]]; then
local _route _config_file=$(_find_znet_nmconnection "$_NM_conf_dir" "$__sed_discard_ignored_files")
if ! _route=$(/sbin/ip -o route get to "$1" 2>&1); then fi
derror "Bad kdump network destination: $1"
exit 1 if [[ -n "$_config_file" ]]; then
_unique_name=$(cat /proc/sys/kernel/random/uuid)
nmcli connection clone --temporary "$_config_file" "$_unique_name" &> >(ddebug)
nmcli connection modify --temporary "$_unique_name" connection.autoconnect false
inst "/run/NetworkManager/system-connections/${_unique_name}.nmconnection" "${_NM_conf_dir}/${_unique_name}.nmconnection"
nmcli connection del "$_unique_name" &> >(ddebug)
fi fi
echo "$_route"
}
kdump_get_ip_route_field() {
echo "$1" | sed -n -e "s/^.*\<$2\>\s\+\(\S\+\).*$/\1/p"
} }
kdump_get_remote_ip() { kdump_get_remote_ip() {
@ -527,83 +532,55 @@ kdump_get_remote_ip() {
echo "$_remote" echo "$_remote"
} }
# Setup dracut to bring up network interface that enable # Collect netifs needed by kdump
# initramfs accessing giving destination
# $1: destination host # $1: destination host
kdump_install_net() { kdump_collect_netif_usage() {
local _destaddr _srcaddr _route _netdev _conpath kdumpnic local _destaddr _srcaddr _route _netdev
local _static _proto _ip_conf _ip_opts _ifname_opts
local _znet_netdev _znet_conpath
_destaddr=$(kdump_get_remote_ip "$1") _destaddr=$(kdump_get_remote_ip "$1")
_route=$(kdump_get_ip_route "$_destaddr") _route=$(kdump_get_ip_route "$_destaddr")
_srcaddr=$(kdump_get_ip_route_field "$_route" "src") _srcaddr=$(kdump_get_ip_route_field "$_route" "src")
_netdev=$(kdump_get_ip_route_field "$_route" "dev") _netdev=$(kdump_get_ip_route_field "$_route" "dev")
_conpath=$(get_nmcli_connection_apath_by_ifname "$_netdev")
_netmac=$(kdump_get_mac_addr "$_netdev")
kdumpnic=$(kdump_setup_ifname "$_netdev")
_znet_netdev=$(find_online_znet_device)
if [[ -n $_znet_netdev ]]; then
_znet_conpath=$(get_nmcli_connection_apath_by_ifname "$_znet_netdev")
if ! (kdump_setup_znet "$_znet_netdev" "$_znet_conpath"); then
derror "Failed to set up znet"
exit 1
fi
fi
_static=$(kdump_static_ip "$_netdev" "$_srcaddr" "$kdumpnic")
if [[ -n $_static ]]; then
_proto=none
elif is_ipv6_address "$_srcaddr"; then
_proto=auto6
else
_proto=dhcp
fi
_ip_conf="${initdir}/etc/cmdline.d/40ip.conf"
_ip_opts=" ip=${_static}$kdumpnic:${_proto}"
# dracut doesn't allow duplicated configuration for same NIC, even they're exactly the same.
# so we have to avoid adding duplicates
# We should also check /proc/cmdline for existing ip=xx arg.
# For example, iscsi boot will specify ip=xxx arg in cmdline.
if [[ ! -f $_ip_conf ]] || ! grep -q "$_ip_opts" "$_ip_conf" \
&& ! grep -q "ip=[^[:space:]]*$_netdev" /proc/cmdline; then
echo "$_ip_opts" >> "$_ip_conf"
fi
if kdump_is_bridge "$_netdev"; then if kdump_is_bridge "$_netdev"; then
kdump_setup_bridge "$_netdev" kdump_setup_bridge "$_netdev"
elif kdump_is_bond "$_netdev"; then elif kdump_is_bond "$_netdev"; then
(kdump_setup_bond "$_netdev" "$_conpath") || exit 1 kdump_setup_bond "$_netdev" || return 1
elif kdump_is_team "$_netdev"; then elif kdump_is_team "$_netdev"; then
kdump_setup_team "$_netdev" kdump_setup_team "$_netdev"
elif kdump_is_vlan "$_netdev"; then elif kdump_is_vlan "$_netdev"; then
kdump_setup_vlan "$_netdev" kdump_setup_vlan "$_netdev"
else
_ifname_opts=" ifname=$kdumpnic:$_netmac"
echo "$_ifname_opts" >> "$_ip_conf"
fi fi
_save_kdump_netifs "$_netdev"
kdump_setup_dns "$_netdev" "$_conpath"
if [[ ! -f ${initdir}/etc/cmdline.d/50neednet.conf ]]; then if [[ ! -f ${initdir}/etc/cmdline.d/50neednet.conf ]]; then
# network-manager module needs this parameter # network-manager module needs this parameter
echo "rd.neednet" >> "${initdir}/etc/cmdline.d/50neednet.conf" echo "rd.neednet" >> "${initdir}/etc/cmdline.d/50neednet.conf"
fi fi
# Save netdev used for kdump as cmdline if [[ ! -f ${initdir}/etc/cmdline.d/60kdumpip.conf ]]; then
# Whoever calling kdump_install_net() is setting up the default gateway, echo "kdump_remote_ip=$_destaddr" > "${initdir}/etc/cmdline.d/60kdumpip.conf"
# ie. bootdev/kdumpnic. So don't override the setting if calling fi
# kdump_install_net() for another time. For example, after setting eth0 as
# the default gate way for network dump, eth1 in the fence kdump path will if is_ipv6_address "$_srcaddr"; then
# call kdump_install_net again and we don't want eth1 to be the default ipv6_usage[$_netdev]=1
# gateway. else
if [[ ! -f ${initdir}/etc/cmdline.d/60kdumpnic.conf ]] \ ipv4_usage[$_netdev]=1
&& [[ ! -f ${initdir}/etc/cmdline.d/70bootdev.conf ]]; then fi
echo "kdumpnic=$kdumpnic" > "${initdir}/etc/cmdline.d/60kdumpnic.conf" }
echo "bootdev=$kdumpnic" > "${initdir}/etc/cmdline.d/70bootdev.conf"
# Setup dracut to bring up network interface that enable
# initramfs accessing giving destination
kdump_install_net() {
local _netifs
_netifs=$(_get_kdump_netifs)
if [[ -n "$_netifs" ]]; then
kdump_install_nmconnections
apply_nm_initrd_generator_timeouts
kdump_setup_znet
kdump_install_nm_netif_allowlist "$_netifs"
kdump_install_nic_driver "$_netifs"
fi fi
} }
@ -642,7 +619,7 @@ default_dump_target_install_conf() {
_fstype=$(get_fs_type_from_target "$_target") _fstype=$(get_fs_type_from_target "$_target")
if is_fs_type_nfs "$_fstype"; then if is_fs_type_nfs "$_fstype"; then
kdump_install_net "$_target" kdump_collect_netif_usage "$_target"
_fstype="nfs" _fstype="nfs"
else else
_target=$(kdump_get_persistent_dev "$_target") _target=$(kdump_get_persistent_dev "$_target")
@ -673,16 +650,16 @@ kdump_install_conf() {
_pdev=$(persistent_policy="by-id" kdump_get_persistent_dev "$_val") _pdev=$(persistent_policy="by-id" kdump_get_persistent_dev "$_val")
sed -i -e "s#^${_opt}[[:space:]]\+$_val#$_opt $_pdev#" "${initdir}/tmp/$$-kdump.conf" sed -i -e "s#^${_opt}[[:space:]]\+$_val#$_opt $_pdev#" "${initdir}/tmp/$$-kdump.conf"
;; ;;
ext[234] | xfs | btrfs | minix) ext[234] | xfs | btrfs | minix | virtiofs)
_pdev=$(kdump_get_persistent_dev "$_val") _pdev=$(kdump_get_persistent_dev "$_val")
sed -i -e "s#^${_opt}[[:space:]]\+$_val#$_opt $_pdev#" "${initdir}/tmp/$$-kdump.conf" sed -i -e "s#^${_opt}[[:space:]]\+$_val#$_opt $_pdev#" "${initdir}/tmp/$$-kdump.conf"
;; ;;
ssh | nfs) ssh | nfs)
kdump_install_net "$_val" kdump_collect_netif_usage "$_val"
;; ;;
dracut_args) dracut_args)
if [[ $(get_dracut_args_fstype "$_val") == nfs* ]]; then if [[ $(get_dracut_args_fstype "$_val") == nfs* ]]; then
kdump_install_net "$(get_dracut_args_target "$_val")" kdump_collect_netif_usage "$(get_dracut_args_target "$_val")"
fi fi
;; ;;
kdump_pre | kdump_post | extra_bins) kdump_pre | kdump_post | extra_bins)
@ -804,7 +781,7 @@ kdump_setup_iscsi_device() {
[[ -n $username_in ]] && userpwd_in_str=":$username_in:$password_in" [[ -n $username_in ]] && userpwd_in_str=":$username_in:$password_in"
kdump_install_net "$tgt_ipaddr" kdump_collect_netif_usage "$tgt_ipaddr"
# prepare netroot= command line # prepare netroot= command line
# FIXME: Do we need to parse and set other parameters like protocol, port # FIXME: Do we need to parse and set other parameters like protocol, port
@ -840,7 +817,7 @@ kdump_check_iscsi_targets() {
# If our prerequisites are not met, fail anyways. # If our prerequisites are not met, fail anyways.
type -P iscsistart > /dev/null || return 1 type -P iscsistart > /dev/null || return 1
kdump_check_setup_iscsi() ( kdump_check_setup_iscsi() {
local _dev local _dev
_dev=$1 _dev=$1
@ -850,7 +827,7 @@ kdump_check_iscsi_targets() {
cd .. cd ..
done done
[[ -d iscsi_session ]] && kdump_setup_iscsi_device "$PWD" [[ -d iscsi_session ]] && kdump_setup_iscsi_device "$PWD"
) }
[[ $hostonly ]] || [[ $mount_needs ]] && { [[ $hostonly ]] || [[ $mount_needs ]] && {
for_each_host_dev_and_slaves_all kdump_check_setup_iscsi for_each_host_dev_and_slaves_all kdump_check_setup_iscsi
@ -968,7 +945,7 @@ kdump_configure_fence_kdump() {
# setup network for each node # setup network for each node
for node in ${nodes}; do for node in ${nodes}; do
kdump_install_net "$node" kdump_collect_netif_usage "$node"
done done
dracut_install /etc/hosts dracut_install /etc/hosts
@ -1017,6 +994,7 @@ remove_cpu_online_rule() {
} }
install() { install() {
declare -A unique_netifs ipv4_usage ipv6_usage
local arch local arch
kdump_module_init kdump_module_init
@ -1076,6 +1054,8 @@ install() {
inst "ip" inst "ip"
fi fi
kdump_install_net
# For the lvm type target under kdump, in /etc/lvm/lvm.conf we can # For the lvm type target under kdump, in /etc/lvm/lvm.conf we can
# safely replace "reserved_memory=XXXX"(default value is 8192) with # safely replace "reserved_memory=XXXX"(default value is 8192) with
# "reserved_memory=1024" to lower memory pressure under kdump. We do # "reserved_memory=1024" to lower memory pressure under kdump. We do

39
SOURCES/kdump.conf → SOURCES/gen-kdump-conf.sh Normal file → Executable file
View File

@ -1,3 +1,11 @@
#!/bin/bash
# $1: target arch
SED_EXP=""
generate()
{
sed "$SED_EXP" << EOF
# This file contains a series of commands to perform (in order) in the kdump # This file contains a series of commands to perform (in order) in the kdump
# kernel after a kernel crash in the crash kernel(1st kernel) has happened. # kernel after a kernel crash in the crash kernel(1st kernel) has happened.
# #
@ -43,6 +51,7 @@
# It's recommended to use persistent device names # It's recommended to use persistent device names
# such as /dev/vg/<devname>. # such as /dev/vg/<devname>.
# Otherwise it's suggested to use label or uuid. # Otherwise it's suggested to use label or uuid.
# Supported fs types: ext[234], xfs, btrfs, minix, virtiofs
# #
# path <path> # path <path>
# - "path" represents the file system path in which vmcore # - "path" represents the file system path in which vmcore
@ -171,6 +180,7 @@
#ext4 /dev/vg/lv_kdump #ext4 /dev/vg/lv_kdump
#ext4 LABEL=/boot #ext4 LABEL=/boot
#ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937 #ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
#virtiofs myfs
#nfs my.server.com:/export/tmp #nfs my.server.com:/export/tmp
#nfs [2001:db8::1:2:3:4]:/export/tmp #nfs [2001:db8::1:2:3:4]:/export/tmp
#ssh user@my.server.com #ssh user@my.server.com
@ -190,3 +200,32 @@ core_collector makedumpfile -l --message-level 7 -d 31
#dracut_args --omit-drivers "cfg80211 snd" --add-drivers "ext2 ext3" #dracut_args --omit-drivers "cfg80211 snd" --add-drivers "ext2 ext3"
#fence_kdump_args -p 7410 -f auto -c 0 -i 10 #fence_kdump_args -p 7410 -f auto -c 0 -i 10
#fence_kdump_nodes node1 node2 #fence_kdump_nodes node1 node2
EOF
}
update_param()
{
SED_EXP="${SED_EXP}s/^$1.*$/$1 $2/;"
}
case "$1" in
aarch64) ;;
i386) ;;
ppc64) ;;
ppc64le) ;;
s390x)
update_param core_collector \
"makedumpfile -c --message-level 7 -d 31"
;;
x86_64) ;;
*)
echo "Warning: Unknown architecture '$1', using default kdump.conf template."
;;
esac
generate

View File

@ -7,6 +7,7 @@ DEFAULT_PATH="/var/crash/"
KDUMP_CONFIG_FILE="/etc/kdump.conf" KDUMP_CONFIG_FILE="/etc/kdump.conf"
FENCE_KDUMP_CONFIG_FILE="/etc/sysconfig/fence_kdump" FENCE_KDUMP_CONFIG_FILE="/etc/sysconfig/fence_kdump"
FENCE_KDUMP_SEND="/usr/libexec/fence_kdump_send" FENCE_KDUMP_SEND="/usr/libexec/fence_kdump_send"
LVM_CONF="/etc/lvm/lvm.conf"
# Read kdump config in well formated style # Read kdump config in well formated style
kdump_read_conf() kdump_read_conf()
@ -54,6 +55,11 @@ is_fs_type_nfs()
[ "$1" = "nfs" ] || [ "$1" = "nfs4" ] [ "$1" = "nfs" ] || [ "$1" = "nfs4" ]
} }
is_fs_type_virtiofs()
{
[ "$1" = "virtiofs" ]
}
# If $1 contains dracut_args "--mount", return <filesystem type> # If $1 contains dracut_args "--mount", return <filesystem type>
get_dracut_args_fstype() get_dracut_args_fstype()
{ {
@ -109,6 +115,23 @@ is_raw_dump_target()
[ -n "$(kdump_get_conf_val raw)" ] [ -n "$(kdump_get_conf_val raw)" ]
} }
is_virtiofs_dump_target()
{
if [ -n "$(kdump_get_conf_val virtiofs)" ]; then
return 0
fi
if is_fs_type_virtiofs "$(get_dracut_args_fstype "$(kdump_get_conf_val dracut_args)")"; then
return 0
fi
if is_fs_type_virtiofs "$(get_fs_type_from_target "$(get_target_from_path "$(get_save_path)")")"; then
return 0
fi
return 1
}
is_nfs_dump_target() is_nfs_dump_target()
{ {
if [ -n "$(kdump_get_conf_val nfs)" ]; then if [ -n "$(kdump_get_conf_val nfs)" ]; then
@ -128,5 +151,28 @@ is_nfs_dump_target()
is_fs_dump_target() is_fs_dump_target()
{ {
[ -n "$(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix")" ] [ -n "$(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix\|virtiofs")" ]
}
is_lvm2_thinp_device()
{
_device_path=$1
_lvm2_thin_device=$(lvm lvs -S 'lv_layout=sparse && lv_layout=thin' \
--nosuffix --noheadings -o vg_name,lv_name "$_device_path" 2> /dev/null)
[ -n "$_lvm2_thin_device" ]
}
kdump_get_ip_route()
{
if ! _route=$(/sbin/ip -o route get to "$1" 2>&1); then
derror "Bad kdump network destination: $1"
exit 1
fi
echo "$_route"
}
kdump_get_ip_route_field()
{
echo "$1" | sed -n -e "s/^.*\<$2\>\s\+\(\S\+\).*$/\1/p"
} }

View File

@ -34,6 +34,12 @@ is_zstd_command_available()
[[ -x "$(command -v zstd)" ]] [[ -x "$(command -v zstd)" ]]
} }
dracut_have_option()
{
local _option=$1
! dracut "$_option" 2>&1 | grep -q "unrecognized option"
}
perror_exit() perror_exit()
{ {
derror "$@" derror "$@"
@ -78,35 +84,31 @@ to_dev_name()
is_user_configured_dump_target() is_user_configured_dump_target()
{ {
[[ $(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix\|raw\|nfs\|ssh") ]] || is_mount_in_dracut_args [[ $(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix\|raw\|nfs\|ssh\|virtiofs") ]] || is_mount_in_dracut_args
}
get_user_configured_dump_disk()
{
local _target
_target=$(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix\|raw")
[[ -n $_target ]] && echo "$_target" && return
_target=$(get_dracut_args_target "$(kdump_get_conf_val "dracut_args")")
[[ -b $_target ]] && echo "$_target"
} }
get_block_dump_target() get_block_dump_target()
{ {
local _target _path local _target _fstype
if is_ssh_dump_target || is_nfs_dump_target; then if is_ssh_dump_target || is_nfs_dump_target; then
return return
fi fi
_target=$(get_user_configured_dump_disk) _target=$(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix\|raw\|virtiofs")
[[ -n $_target ]] && to_dev_name "$_target" && return [[ -n $_target ]] && to_dev_name "$_target" && return
# Get block device name from local save path _target=$(get_dracut_args_target "$(kdump_get_conf_val "dracut_args")")
_path=$(get_save_path) [[ -b $_target ]] && to_dev_name "$_target" && return
_target=$(get_target_from_path "$_path")
[[ -b $_target ]] && to_dev_name "$_target" _fstype=$(get_dracut_args_fstype "$(kdump_get_conf_val "dracut_args")")
is_fs_type_virtiofs "$_fstype" && echo "$_target" && return
_target=$(get_target_from_path "$(get_save_path)")
[[ -b $_target ]] && to_dev_name "$_target" && return
_fstype=$(get_fs_type_from_target "$_target")
is_fs_type_virtiofs "$_fstype" && echo "$_target" && return
} }
is_dump_to_rootfs() is_dump_to_rootfs()
@ -114,6 +116,12 @@ is_dump_to_rootfs()
[[ $(kdump_get_conf_val 'failure_action\|default') == dump_to_rootfs ]] [[ $(kdump_get_conf_val 'failure_action\|default') == dump_to_rootfs ]]
} }
is_lvm2_thinp_dump_target()
{
_target=$(get_block_dump_target)
[ -n "$_target" ] && is_lvm2_thinp_device "$_target"
}
get_failure_action_target() get_failure_action_target()
{ {
local _target local _target
@ -122,6 +130,7 @@ get_failure_action_target()
# Get rootfs device name # Get rootfs device name
_target=$(get_root_fs_device) _target=$(get_root_fs_device)
[[ -b $_target ]] && to_dev_name "$_target" && return [[ -b $_target ]] && to_dev_name "$_target" && return
is_fs_type_virtiofs "$(get_fs_type_from_target "$_target")" && echo "$_target" && return
# Then, must be nfs root # Then, must be nfs root
echo "nfs" echo "nfs"
fi fi
@ -245,9 +254,9 @@ kdump_get_persistent_dev()
echo $(get_persistent_dev "$dev") echo $(get_persistent_dev "$dev")
} }
is_atomic() is_ostree()
{ {
grep -q "ostree" /proc/cmdline test -f /run/ostree-booted
} }
# get ip address or hostname from nfs/ssh config value # get ip address or hostname from nfs/ssh config value
@ -448,8 +457,7 @@ is_wdt_active()
have_compression_in_dracut_args() have_compression_in_dracut_args()
{ {
[[ "$(kdump_get_conf_val dracut_args)" =~ \ [[ "$(kdump_get_conf_val dracut_args)" =~ (^|[[:space:]])--(gzip|bzip2|lzma|xz|lzo|lz4|zstd|no-compress|compress|squash-compressor)([[:space:]]|$) ]]
(^|[[:space:]])--(gzip|bzip2|lzma|xz|lzo|lz4|zstd|no-compress|compress)([[:space:]]|$) ]]
} }
# If "dracut_args" contains "--mount" information, use it # If "dracut_args" contains "--mount" information, use it
@ -641,8 +649,13 @@ prepare_kdump_kernel()
boot_dirlist=${KDUMP_BOOTDIR:-"/boot /boot/efi /efi /"} boot_dirlist=${KDUMP_BOOTDIR:-"/boot /boot/efi /efi /"}
boot_imglist="$KDUMP_IMG-$kdump_kernelver$KDUMP_IMG_EXT $machine_id/$kdump_kernelver/$KDUMP_IMG" boot_imglist="$KDUMP_IMG-$kdump_kernelver$KDUMP_IMG_EXT $machine_id/$kdump_kernelver/$KDUMP_IMG"
# The kernel of OSTree based systems is not in the standard locations.
if is_ostree; then
boot_dirlist="$(echo /boot/ostree/*) $boot_dirlist"
fi
# Use BOOT_IMAGE as reference if possible, strip the GRUB root device prefix in (hd0,gpt1) format # Use BOOT_IMAGE as reference if possible, strip the GRUB root device prefix in (hd0,gpt1) format
boot_img="$(sed "s/^BOOT_IMAGE=\((\S*)\)\?\(\S*\) .*/\2/" /proc/cmdline)" boot_img="$(grep -P -o '^BOOT_IMAGE=(\S+)' /proc/cmdline | sed "s/^BOOT_IMAGE=\((\S*)\)\?\(\S*\)/\2/")"
if [[ "$boot_img" == *"$kdump_kernelver" ]]; then if [[ "$boot_img" == *"$kdump_kernelver" ]]; then
boot_imglist="$boot_img $boot_imglist" boot_imglist="$boot_img $boot_imglist"
fi fi
@ -672,8 +685,14 @@ prepare_kdump_bootinfo()
if [[ -z $KDUMP_KERNELVER ]]; then if [[ -z $KDUMP_KERNELVER ]]; then
KDUMP_KERNELVER=$(uname -r) KDUMP_KERNELVER=$(uname -r)
# Fadump uses the regular bootloader, unlike kdump. So, use the same version
# for default kernel and capture kernel unless specified explicitly with
# KDUMP_KERNELVER option.
if ! is_fadump_capable; then
nondebug_kernelver=$(sed -n -e 's/\(.*\)+debug$/\1/p' <<< "$KDUMP_KERNELVER") nondebug_kernelver=$(sed -n -e 's/\(.*\)+debug$/\1/p' <<< "$KDUMP_KERNELVER")
fi fi
fi
# Use nondebug kernel if possible, because debug kernel will consume more memory and may oom. # Use nondebug kernel if possible, because debug kernel will consume more memory and may oom.
if [[ -n $nondebug_kernelver ]]; then if [[ -n $nondebug_kernelver ]]; then

View File

@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swio
# This variable lets us append arguments to the current kdump commandline # This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE # after processed by KDUMP_COMMANDLINE_REMOVE
KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never novmcoredd hugetlb_cma=0" KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never novmcoredd hugetlb_cma=0 srcutree.big_cpu_lim=0"
# Any additional kexec arguments required. In most situations, this should # Any additional kexec arguments required. In most situations, this should
# be left empty # be left empty

View File

@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swio
# This variable lets us append arguments to the current kdump commandline # This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE # after processed by KDUMP_COMMANDLINE_REMOVE
KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never novmcoredd hugetlb_cma=0" KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never novmcoredd hugetlb_cma=0 srcutree.big_cpu_lim=0"
# Any additional kexec arguments required. In most situations, this should # Any additional kexec arguments required. In most situations, this should
# be left empty # be left empty

View File

@ -11,10 +11,10 @@ MKFADUMPRD="/sbin/mkfadumprd"
DRACUT_MODULES_FILE="/usr/lib/dracut/modules.txt" DRACUT_MODULES_FILE="/usr/lib/dracut/modules.txt"
SAVE_PATH=/var/crash SAVE_PATH=/var/crash
SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa" SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa"
INITRD_CHECKSUM_LOCATION="/boot/.fadump_initrd_checksum"
DUMP_TARGET="" DUMP_TARGET=""
DEFAULT_INITRD="" DEFAULT_INITRD=""
DEFAULT_INITRD_BAK="" DEFAULT_INITRD_BAK=""
INITRD_CHECKSUM_LOCATION=""
KDUMP_INITRD="" KDUMP_INITRD=""
TARGET_INITRD="" TARGET_INITRD=""
FADUMP_REGISTER_SYS_NODE="/sys/kernel/fadump_registered" FADUMP_REGISTER_SYS_NODE="/sys/kernel/fadump_registered"
@ -44,9 +44,16 @@ fi
single_instance_lock() single_instance_lock()
{ {
local rc timeout=5 local rc timeout=5 lockfile
if ! exec 9> /var/lock/kdump; then if [[ -d /run/lock ]]; then
lockfile=/run/lock/kdump
else
# when updating package using virt-customize, /run/lock doesn't exist
lockfile=/tmp/kdump.lock
fi
if ! exec 9> $lockfile; then
derror "Create file lock failed" derror "Create file lock failed"
exit 1 exit 1
fi fi
@ -181,7 +188,8 @@ backup_default_initrd()
sha1sum "$DEFAULT_INITRD" > "$INITRD_CHECKSUM_LOCATION" sha1sum "$DEFAULT_INITRD" > "$INITRD_CHECKSUM_LOCATION"
if ! cp "$DEFAULT_INITRD" "$DEFAULT_INITRD_BAK"; then if ! cp "$DEFAULT_INITRD" "$DEFAULT_INITRD_BAK"; then
dwarn "WARNING: failed to backup $DEFAULT_INITRD." dwarn "WARNING: failed to backup $DEFAULT_INITRD."
rm -f "$DEFAULT_INITRD_BAK" rm -f -- "$INITRD_CHECKSUM_LOCATION"
rm -f -- "$DEFAULT_INITRD_BAK"
fi fi
fi fi
} }
@ -232,7 +240,7 @@ check_config()
fi fi
config_opt=_target config_opt=_target
;; ;;
ext[234] | minix | btrfs | xfs | nfs | ssh) ext[234] | minix | btrfs | xfs | nfs | ssh | virtiofs)
config_opt=_target config_opt=_target
;; ;;
sshkey | path | core_collector | kdump_post | kdump_pre | extra_bins | extra_modules | failure_action | default | final_action | force_rebuild | force_no_rebuild | fence_kdump_args | fence_kdump_nodes | auto_reset_crashkernel) ;; sshkey | path | core_collector | kdump_post | kdump_pre | extra_bins | extra_modules | failure_action | default | final_action | force_rebuild | force_no_rebuild | fence_kdump_args | fence_kdump_nodes | auto_reset_crashkernel) ;;
@ -307,6 +315,7 @@ setup_initrd()
fi fi
DEFAULT_INITRD_BAK="$KDUMP_BOOTDIR/.$(basename "$DEFAULT_INITRD").default" DEFAULT_INITRD_BAK="$KDUMP_BOOTDIR/.$(basename "$DEFAULT_INITRD").default"
INITRD_CHECKSUM_LOCATION="$DEFAULT_INITRD_BAK.checksum"
if [[ $DEFAULT_DUMP_MODE == "fadump" ]]; then if [[ $DEFAULT_DUMP_MODE == "fadump" ]]; then
TARGET_INITRD="$DEFAULT_INITRD" TARGET_INITRD="$DEFAULT_INITRD"
@ -380,6 +389,7 @@ check_files_modified()
# HOOKS is mandatory and need to check the modification time # HOOKS is mandatory and need to check the modification time
files="$files $HOOKS" files="$files $HOOKS"
is_lvm2_thinp_dump_target && files="$files $LVM_CONF"
check_exist "$files" && check_executable "$EXTRA_BINS" || return 2 check_exist "$files" && check_executable "$EXTRA_BINS" || return 2
for file in $files; do for file in $files; do
@ -468,8 +478,9 @@ check_fs_modified()
fi fi
# No need to check in case of raw target. # No need to check in case of raw target.
# Currently we do not check also if ssh/nfs target is specified # Currently we do not check also if ssh/nfs/virtiofs/thinp target is specified
if is_ssh_dump_target || is_nfs_dump_target || is_raw_dump_target; then if is_ssh_dump_target || is_nfs_dump_target || is_raw_dump_target ||
is_virtiofs_dump_target || is_lvm2_thinp_dump_target; then
return 0 return 0
fi fi
@ -666,6 +677,7 @@ load_kdump()
# and release it. # and release it.
exec 12>&2 exec 12>&2
exec 2>> $KDUMP_LOG_PATH/kdump.log exec 2>> $KDUMP_LOG_PATH/kdump.log
chmod 600 $KDUMP_LOG_PATH/kdump.log
PS4='+ $(date "+%Y-%m-%d %H:%M:%S") ${BASH_SOURCE}@${LINENO}: ' PS4='+ $(date "+%Y-%m-%d %H:%M:%S") ${BASH_SOURCE}@${LINENO}: '
set -x set -x
@ -1068,7 +1080,7 @@ start()
return 1 return 1
fi fi
if check_current_status; then if [[ $DEFAULT_DUMP_MODE == "kdump" ]] && check_current_kdump_status; then
dwarn "Kdump already running: [WARNING]" dwarn "Kdump already running: [WARNING]"
return 0 return 0
fi fi
@ -1212,7 +1224,7 @@ do_estimate()
local kdump_mods local kdump_mods
local -A large_mods local -A large_mods
local baseline local baseline
local kernel_size mod_size initrd_size baseline_size runtime_size reserved_size estimated_size recommended_size local kernel_size mod_size initrd_size baseline_size runtime_size reserved_size estimated_size recommended_size _cryptsetup_overhead
local size_mb=$((1024 * 1024)) local size_mb=$((1024 * 1024))
setup_initrd setup_initrd
@ -1261,12 +1273,22 @@ do_estimate()
for _dev in $(get_all_kdump_crypt_dev); do for _dev in $(get_all_kdump_crypt_dev); do
_crypt_info=$(cryptsetup luksDump "/dev/block/$_dev") _crypt_info=$(cryptsetup luksDump "/dev/block/$_dev")
[[ $(echo "$_crypt_info" | sed -n "s/^Version:\s*\(.*\)/\1/p") == "2" ]] || continue [[ $(echo "$_crypt_info" | sed -n "s/^Version:\s*\(.*\)/\1/p") == "2" ]] || continue
for _mem in $(echo "$_crypt_info" | sed -n "s/\sMemory:\s*\(.*\)/\1/p" | sort -n); do for _mem in $(echo "$_crypt_info" | sed -n "s/\sMemory:\s*\(.*\)/\1/p" | sort -n -r); do
crypt_size=$((crypt_size + _mem * 1024)) crypt_size=$((crypt_size + _mem * 1024))
break break
done done
done done
[[ $crypt_size -ne 0 ]] && echo -e "Encrypted kdump target requires extra memory, assuming using the keyslot with minimun memory requirement\n"
if [[ $crypt_size -ne 0 ]]; then
if [[ $(uname -m) == aarch64 ]]; then
_cryptsetup_overhead=50
else
_cryptsetup_overhead=20
fi
crypt_size=$((crypt_size + _cryptsetup_overhead * size_mb))
echo -e "Encrypted kdump target requires extra memory, assuming using the keyslot with maximum memory requirement\n"
fi
estimated_size=$((kernel_size + mod_size + initrd_size + runtime_size + crypt_size)) estimated_size=$((kernel_size + mod_size + initrd_size + runtime_size + crypt_size))
if [[ $baseline_size -gt $estimated_size ]]; then if [[ $baseline_size -gt $estimated_size ]]; then
@ -1360,7 +1382,7 @@ _filter_grubby_kernel_str()
_find_kernel_path_by_release() _find_kernel_path_by_release()
{ {
local _release="$1" _grubby_kernel_str _kernel_path local _release="$1" _grubby_kernel_str _kernel_path
_grubby_kernel_str=$(grubby --info ALL | grep "^kernel=.*$_release") _grubby_kernel_str=$(grubby --info ALL | grep "^kernel=.*$_release\"$")
_kernel_path=$(_filter_grubby_kernel_str "$_grubby_kernel_str") _kernel_path=$(_filter_grubby_kernel_str "$_grubby_kernel_str")
if [[ -z $_kernel_path ]]; then if [[ -z $_kernel_path ]]; then
derror "kernel $_release doesn't exist" derror "kernel $_release doesn't exist"
@ -1381,26 +1403,25 @@ _get_current_running_kernel_path()
fi fi
} }
_update_grub() _update_kernel_cmdline()
{ {
local _kernel_path=$1 _crashkernel=$2 _dump_mode=$3 _fadump_val=$4 local _kernel_path=$1 _crashkernel=$2 _dump_mode=$3 _fadump_val=$4
if is_atomic; then if is_ostree; then
if rpm-ostree kargs | grep -q "crashkernel="; then if rpm-ostree kargs | grep -q "crashkernel="; then
rpm-ostree kargs --replace="crashkernel=$_crashkernel" rpm-ostree kargs --replace="crashkernel=$_crashkernel"
else else
rpm-ostree kargs --append="crashkernel=$_crashkernel" rpm-ostree kargs --append="crashkernel=$_crashkernel"
fi fi
else else
[[ -f /etc/zipl.conf ]] && zipl_arg="--zipl" grubby --args "crashkernel=$_crashkernel" --update-kernel "$_kernel_path"
grubby --args "crashkernel=$_crashkernel" --update-kernel "$_kernel_path" $zipl_arg
if [[ $_dump_mode == kdump ]]; then if [[ $_dump_mode == kdump ]]; then
grubby --remove-args="fadump" --update-kernel "$_kernel_path" grubby --remove-args="fadump" --update-kernel "$_kernel_path"
else else
grubby --args="fadump=$_fadump_val" --update-kernel "$_kernel_path" grubby --args="fadump=$_fadump_val" --update-kernel "$_kernel_path"
fi fi
fi fi
[[ $zipl_arg ]] && zipl > /dev/null [[ -f /etc/zipl.conf ]] && zipl > /dev/null
} }
_valid_grubby_kernel_path() _valid_grubby_kernel_path()
@ -1448,6 +1469,10 @@ _update_kernel_arg_in_grub_etc_default()
{ {
local _para=$1 _val=$2 _para_val local _para=$1 _val=$2 _para_val
if [[ $(uname -m) == s390x ]]; then
return
fi
if [[ -n $_val ]]; then if [[ -n $_val ]]; then
_para_val="$_para=$_val" _para_val="$_para=$_val"
fi fi
@ -1515,18 +1540,18 @@ reset_crashkernel()
esac esac
done done
# 1. CoreOS uses "rpm-ostree kargs" instead of grubby to manage kernel command # 1. OSTree systems use "rpm-ostree kargs" instead of grubby to manage kernel command
# line. --kernel=ALL doesn't make sense for CoreOS. # line. --kernel=ALL doesn't make sense for OStree.
# 2. CoreOS doesn't support POWER so the dump mode is always kdump. # 2. We don't have any OSTree POWER systems so the dump mode is always kdump.
# 3. "rpm-ostree kargs" would prompt the user to reboot the system after # 3. "rpm-ostree kargs" would prompt the user to reboot the system after
# modifying the kernel command line so there is no need for kexec-tools # modifying the kernel command line so there is no need for kexec-tools
# to repeat it. # to repeat it.
if is_atomic; then if is_ostree; then
_old_crashkernel=$(rpm-ostree kargs | sed -n -E 's/.*(^|\s)crashkernel=(\S*).*/\2/p') _old_crashkernel=$(rpm-ostree kargs | sed -n -E 's/.*(^|\s)crashkernel=(\S*).*/\2/p')
_new_dump_mode=kdump _new_dump_mode=kdump
_new_crashkernel=$(kdump_get_arch_recommend_crashkernel "$_new_dump_mode") _new_crashkernel=$(kdump_get_arch_recommend_crashkernel "$_new_dump_mode")
if [[ $_old_crashkernel != "$_new_crashkernel" ]]; then if [[ $_old_crashkernel != "$_new_crashkernel" ]]; then
_update_grub "" "$_new_crashkernel" "$_new_dump_mode" "" _update_kernel_cmdline "" "$_new_crashkernel" "$_new_dump_mode" ""
if [[ $_reboot == yes ]]; then if [[ $_reboot == yes ]]; then
systemctl reboot systemctl reboot
fi fi
@ -1594,7 +1619,7 @@ reset_crashkernel()
_old_crashkernel=$(get_grub_kernel_boot_parameter "$_kernel" crashkernel) _old_crashkernel=$(get_grub_kernel_boot_parameter "$_kernel" crashkernel)
_old_fadump_val=$(get_grub_kernel_boot_parameter "$_kernel" fadump) _old_fadump_val=$(get_grub_kernel_boot_parameter "$_kernel" fadump)
if [[ $_old_crashkernel != "$_new_crashkernel" || $_old_fadump_val != "$_new_fadump_val" ]]; then if [[ $_old_crashkernel != "$_new_crashkernel" || $_old_fadump_val != "$_new_fadump_val" ]]; then
_update_grub "$_kernel" "$_new_crashkernel" "$_new_dump_mode" "$_new_fadump_val" _update_kernel_cmdline "$_kernel" "$_new_crashkernel" "$_new_dump_mode" "$_new_fadump_val"
if [[ $_reboot != yes ]]; then if [[ $_reboot != yes ]]; then
if [[ $_old_crashkernel != "$_new_crashkernel" ]]; then if [[ $_old_crashkernel != "$_new_crashkernel" ]]; then
_what_is_updated="Updated crashkernel=$_new_crashkernel" _what_is_updated="Updated crashkernel=$_new_crashkernel"
@ -1613,6 +1638,15 @@ reset_crashkernel()
fi fi
} }
_is_bootloader_installed()
{
if [[ $(uname -m) == s390x ]]; then
test -f /etc/zipl.conf
else
test -f /boot/grub2/grub.cfg
fi
}
# update the crashkernel value in GRUB_ETC_DEFAULT if necessary # update the crashkernel value in GRUB_ETC_DEFAULT if necessary
# #
# called by reset_crashkernel_after_update and inherit its array variable # called by reset_crashkernel_after_update and inherit its array variable
@ -1622,6 +1656,10 @@ update_crashkernel_in_grub_etc_default_after_update()
local _crashkernel _fadump_val local _crashkernel _fadump_val
local _dump_mode _old_default_crashkernel _new_default_crashkernel local _dump_mode _old_default_crashkernel _new_default_crashkernel
if [[ $(uname -m) == s390x ]]; then
return
fi
_crashkernel=$(_read_kernel_arg_in_grub_etc_default crashkernel) _crashkernel=$(_read_kernel_arg_in_grub_etc_default crashkernel)
if [[ -z $_crashkernel ]]; then if [[ -z $_crashkernel ]]; then
@ -1647,6 +1685,10 @@ reset_crashkernel_after_update()
local _kernel _crashkernel _dump_mode _fadump_val _old_default_crashkernel _new_default_crashkernel local _kernel _crashkernel _dump_mode _fadump_val _old_default_crashkernel _new_default_crashkernel
declare -A _crashkernel_vals declare -A _crashkernel_vals
if ! _is_bootloader_installed; then
return
fi
_crashkernel_vals[old_kdump]=$(cat /tmp/old_default_crashkernel 2> /dev/null) _crashkernel_vals[old_kdump]=$(cat /tmp/old_default_crashkernel 2> /dev/null)
_crashkernel_vals[old_fadump]=$(cat /tmp/old_default_crashkernel_fadump 2> /dev/null) _crashkernel_vals[old_fadump]=$(cat /tmp/old_default_crashkernel_fadump 2> /dev/null)
_crashkernel_vals[new_kdump]=$(get_default_crashkernel kdump) _crashkernel_vals[new_kdump]=$(get_default_crashkernel kdump)
@ -1663,7 +1705,7 @@ reset_crashkernel_after_update()
if [[ $_crashkernel == "$_old_default_crashkernel" ]] && if [[ $_crashkernel == "$_old_default_crashkernel" ]] &&
[[ $_new_default_crashkernel != "$_old_default_crashkernel" ]]; then [[ $_new_default_crashkernel != "$_old_default_crashkernel" ]]; then
_fadump_val=$(get_grub_kernel_boot_parameter "$_kernel" fadump) _fadump_val=$(get_grub_kernel_boot_parameter "$_kernel" fadump)
if _update_grub "$_kernel" "$_new_default_crashkernel" "$_dump_mode" "$_fadump_val"; then if _update_kernel_cmdline "$_kernel" "$_new_default_crashkernel" "$_dump_mode" "$_fadump_val"; then
echo "For kernel=$_kernel, crashkernel=$_new_default_crashkernel now." echo "For kernel=$_kernel, crashkernel=$_new_default_crashkernel now."
fi fi
fi fi
@ -1697,6 +1739,12 @@ reset_crashkernel_for_installed_kernel()
local _installed_kernel _running_kernel _crashkernel _crashkernel_running local _installed_kernel _running_kernel _crashkernel _crashkernel_running
local _dump_mode_running _fadump_val_running local _dump_mode_running _fadump_val_running
# During package install, only try to reset crashkernel for osbuild
# thus to avoid calling grubby when installing os via anaconda
if ! _is_bootloader_installed && ! _is_osbuild; then
return
fi
if ! _installed_kernel=$(_find_kernel_path_by_release "$1"); then if ! _installed_kernel=$(_find_kernel_path_by_release "$1"); then
exit 1 exit 1
fi fi
@ -1719,9 +1767,11 @@ reset_crashkernel_for_installed_kernel()
_fadump_val_running=$(get_grub_kernel_boot_parameter "$_kernel" fadump) _fadump_val_running=$(get_grub_kernel_boot_parameter "$_kernel" fadump)
if [[ $_crashkernel != "$_crashkernel_running" ]]; then if [[ $_crashkernel != "$_crashkernel_running" ]]; then
if _update_grub "$_installed_kernel" "$_crashkernel_running" "$_dump_mode_running" "$_fadump_val_running"; then if _update_kernel_cmdline "$_installed_kernel" "$_crashkernel_running" "$_dump_mode_running" "$_fadump_val_running"; then
echo "kexec-tools has reset $_installed_kernel to use the new default crashkernel value $_crashkernel_running" echo "kexec-tools has reset $_installed_kernel to use the new default crashkernel value $_crashkernel_running"
fi fi
elif [[ $_crashkernel == auto ]]; then
reset_crashkernel "--kernel=$_installed_kernel"
fi fi
} }
@ -1790,12 +1840,12 @@ main()
shift shift
reset_crashkernel "$@" reset_crashkernel "$@"
;; ;;
reset-crashkernel-after-update) _reset-crashkernel-after-update)
if [[ $(kdump_get_conf_val auto_reset_crashkernel) != no ]]; then if [[ $(kdump_get_conf_val auto_reset_crashkernel) != no ]]; then
reset_crashkernel_after_update reset_crashkernel_after_update
fi fi
;; ;;
reset-crashkernel-for-installed_kernel) _reset-crashkernel-for-installed_kernel)
if [[ $(kdump_get_conf_val auto_reset_crashkernel) != no ]]; then if [[ $(kdump_get_conf_val auto_reset_crashkernel) != no ]]; then
reset_crashkernel_for_installed_kernel "$2" reset_crashkernel_for_installed_kernel "$2"
fi fi

View File

@ -1,76 +0,0 @@
commit 6d0d95ecc04a70f8448d562ff0fbbae237f5c929
Author: Kazuhito Hagio <k-hagio-ab@nec.com>
Date: Thu Apr 21 08:58:29 2022 +0900
[PATCH] Avoid false-positive mem_section validation with vmlinux
Currently get_mem_section() validates if SYMBOL(mem_section) is the address
of the mem_section array first. But there was a report that the first
validation wrongly returned TRUE with -x vmlinux and SPARSEMEM_EXTREME
(4.15+) on s390x. This leads to crash failing statup with the following
seek error:
crash: seek error: kernel virtual address: 67fffc2800 type: "memory section root table"
Skip the first validation when satisfying the conditions.
Reported-by: Dave Wysochanski <dwysocha@redhat.com>
Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
Reviewed-and-Tested-by: Philipp Rudo <prudo@redhat.com>
Reviewed-by: Pingfan Liu <piliu@redhat.com>
diff --git a/makedumpfile-1.7.1/makedumpfile.c b/makedumpfile-1.7.1/makedumpfile.c
index a2f45c84cee3ba57ce3d3cf3f1905e6a03f4fd09..65d1c7c2f02c9ae8ead9de0f0217235fe72b3ca7 100644
--- a/makedumpfile-1.7.1/makedumpfile.c
+++ b/makedumpfile-1.7.1/makedumpfile.c
@@ -3698,6 +3698,22 @@ validate_mem_section(unsigned long *mem_sec,
return ret;
}
+/*
+ * SYMBOL(mem_section) varies with the combination of memory model and
+ * its source:
+ *
+ * SPARSEMEM
+ * vmcoreinfo: address of mem_section root array
+ * -x vmlinux: address of mem_section root array
+ *
+ * SPARSEMEM_EXTREME v1
+ * vmcoreinfo: address of mem_section root array
+ * -x vmlinux: address of mem_section root array
+ *
+ * SPARSEMEM_EXTREME v2 (with 83e3c48729d9 and a0b1280368d1) 4.15+
+ * vmcoreinfo: address of mem_section root array
+ * -x vmlinux: address of pointer to mem_section root array
+ */
static int
get_mem_section(unsigned int mem_section_size, unsigned long *mem_maps,
unsigned int num_section)
@@ -3710,12 +3726,27 @@ get_mem_section(unsigned int mem_section_size, unsigned long *mem_maps,
strerror(errno));
return FALSE;
}
+
+ /*
+ * There was a report that the first validation wrongly returned TRUE
+ * with -x vmlinux and SPARSEMEM_EXTREME v2 on s390x, so skip it.
+ * Howerver, leave the fallback validation as it is for the -i option.
+ */
+ if (is_sparsemem_extreme() && info->name_vmlinux) {
+ unsigned long flag = 0;
+ if (get_symbol_type_name("mem_section", DWARF_INFO_GET_SYMBOL_TYPE,
+ NULL, &flag)
+ && !(flag & TYPE_ARRAY))
+ goto skip_1st_validation;
+ }
+
ret = validate_mem_section(mem_sec, SYMBOL(mem_section),
mem_section_size, mem_maps, num_section);
if (!ret && is_sparsemem_extreme()) {
unsigned long mem_section_ptr;
+skip_1st_validation:
if (!readmem(VADDR, SYMBOL(mem_section), &mem_section_ptr,
sizeof(mem_section_ptr)))
goto out;

View File

@ -0,0 +1,37 @@
From 6b6187f546f0ddad8ea84d22c3f7ad72133dcfe3 Mon Sep 17 00:00:00 2001
From: Sourabh Jain <sourabhjain@linux.ibm.com>
Date: Thu, 15 Sep 2022 14:12:40 +0530
Subject: [PATCH] ppc64: remove rma_top limit
Restricting kexec tool to allocate hole for kexec segments below 768MB
may not be relavent now since first memory block size can be 1024MB and
more.
Removing rma_top restriction will give more space to find holes for
kexec segments and existing in-place checks make sure that kexec segment
allocation doesn't cross the first memory block because every kexec segment
has to be within first memory block for kdump kernel to boot properly.
Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com>
Acked-by: Hari Bathini <hbathini@linux.ibm.com>
Signed-off-by: Simon Horman <horms@kernel.org>
---
kexec/arch/ppc64/kexec-ppc64.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/kexec/arch/ppc64/kexec-ppc64.c b/kexec/arch/ppc64/kexec-ppc64.c
index 5b17740..611809f 100644
--- a/kexec/arch/ppc64/kexec-ppc64.c
+++ b/kexec/arch/ppc64/kexec-ppc64.c
@@ -717,8 +717,6 @@ static int get_devtree_details(unsigned long kexec_flags)
if (base < rma_base) {
rma_base = base;
rma_top = base + be64_to_cpu(((uint64_t *)buf)[1]);
- if (rma_top > 0x30000000UL)
- rma_top = 0x30000000UL;
}
fclose(file);
--
2.38.1

View File

@ -27,7 +27,7 @@ SAVE_PATH=$(get_save_path)
OVERRIDE_RESETTABLE=0 OVERRIDE_RESETTABLE=0
extra_modules="" extra_modules=""
dracut_args=(--add kdumpbase --quiet --hostonly --hostonly-cmdline --hostonly-i18n --hostonly-mode strict -o "plymouth resume ifcfg earlykdump") dracut_args=(--add kdumpbase --quiet --hostonly --hostonly-cmdline --hostonly-i18n --hostonly-mode strict --hostonly-nics '' -o "plymouth resume ifcfg earlykdump")
MKDUMPRD_TMPDIR="$(mktemp -d -t mkdumprd.XXXXXX)" MKDUMPRD_TMPDIR="$(mktemp -d -t mkdumprd.XXXXXX)"
[ -d "$MKDUMPRD_TMPDIR" ] || perror_exit "dracut: mktemp -p -d -t dracut.XXXXXX failed." [ -d "$MKDUMPRD_TMPDIR" ] || perror_exit "dracut: mktemp -p -d -t dracut.XXXXXX failed."
@ -242,7 +242,7 @@ check_user_configured_target()
# For user configured target, use $SAVE_PATH as the dump path within the target # For user configured target, use $SAVE_PATH as the dump path within the target
if [[ ! -d "$_mnt/$SAVE_PATH" ]]; then if [[ ! -d "$_mnt/$SAVE_PATH" ]]; then
perror_exit "Dump path \"$_mnt/$SAVE_PATH\" does not exist in dump target \"$_target\"" perror_exit "Dump path \"$SAVE_PATH\" does not exist in dump target \"$_target\""
fi fi
check_size fs "$_target" check_size fs "$_target"
@ -391,7 +391,7 @@ while read -r config_opt config_val; do
extra_modules) extra_modules)
extra_modules="$extra_modules $config_val" extra_modules="$extra_modules $config_val"
;; ;;
ext[234] | xfs | btrfs | minix | nfs) ext[234] | xfs | btrfs | minix | nfs | virtiofs)
check_user_configured_target "$config_val" "$config_opt" check_user_configured_target "$config_val" "$config_opt"
add_mount "$config_val" "$config_opt" add_mount "$config_val" "$config_opt"
;; ;;
@ -432,10 +432,9 @@ done <<< "$(kdump_read_conf)"
handle_default_dump_target handle_default_dump_target
if ! have_compression_in_dracut_args; then if ! have_compression_in_dracut_args; then
# Here zstd is set as the default compression method. If squash module if is_squash_available && dracut_have_option "--squash-compressor"; then
# is available for dracut, libzstd will be used by mksquashfs. If add_dracut_arg "--squash-compressor" "zstd"
# squash module is unavailable, command zstd will be used instead. elif is_zstd_command_available; then
if is_squash_available || is_zstd_command_available; then
add_dracut_arg "--compress" "zstd" add_dracut_arg "--compress" "zstd"
fi fi
fi fi

View File

@ -38,14 +38,18 @@ FADUMP_INITRD="$MKFADUMPRD_TMPDIR/fadump.img"
# this file tells the initrd is fadump enabled # this file tells the initrd is fadump enabled
touch "$MKFADUMPRD_TMPDIR/fadump.initramfs" touch "$MKFADUMPRD_TMPDIR/fadump.initramfs"
ddebug "rebuild fadump initrd: $FADUMP_INITRD $DEFAULT_INITRD $KDUMP_KERNELVER" ddebug "rebuild fadump initrd: $FADUMP_INITRD $DEFAULT_INITRD $KDUMP_KERNELVER"
if ! $MKDUMPRD "$FADUMP_INITRD" -i "$MKFADUMPRD_TMPDIR/fadump.initramfs" /etc/fadump.initramfs; then # Don't use squash for capture image or default image as it negatively impacts
# compression ratio and increases the size of the initramfs image.
# Don't compress the capture image as uncompressed image is needed immediately.
# Also, early microcode would not be needed here.
if ! $MKDUMPRD "$FADUMP_INITRD" -i "$MKFADUMPRD_TMPDIR/fadump.initramfs" /etc/fadump.initramfs --omit squash --no-compress --no-early-microcode; then
perror_exit "mkfadumprd: failed to build image with dump capture support" perror_exit "mkfadumprd: failed to build image with dump capture support"
fi fi
### Unpack the initramfs having dump capture capability ### Unpack the initramfs having dump capture capability retaining previous file modification time.
# This helps in saving space by hardlinking identical files.
mkdir -p "$MKFADUMPRD_TMPDIR/fadumproot" mkdir -p "$MKFADUMPRD_TMPDIR/fadumproot"
if ! (pushd "$MKFADUMPRD_TMPDIR/fadumproot" > /dev/null && lsinitrd --unpack "$FADUMP_INITRD" && if ! cpio -id --preserve-modification-time --quiet -D "$MKFADUMPRD_TMPDIR/fadumproot" < "$FADUMP_INITRD"; then
popd > /dev/null); then
derror "mkfadumprd: failed to unpack '$MKFADUMPRD_TMPDIR'" derror "mkfadumprd: failed to unpack '$MKFADUMPRD_TMPDIR'"
exit 1 exit 1
fi fi
@ -58,13 +62,9 @@ _dracut_isolate_args=(
/usr/lib/dracut/fadump-kernel-modules.txt /usr/lib/dracut/fadump-kernel-modules.txt
) )
if is_squash_available; then # Use zstd compression method, if available
_dracut_isolate_args+=(--add squash)
fi
# Same as setting zstd in mkdumprd
if ! have_compression_in_dracut_args; then if ! have_compression_in_dracut_args; then
if is_squash_available || is_zstd_command_available; then if is_zstd_command_available; then
_dracut_isolate_args+=(--compress zstd) _dracut_isolate_args+=(--compress zstd)
fi fi
fi fi

View File

@ -45,6 +45,7 @@ storage:
hardware FCoE (qla2xxx, lpfc) hardware FCoE (qla2xxx, lpfc)
software FCoE (bnx2fc) (Extra configuration required, software FCoE (bnx2fc) (Extra configuration required,
please read "Note on FCoE" section below) please read "Note on FCoE" section below)
NVMe-FC (qla2xxx, lpfc)
network: network:
Hardware using kernel modules: (igb, ixgbe, ice, i40e, e1000e, igc, Hardware using kernel modules: (igb, ixgbe, ice, i40e, e1000e, igc,
@ -65,6 +66,7 @@ filesystem:
ext[234] ext[234]
xfs xfs
nfs nfs
virtiofs
firmware: firmware:
BIOS BIOS

View File

@ -1,11 +1,11 @@
%global eppic_ver e8844d3793471163ae4a56d8f95897be9e5bd554 %global eppic_ver e8844d3793471163ae4a56d8f95897be9e5bd554
%global eppic_shortver %(c=%{eppic_ver}; echo ${c:0:7}) %global eppic_shortver %(c=%{eppic_ver}; echo ${c:0:7})
%global mkdf_ver 1.7.1 %global mkdf_ver 1.7.2
%global mkdf_shortver %(c=%{mkdf_ver}; echo ${c:0:7}) %global mkdf_shortver %(c=%{mkdf_ver}; echo ${c:0:7})
Name: kexec-tools Name: kexec-tools
Version: 2.0.24 Version: 2.0.25
Release: 5%{?dist} Release: 13%{?dist}
License: GPLv2 License: GPLv2
Summary: The kexec/kdump userspace component Summary: The kexec/kdump userspace component
@ -16,7 +16,7 @@ Source3: kdump.sysconfig.x86_64
Source4: kdump.sysconfig.i386 Source4: kdump.sysconfig.i386
Source5: kdump.sysconfig.ppc64 Source5: kdump.sysconfig.ppc64
Source7: mkdumprd Source7: mkdumprd
Source8: kdump.conf Source8: gen-kdump-conf.sh
Source9: https://github.com/makedumpfile/makedumpfile/archive/%{mkdf_ver}/makedumpfile-%{mkdf_shortver}.tar.gz Source9: https://github.com/makedumpfile/makedumpfile/archive/%{mkdf_ver}/makedumpfile-%{mkdf_shortver}.tar.gz
Source10: kexec-kdump-howto.txt Source10: kexec-kdump-howto.txt
Source11: fadump-howto.txt Source11: fadump-howto.txt
@ -44,7 +44,8 @@ Source33: 92-crashkernel.install
Source34: crashkernel-howto.txt Source34: crashkernel-howto.txt
Source35: kdump-migrate-action.sh Source35: kdump-migrate-action.sh
Source36: kdump-restart.sh Source36: kdump-restart.sh
Source37: supported-kdump-targets.txt Source37: 60-fadump.install
Source38: supported-kdump-targets.txt
####################################### #######################################
# These are sources for mkdumpramfs # These are sources for mkdumpramfs
@ -71,7 +72,6 @@ Requires: dracut >= 050
Requires: dracut-network >= 050 Requires: dracut-network >= 050
Requires: dracut-squash >= 050 Requires: dracut-squash >= 050
Requires: ethtool Requires: ethtool
Recommends: zstd
Recommends: grubby Recommends: grubby
Recommends: hostname Recommends: hostname
BuildRequires: make BuildRequires: make
@ -100,6 +100,7 @@ Requires: systemd-udev%{?_isa}
# #
# Patches 301 through 400 are meant for ppc64 kexec-tools enablement # Patches 301 through 400 are meant for ppc64 kexec-tools enablement
# #
Patch301: kexec-tools-2.0.25-ppc64-ppc64-remove-rma_top-limit.patch
# #
# Patches 401 through 500 are meant for s390 kexec-tools enablement # Patches 401 through 500 are meant for s390 kexec-tools enablement
@ -112,7 +113,6 @@ Requires: systemd-udev%{?_isa}
# #
# Patches 601 onward are generic patches # Patches 601 onward are generic patches
# #
Patch601: ./kexec-tools-2.0.23-makedumpfile-Avoid_false_positive_mem_section_validation_with_vmlinux.patch
%description %description
kexec-tools provides /sbin/kexec binary that facilitates a new kexec-tools provides /sbin/kexec binary that facilitates a new
@ -128,7 +128,7 @@ mkdir -p -m755 kcp
tar -z -x -v -f %{SOURCE9} tar -z -x -v -f %{SOURCE9}
tar -z -x -v -f %{SOURCE19} tar -z -x -v -f %{SOURCE19}
%patch601 -p1 %patch301 -p1
%ifarch ppc %ifarch ppc
%define archdef ARCH=ppc %define archdef ARCH=ppc
@ -154,7 +154,10 @@ cp %{SOURCE21} .
cp %{SOURCE26} . cp %{SOURCE26} .
cp %{SOURCE27} . cp %{SOURCE27} .
cp %{SOURCE34} . cp %{SOURCE34} .
cp %{SOURCE37} . cp %{SOURCE38} .
# Generate kdump.conf file
%{SOURCE8} %{_target_cpu} > kdump.conf
make make
%ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64 %ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
@ -193,8 +196,7 @@ SYSCONFIG=$RPM_SOURCE_DIR/kdump.sysconfig.%{_target_cpu}
install -m 644 $SYSCONFIG $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/kdump install -m 644 $SYSCONFIG $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/kdump
install -m 755 %{SOURCE7} $RPM_BUILD_ROOT/usr/sbin/mkdumprd install -m 755 %{SOURCE7} $RPM_BUILD_ROOT/usr/sbin/mkdumprd
install -m 755 %{SOURCE32} $RPM_BUILD_ROOT/usr/sbin/mkfadumprd install -m 644 kdump.conf $RPM_BUILD_ROOT%{_sysconfdir}/kdump.conf
install -m 644 %{SOURCE8} $RPM_BUILD_ROOT%{_sysconfdir}/kdump.conf
install -m 644 kexec/kexec.8 $RPM_BUILD_ROOT%{_mandir}/man8/kexec.8 install -m 644 kexec/kexec.8 $RPM_BUILD_ROOT%{_mandir}/man8/kexec.8
install -m 644 %{SOURCE12} $RPM_BUILD_ROOT%{_mandir}/man8/mkdumprd.8 install -m 644 %{SOURCE12} $RPM_BUILD_ROOT%{_mandir}/man8/mkdumprd.8
install -m 644 %{SOURCE25} $RPM_BUILD_ROOT%{_mandir}/man8/kdumpctl.8 install -m 644 %{SOURCE25} $RPM_BUILD_ROOT%{_mandir}/man8/kdumpctl.8
@ -202,6 +204,7 @@ install -m 755 %{SOURCE20} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-lib.sh
install -m 755 %{SOURCE23} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-lib-initramfs.sh install -m 755 %{SOURCE23} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-lib-initramfs.sh
install -m 755 %{SOURCE31} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-logger.sh install -m 755 %{SOURCE31} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-logger.sh
%ifarch ppc64 ppc64le %ifarch ppc64 ppc64le
install -m 755 %{SOURCE32} $RPM_BUILD_ROOT/usr/sbin/mkfadumprd
install -m 755 %{SOURCE35} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-migrate-action.sh install -m 755 %{SOURCE35} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-migrate-action.sh
install -m 755 %{SOURCE36} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-restart.sh install -m 755 %{SOURCE36} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-restart.sh
%endif %endif
@ -215,6 +218,7 @@ install -m 644 %{SOURCE13} $RPM_BUILD_ROOT%{_udevrulesdir}/98-kexec.rules
%endif %endif
%ifarch ppc64 ppc64le %ifarch ppc64 ppc64le
install -m 644 %{SOURCE14} $RPM_BUILD_ROOT%{_udevrulesdir}/98-kexec.rules install -m 644 %{SOURCE14} $RPM_BUILD_ROOT%{_udevrulesdir}/98-kexec.rules
install -m 755 -D %{SOURCE37} $RPM_BUILD_ROOT%{_prefix}/lib/kernel/install.d/60-fadump.install
%endif %endif
install -m 644 %{SOURCE15} $RPM_BUILD_ROOT%{_mandir}/man5/kdump.conf.5 install -m 644 %{SOURCE15} $RPM_BUILD_ROOT%{_mandir}/man5/kdump.conf.5
install -m 644 %{SOURCE16} $RPM_BUILD_ROOT%{_unitdir}/kdump.service install -m 644 %{SOURCE16} $RPM_BUILD_ROOT%{_unitdir}/kdump.service
@ -268,13 +272,19 @@ mkdir -p $RPM_BUILD_ROOT/%{dracutlibdir}/modules.d/
mv $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/* $RPM_BUILD_ROOT/%{dracutlibdir}/modules.d/ mv $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/* $RPM_BUILD_ROOT/%{dracutlibdir}/modules.d/
%pre %pre
# save the old default crashkernel values to /tmp/ when upgrading the package # Save the old default crashkernel values to /tmp/ when upgrading the package
if ! grep -qs "ostree" /proc/cmdline && [ $1 == 2 ] && grep -q get-default-crashkernel /usr/bin/kdumpctl; then # so kdumpctl later can tell if it should update the kernel crashkernel
# parameter in the posttrans scriptlet. Note this feauture of auto-updating
# the kernel crashkernel parameter currently doesn't support ostree, so skip it
# for ostree.
if [ ! -f /run/ostree-booted ] && [ $1 == 2 ] && grep -q get-default-crashkernel /usr/bin/kdumpctl; then
kdumpctl get-default-crashkernel kdump > /tmp/old_default_crashkernel 2>/dev/null kdumpctl get-default-crashkernel kdump > /tmp/old_default_crashkernel 2>/dev/null
%ifarch ppc64 ppc64le %ifarch ppc64 ppc64le
kdumpctl get-default-crashkernel fadump > /tmp/old_default_crashkernel_fadump 2>/dev/null kdumpctl get-default-crashkernel fadump > /tmp/old_default_crashkernel_fadump 2>/dev/null
%endif %endif
fi fi
# don't block package update
:
%post %post
# Initial installation # Initial installation
@ -342,10 +352,15 @@ do
done done
%posttrans %posttrans
# try to reset kernel crashkernel value to new default value when upgrading # Try to reset kernel crashkernel value to new default value based on the old
# the package # default value or set up crasherkernel value for osbuild
if ! grep -qs "ostree" /proc/cmdline && [ $1 == 1 ]; then #
kdumpctl reset-crashkernel-after-update # Note
# 1. Skip ostree systems as they are not supported.
# 2. "[ $1 == 1 ]" in posttrans scriptlet means both install and upgrade. The
# former case is used to set up crashkernel for osbuild
if [ ! -f /run/ostree-booted ] && [ $1 == 1 ]; then
kdumpctl _reset-crashkernel-after-update
rm /tmp/old_default_crashkernel 2>/dev/null rm /tmp/old_default_crashkernel 2>/dev/null
%ifarch ppc64 ppc64le %ifarch ppc64 ppc64le
rm /tmp/old_default_crashkernel_fadump 2>/dev/null rm /tmp/old_default_crashkernel_fadump 2>/dev/null
@ -361,8 +376,11 @@ fi
%ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64 %ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
/usr/sbin/makedumpfile /usr/sbin/makedumpfile
%endif %endif
/usr/sbin/mkdumprd %ifarch ppc64 ppc64le
/usr/sbin/mkfadumprd /usr/sbin/mkfadumprd
%{_prefix}/lib/kernel/install.d/60-fadump.install
%endif
/usr/sbin/mkdumprd
/usr/sbin/vmcore-dmesg /usr/sbin/vmcore-dmesg
%{_bindir}/* %{_bindir}/*
%{_datadir}/kdump %{_datadir}/kdump
@ -410,18 +428,101 @@ fi
%endif %endif
%changelog %changelog
* Fri Mar 10 2023 Tao Liu <ltao@redhat.com> - 2.0.25-13
- kdump-lib: Add the CoreOS kernel dir to the boot_dirlist
- kdump-lib: attempt to fix BOOT_IMAGE detection
- kdump-lib: change how ostree based systems are detected
- kdump-lib: clear up references to Atomic/CoreOS
* Fri Feb 24 2023 Tao Liu <ltao@redhat.com> - 2.0.25-12
- Reset crashkernel to default value if newly installed kernel has crashkernel=auto
- Use the correct command to get architecture
* Wed Jan 11 2023 Pingfan Liu <piliu@redhat.com> - 2.0.25-11
- ppc64: tackle SRCU hang issue
* Tue Dec 27 2022 Pingfan Liu <piliu@redhat.com> - 2.0.25-10
- Update supported-kdump-targets.txt
- dracut-module-setup.sh: skip installing driver for the loopback interface
- Don't try to update crashkernel when bootloader is not installed
- dracut-module-setup.sh: also install the driver of physical NIC for Hyper-V VM with accelerated networking
- fadump: use 'zstd' as the default compression method
- fadump: fix default initrd backup and restore logic
- fadump: add a kernel install hook to clean up fadump initramfs
- fadump: avoid status check while starting in fadump mode
- spec: only install mkfadumprd for ppc
- fadump: preserve file modification time to help with hardlinking
- fadump: do not use squash to reduce image size
* Mon Dec 19 2022 Tao Liu <ltao@redhat.com> - 2.0.25-9
- Add virtiofs to kdump supported-kdump-targets.txt
- dracut-module-setup.sh: stop overwriting dracut's trap handler
* Wed Dec 7 2022 Tao Liu <ltao@redhat.com> - 2.0.25-8
- kexec-tools: ppc64: remove rma_top limit
- kdumpctl: Optimize _find_kernel_path_by_release regex string
- kdump.conf: use a simple generator script to maintain
* Fri Nov 25 2022 Tao Liu <ltao@redhat.com> - 2.0.25-7
- Don't run kdump_check_setup_iscsi in a subshell in order to collect needed network interfaces
* Thu Nov 24 2022 Tao Liu <ltao@redhat.com> - 2.0.25-6
- Simplify setup_znet by copying connection profile to initrd
- Wait for the network to be truly ready before dumping vmcore
- Address the cases where a NIC has a different name in kdump kernel
- Reduce kdump memory consumption by only installing needed NIC drivers
- Reduce kdump memory consumption by not letting NetworkManager manage unneeded network interfaces
- Set up kdump network by directly copying NM connection profile to initrd
- Stop dracut 35network-manager from running nm-initrd-generator
- Apply the timeout configuration of nm-initrd-generator
- Determine whether IPv4 or IPv6 is needed
- Add functions to copy NetworkManage connection profiles to the initramfs
- Fix error for vlan over team network interface
* Fri Nov 11 2022 Tao Liu <ltao@redhat.com> - 2.0.25-5
- Don't check fs modified when dump target is lvm2 thinp
- Add dependency of dracut lvmthinpool-monitor module
- lvm.conf should be check modified if lvm2 thinp enabled
- Add lvm2 thin provision dump target checker
- Fix the sync issue for dump_fs
* Tue Nov 1 2022 Tao Liu <ltao@redhat.com> - 2.0.25-4
- Rebase makedumpfile to 1.7.2
- Include the memory overhead cost of cryptsetup when estimating the memory requirement for LUKS-encrypted target
- Choosing the most memory-consuming key slot when estimating the memory requirement for LUKS-encrypted target
- Skip reading /etc/defaut/grub for s390x
- Only try to reset crashkernel for osbuild during package install
- Prefix reset-crashkernel-{for-installed_kernel,after-update} with underscore
- use /run/ostree-booted to tell if scriptlet is running on OSTree system
* Wed Oct 26 2022 Tao Liu <ltao@redhat.com> - 2.0.25-3
- virtiofs support for kexec-tools
- Seperate dracut and dracut-squash compressor for zstd
* Mon Oct 17 2022 Tao Liu <ltao@redhat.com> - 2.0.25-2
- mkdumprd: Improve error messages on non-existing NFS target directories
- fadump: avoid non-debug kernel use for fadump case
* Wed Sep 21 2022 Tao Liu <ltao@redhat.com> - 2.0.25-1
- Rebase kexec-tools to v2.0.25
- remind the users to run zipl after calling grubby on s390x
- remove useless --zipl when calling grubby to update kernel command line
- skip updating /etc/default/grub for s390x
- Allow to update kexec-tools using virt-customize for cloud base image
- kdumpctl: make the kdump.log root-readable-only
* Tue Jul 12 2022 Tao Liu <ltao@redhat.com> - 2.0.24-5 * Tue Jul 12 2022 Tao Liu <ltao@redhat.com> - 2.0.24-5
- kdump-lib: use non-debug kernels first - kdump-lib: use non-debug kernels first
- kdump-lib: fix typo in variable name - kdump-lib: fix typo in variable name
* Tue Wed 15 2022 Tao Liu <ltao@redhat.com> - 2.0.24-4 * Wed Jun 15 2022 Tao Liu <ltao@redhat.com> - 2.0.24-4
- crashkernel: optimize arm64 reserved size if PAGE_SIZE=4k - crashkernel: optimize arm64 reserved size if PAGE_SIZE=4k
- kdump-lib.sh: Check the output of blkid with sed instead of eval - kdump-lib.sh: Check the output of blkid with sed instead of eval
* Tue Jun 7 2022 Tao Liu <ltao@redhat.com> - 2.0.24-3 * Tue Jun 7 2022 Tao Liu <ltao@redhat.com> - 2.0.24-3
- kdump.sysconfig*: add ignition.firstboot to KDUMP_COMMANDLINE_REMOVE - kdump.sysconfig*: add ignition.firstboot to KDUMP_COMMANDLINE_REMOVE
* Thu May 23 2022 Tao Liu <ltao@redhat.com> - 2.0.24-2 * Mon May 23 2022 Tao Liu <ltao@redhat.com> - 2.0.24-2
- remove the upper bound of default crashkernel value example - remove the upper bound of default crashkernel value example
- update fadump-howto - update fadump-howto
- update kexec-kdump-howto - update kexec-kdump-howto