import kexec-tools-2.0.25-12.el9
This commit is contained in:
		
							parent
							
								
									0e9574d79c
								
							
						
					
					
						commit
						6cc94873f3
					
				
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -1,3 +1,3 @@
 | 
			
		||||
SOURCES/eppic-e8844d3.tar.gz
 | 
			
		||||
SOURCES/kexec-tools-2.0.24.tar.xz
 | 
			
		||||
SOURCES/makedumpfile-1.7.1.tar.gz
 | 
			
		||||
SOURCES/kexec-tools-2.0.25.tar.xz
 | 
			
		||||
SOURCES/makedumpfile-1.7.2.tar.gz
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,3 @@
 | 
			
		||||
80ac3f5e77d3c79883edadf14428734db4720009 SOURCES/eppic-e8844d3.tar.gz
 | 
			
		||||
62b7a99779d66ffd07a1684f7b640d32c9697f0c SOURCES/kexec-tools-2.0.24.tar.xz
 | 
			
		||||
8f8485c2a1edbc730f4fa1b96ae3ec8d8f1f9761 SOURCES/makedumpfile-1.7.1.tar.gz
 | 
			
		||||
78d5d4f7e9d358ca234db9c84a551d9d411eb0b5 SOURCES/kexec-tools-2.0.25.tar.xz
 | 
			
		||||
24bce02cd42cdbb960ada4d9e733355582e35784 SOURCES/makedumpfile-1.7.2.tar.gz
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										31
									
								
								SOURCES/60-fadump.install
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										31
									
								
								SOURCES/60-fadump.install
									
									
									
									
									
										Executable 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
 | 
			
		||||
@ -7,7 +7,7 @@ KERNEL_IMAGE="$4"
 | 
			
		||||
 | 
			
		||||
case "$COMMAND" in
 | 
			
		||||
add)
 | 
			
		||||
	kdumpctl reset-crashkernel-for-installed_kernel "$KERNEL_VERSION"
 | 
			
		||||
	kdumpctl _reset-crashkernel-for-installed_kernel "$KERNEL_VERSION"
 | 
			
		||||
	exit 0
 | 
			
		||||
	;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
@ -82,6 +82,8 @@ kernels to the default value is:
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
====================
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -162,9 +162,15 @@ dump_fs()
 | 
			
		||||
	$CORE_COLLECTOR /proc/vmcore "$_dump_fs_path/vmcore-incomplete"
 | 
			
		||||
	_dump_exitcode=$?
 | 
			
		||||
	if [ $_dump_exitcode -eq 0 ]; then
 | 
			
		||||
		mv "$_dump_fs_path/vmcore-incomplete" "$_dump_fs_path/vmcore"
 | 
			
		||||
		sync
 | 
			
		||||
		dinfo "saving vmcore complete"
 | 
			
		||||
		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"
 | 
			
		||||
			dinfo "saving vmcore complete"
 | 
			
		||||
		else
 | 
			
		||||
			derror "sync vmcore failed, exitcode:$_sync_exitcode"
 | 
			
		||||
			return 1
 | 
			
		||||
		fi
 | 
			
		||||
	else
 | 
			
		||||
		derror "saving vmcore failed, exitcode:$_dump_exitcode"
 | 
			
		||||
	fi
 | 
			
		||||
@ -472,27 +478,54 @@ save_vmcore_dmesg_ssh()
 | 
			
		||||
	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()
 | 
			
		||||
{
 | 
			
		||||
	if is_nfs_dump_target || is_ssh_dump_target; then
 | 
			
		||||
		kdumpnic=$(getarg kdumpnic=)
 | 
			
		||||
		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
 | 
			
		||||
 | 
			
		||||
	if ! is_nfs_dump_target && ! is_ssh_dump_target; then
 | 
			
		||||
		return 0
 | 
			
		||||
	fi
 | 
			
		||||
	return 0
 | 
			
		||||
 | 
			
		||||
	_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()
 | 
			
		||||
@ -515,7 +548,7 @@ read_kdump_confs()
 | 
			
		||||
				DUMP_INSTRUCTION="dump_fs $config_val"
 | 
			
		||||
			fi
 | 
			
		||||
			;;
 | 
			
		||||
		ext[234] | xfs | btrfs | minix | nfs)
 | 
			
		||||
		ext[234] | xfs | btrfs | minix | nfs | virtiofs)
 | 
			
		||||
			config_val=$(get_mntpoint_from_target "$config_val")
 | 
			
		||||
			DUMP_INSTRUCTION="dump_fs $config_val"
 | 
			
		||||
			;;
 | 
			
		||||
 | 
			
		||||
@ -1,10 +1,22 @@
 | 
			
		||||
#!/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() {
 | 
			
		||||
    if ! [[ -d "${initdir}/tmp" ]]; then
 | 
			
		||||
        mkdir -p "${initdir}/tmp"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    mkdir -p "$_DRACUT_KDUMP_NM_TMP_DIR"
 | 
			
		||||
 | 
			
		||||
    . /lib/kdump/kdump-lib.sh
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -40,6 +52,14 @@ depends() {
 | 
			
		||||
        _dep="$_dep ssh-client"
 | 
			
		||||
    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
 | 
			
		||||
        _dep="$_dep znet"
 | 
			
		||||
    fi
 | 
			
		||||
@ -84,39 +104,6 @@ source_ifcfg_file() {
 | 
			
		||||
    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
 | 
			
		||||
# $2: string to be repeated
 | 
			
		||||
# $3: separator
 | 
			
		||||
@ -227,89 +214,6 @@ cal_netmask_by_prefix() {
 | 
			
		||||
    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() {
 | 
			
		||||
    cat "/sys/class/net/$1/address"
 | 
			
		||||
}
 | 
			
		||||
@ -326,192 +230,293 @@ kdump_get_perm_addr() {
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Prefix kernel assigned names with "kdump-". EX: eth0 -> kdump-eth0
 | 
			
		||||
# Because kernel assigned names are not persistent between 1st and 2nd
 | 
			
		||||
# kernel. We could probably end up with eth0 being eth1, eth0 being
 | 
			
		||||
# eth1, and naming conflict happens.
 | 
			
		||||
kdump_setup_ifname() {
 | 
			
		||||
    local _ifname
 | 
			
		||||
apply_nm_initrd_generator_timeouts() {
 | 
			
		||||
    local _timeout_conf
 | 
			
		||||
 | 
			
		||||
    # If ifname already has 'kdump-' prefix, we must be switching from
 | 
			
		||||
    # fadump to kdump. Skip prefixing 'kdump-' in this case as adding
 | 
			
		||||
    # another prefix may truncate the ifname. Since an ifname with
 | 
			
		||||
    # 'kdump-' is already persistent, this should be fine.
 | 
			
		||||
    if [[ $1 =~ eth* ]] && [[ ! $1 =~ ^kdump-* ]]; then
 | 
			
		||||
        _ifname="kdump-$1"
 | 
			
		||||
    else
 | 
			
		||||
        _ifname="$1"
 | 
			
		||||
    _timeout_conf=$_DRACUT_KDUMP_NM_TMP_DIR/timeout_conf
 | 
			
		||||
    cat << EOF > "$_timeout_conf"
 | 
			
		||||
[device-95-kdump]
 | 
			
		||||
carrier-wait-timeout=30000
 | 
			
		||||
 | 
			
		||||
[connection-95-kdump]
 | 
			
		||||
ipv4.dhcp-timeout=90
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
    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() {
 | 
			
		||||
    local _netdev=$1
 | 
			
		||||
    local _brif _dev _mac _kdumpdev
 | 
			
		||||
    local _dev
 | 
			
		||||
    for _dev in "/sys/class/net/$_netdev/brif/"*; do
 | 
			
		||||
        [[ -e $_dev ]] || continue
 | 
			
		||||
        _dev=${_dev##*/}
 | 
			
		||||
        _kdumpdev=$_dev
 | 
			
		||||
        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
 | 
			
		||||
            kdump_setup_team "$_dev"
 | 
			
		||||
        elif kdump_is_vlan "$_dev"; then
 | 
			
		||||
            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
 | 
			
		||||
        _brif+="$_kdumpdev,"
 | 
			
		||||
        _save_kdump_netifs "$_dev"
 | 
			
		||||
    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() {
 | 
			
		||||
    local _netdev="$1"
 | 
			
		||||
    local _conpath="$2"
 | 
			
		||||
    local _dev _mac _slaves _kdumpdev _bondoptions
 | 
			
		||||
    for _dev in $(cat "/sys/class/net/$_netdev/bonding/slaves"); do
 | 
			
		||||
        _mac=$(kdump_get_perm_addr "$_dev")
 | 
			
		||||
        _kdumpdev=$(kdump_setup_ifname "$_dev")
 | 
			
		||||
        echo -n " ifname=$_kdumpdev:$_mac" >> "${initdir}/etc/cmdline.d/42bond.conf"
 | 
			
		||||
        _slaves+="$_kdumpdev,"
 | 
			
		||||
    local _dev
 | 
			
		||||
 | 
			
		||||
    for _dev in $(< "/sys/class/net/$_netdev/bonding/slaves"); do
 | 
			
		||||
        _save_kdump_netifs "$_dev"
 | 
			
		||||
    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() {
 | 
			
		||||
    local _netdev=$1
 | 
			
		||||
    local _dev _mac _slaves _kdumpdev
 | 
			
		||||
    local _dev
 | 
			
		||||
    for _dev in $(teamnl "$_netdev" ports | awk -F':' '{print $2}'); do
 | 
			
		||||
        _mac=$(kdump_get_perm_addr "$_dev")
 | 
			
		||||
        _kdumpdev=$(kdump_setup_ifname "$_dev")
 | 
			
		||||
        echo -n " ifname=$_kdumpdev:$_mac" >> "${initdir}/etc/cmdline.d/44team.conf"
 | 
			
		||||
        _slaves+="$_kdumpdev,"
 | 
			
		||||
        _save_kdump_netifs "$_dev"
 | 
			
		||||
    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() {
 | 
			
		||||
    local _netdev=$1
 | 
			
		||||
    local _phydev
 | 
			
		||||
    local _netmac
 | 
			
		||||
    local _kdumpdev
 | 
			
		||||
    local _parent_netif
 | 
			
		||||
 | 
			
		||||
    _phydev="$(awk '/^Device:/{print $2}' /proc/net/vlan/"$_netdev")"
 | 
			
		||||
    _netmac="$(kdump_get_mac_addr "$_phydev")"
 | 
			
		||||
    _parent_netif="$(awk '/^Device:/{print $2}' /proc/net/vlan/"$_netdev")"
 | 
			
		||||
 | 
			
		||||
    #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!"
 | 
			
		||||
        exit 1
 | 
			
		||||
    elif kdump_is_bond "$_phydev"; then
 | 
			
		||||
        (kdump_setup_bond "$_phydev" "$(get_nmcli_connection_apath_by_ifname "$_phydev")") || exit 1
 | 
			
		||||
        echo " vlan=$(kdump_setup_ifname "$_netdev"):$_phydev" > "${initdir}/etc/cmdline.d/43vlan.conf"
 | 
			
		||||
    else
 | 
			
		||||
        _kdumpdev="$(kdump_setup_ifname "$_phydev")"
 | 
			
		||||
        echo " vlan=$(kdump_setup_ifname "$_netdev"):$_kdumpdev ifname=$_kdumpdev:$_netmac" > "${initdir}/etc/cmdline.d/43vlan.conf"
 | 
			
		||||
    elif kdump_is_bond "$_parent_netif"; then
 | 
			
		||||
        kdump_setup_bond "$_parent_netif" || return 1
 | 
			
		||||
    elif kdump_is_team "$_parent_netif"; then
 | 
			
		||||
        kdump_setup_team "$_parent_netif" || return 1
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    _save_kdump_netifs "$_parent_netif"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# find online znet device
 | 
			
		||||
# return ifname (_netdev)
 | 
			
		||||
# code reaped from the list_configured function of
 | 
			
		||||
# https://github.com/hreinecke/s390-tools/blob/master/zconf/znetconf
 | 
			
		||||
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"
 | 
			
		||||
_find_znet_nmconnection() {
 | 
			
		||||
    LANG=C grep -s -E -i -l \
 | 
			
		||||
        "^s390-subchannels=([0-9]\.[0-9]\.[a-f0-9]+;){0,2}" \
 | 
			
		||||
        "$1"/*.nmconnection | LC_ALL=C sed -e "$2"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# setup s390 znet cmdline
 | 
			
		||||
# $1: netdev (ifname)
 | 
			
		||||
# $2: nmcli connection path
 | 
			
		||||
# setup s390 znet
 | 
			
		||||
#
 | 
			
		||||
# Note part of code is extracted from ccw_init provided by s390utils
 | 
			
		||||
kdump_setup_znet() {
 | 
			
		||||
    local _netdev="$1"
 | 
			
		||||
    local _conpath="$2"
 | 
			
		||||
    local s390_prefix="802-3-ethernet.s390-"
 | 
			
		||||
    local _options=""
 | 
			
		||||
    local NETTYPE
 | 
			
		||||
    local SUBCHANNELS
 | 
			
		||||
    local _config_file _unique_name _NM_conf_dir
 | 
			
		||||
    local __sed_discard_ignored_files='/\(~\|\.bak\|\.old\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
 | 
			
		||||
 | 
			
		||||
    NETTYPE=$(get_nmcli_field_by_conpath "${s390_prefix}nettype" "$_conpath")
 | 
			
		||||
    SUBCHANNELS=$(get_nmcli_field_by_conpath "${s390_prefix}subchannels" "$_conpath")
 | 
			
		||||
    _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
 | 
			
		||||
    if [[ "$(uname -m)" != "s390x" ]]; then
 | 
			
		||||
        return
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if [[ -z $NETTYPE || -z $SUBCHANNELS || -z $_options ]]; then
 | 
			
		||||
        exit 1
 | 
			
		||||
    _NM_conf_dir="/etc/NetworkManager/system-connections"
 | 
			
		||||
 | 
			
		||||
    _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
 | 
			
		||||
 | 
			
		||||
    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() {
 | 
			
		||||
    local _route
 | 
			
		||||
    if ! _route=$(/sbin/ip -o route get to "$1" 2>&1); then
 | 
			
		||||
        derror "Bad kdump network destination: $1"
 | 
			
		||||
        exit 1
 | 
			
		||||
    if [[ -z "$_config_file" ]]; then
 | 
			
		||||
        _config_file=$(_find_znet_nmconnection "$_NM_conf_dir" "$__sed_discard_ignored_files")
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
    echo "$_route"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
kdump_get_ip_route_field() {
 | 
			
		||||
    echo "$1" | sed -n -e "s/^.*\<$2\>\s\+\(\S\+\).*$/\1/p"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
kdump_get_remote_ip() {
 | 
			
		||||
@ -527,83 +532,55 @@ kdump_get_remote_ip() {
 | 
			
		||||
    echo "$_remote"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Setup dracut to bring up network interface that enable
 | 
			
		||||
# initramfs accessing giving destination
 | 
			
		||||
# Collect netifs needed by kdump
 | 
			
		||||
# $1: destination host
 | 
			
		||||
kdump_install_net() {
 | 
			
		||||
    local _destaddr _srcaddr _route _netdev _conpath kdumpnic
 | 
			
		||||
    local _static _proto _ip_conf _ip_opts _ifname_opts
 | 
			
		||||
    local _znet_netdev _znet_conpath
 | 
			
		||||
kdump_collect_netif_usage() {
 | 
			
		||||
    local _destaddr _srcaddr _route _netdev
 | 
			
		||||
 | 
			
		||||
    _destaddr=$(kdump_get_remote_ip "$1")
 | 
			
		||||
    _route=$(kdump_get_ip_route "$_destaddr")
 | 
			
		||||
    _srcaddr=$(kdump_get_ip_route_field "$_route" "src")
 | 
			
		||||
    _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
 | 
			
		||||
        kdump_setup_bridge "$_netdev"
 | 
			
		||||
    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
 | 
			
		||||
        kdump_setup_team "$_netdev"
 | 
			
		||||
    elif kdump_is_vlan "$_netdev"; then
 | 
			
		||||
        kdump_setup_vlan "$_netdev"
 | 
			
		||||
    else
 | 
			
		||||
        _ifname_opts=" ifname=$kdumpnic:$_netmac"
 | 
			
		||||
        echo "$_ifname_opts" >> "$_ip_conf"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    kdump_setup_dns "$_netdev" "$_conpath"
 | 
			
		||||
    _save_kdump_netifs "$_netdev"
 | 
			
		||||
 | 
			
		||||
    if [[ ! -f ${initdir}/etc/cmdline.d/50neednet.conf ]]; then
 | 
			
		||||
        # network-manager module needs this parameter
 | 
			
		||||
        echo "rd.neednet" >> "${initdir}/etc/cmdline.d/50neednet.conf"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # Save netdev used for kdump as cmdline
 | 
			
		||||
    # Whoever calling kdump_install_net() is setting up the default gateway,
 | 
			
		||||
    # ie. bootdev/kdumpnic. So don't override the setting if calling
 | 
			
		||||
    # 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
 | 
			
		||||
    # call kdump_install_net again and we don't want eth1 to be the default
 | 
			
		||||
    # gateway.
 | 
			
		||||
    if [[ ! -f ${initdir}/etc/cmdline.d/60kdumpnic.conf ]] \
 | 
			
		||||
        && [[ ! -f ${initdir}/etc/cmdline.d/70bootdev.conf ]]; then
 | 
			
		||||
        echo "kdumpnic=$kdumpnic" > "${initdir}/etc/cmdline.d/60kdumpnic.conf"
 | 
			
		||||
        echo "bootdev=$kdumpnic" > "${initdir}/etc/cmdline.d/70bootdev.conf"
 | 
			
		||||
    if [[ ! -f ${initdir}/etc/cmdline.d/60kdumpip.conf ]]; then
 | 
			
		||||
        echo "kdump_remote_ip=$_destaddr" > "${initdir}/etc/cmdline.d/60kdumpip.conf"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if is_ipv6_address "$_srcaddr"; then
 | 
			
		||||
        ipv6_usage[$_netdev]=1
 | 
			
		||||
    else
 | 
			
		||||
        ipv4_usage[$_netdev]=1
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -642,7 +619,7 @@ default_dump_target_install_conf() {
 | 
			
		||||
 | 
			
		||||
    _fstype=$(get_fs_type_from_target "$_target")
 | 
			
		||||
    if is_fs_type_nfs "$_fstype"; then
 | 
			
		||||
        kdump_install_net "$_target"
 | 
			
		||||
        kdump_collect_netif_usage "$_target"
 | 
			
		||||
        _fstype="nfs"
 | 
			
		||||
    else
 | 
			
		||||
        _target=$(kdump_get_persistent_dev "$_target")
 | 
			
		||||
@ -673,16 +650,16 @@ kdump_install_conf() {
 | 
			
		||||
                _pdev=$(persistent_policy="by-id" kdump_get_persistent_dev "$_val")
 | 
			
		||||
                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")
 | 
			
		||||
                sed -i -e "s#^${_opt}[[:space:]]\+$_val#$_opt $_pdev#" "${initdir}/tmp/$$-kdump.conf"
 | 
			
		||||
                ;;
 | 
			
		||||
            ssh | nfs)
 | 
			
		||||
                kdump_install_net "$_val"
 | 
			
		||||
                kdump_collect_netif_usage "$_val"
 | 
			
		||||
                ;;
 | 
			
		||||
            dracut_args)
 | 
			
		||||
                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
 | 
			
		||||
                ;;
 | 
			
		||||
            kdump_pre | kdump_post | extra_bins)
 | 
			
		||||
@ -804,7 +781,7 @@ kdump_setup_iscsi_device() {
 | 
			
		||||
 | 
			
		||||
    [[ -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
 | 
			
		||||
    # 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.
 | 
			
		||||
    type -P iscsistart > /dev/null || return 1
 | 
			
		||||
 | 
			
		||||
    kdump_check_setup_iscsi() (
 | 
			
		||||
    kdump_check_setup_iscsi() {
 | 
			
		||||
        local _dev
 | 
			
		||||
        _dev=$1
 | 
			
		||||
 | 
			
		||||
@ -850,7 +827,7 @@ kdump_check_iscsi_targets() {
 | 
			
		||||
            cd ..
 | 
			
		||||
        done
 | 
			
		||||
        [[ -d iscsi_session ]] && kdump_setup_iscsi_device "$PWD"
 | 
			
		||||
    )
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [[ $hostonly ]] || [[ $mount_needs ]] && {
 | 
			
		||||
        for_each_host_dev_and_slaves_all kdump_check_setup_iscsi
 | 
			
		||||
@ -968,7 +945,7 @@ kdump_configure_fence_kdump() {
 | 
			
		||||
 | 
			
		||||
    # setup network for each node
 | 
			
		||||
    for node in ${nodes}; do
 | 
			
		||||
        kdump_install_net "$node"
 | 
			
		||||
        kdump_collect_netif_usage "$node"
 | 
			
		||||
    done
 | 
			
		||||
 | 
			
		||||
    dracut_install /etc/hosts
 | 
			
		||||
@ -1017,6 +994,7 @@ remove_cpu_online_rule() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
install() {
 | 
			
		||||
    declare -A unique_netifs ipv4_usage ipv6_usage
 | 
			
		||||
    local arch
 | 
			
		||||
 | 
			
		||||
    kdump_module_init
 | 
			
		||||
@ -1076,6 +1054,8 @@ install() {
 | 
			
		||||
        inst "ip"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    kdump_install_net
 | 
			
		||||
 | 
			
		||||
    # For the lvm type target under kdump, in /etc/lvm/lvm.conf we can
 | 
			
		||||
    # safely replace "reserved_memory=XXXX"(default value is 8192) with
 | 
			
		||||
    # "reserved_memory=1024" to lower memory pressure under kdump. We do
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										39
									
								
								SOURCES/kdump.conf → SOURCES/gen-kdump-conf.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										39
									
								
								SOURCES/kdump.conf → SOURCES/gen-kdump-conf.sh
									
									
									
									
									
										
										
										Normal file → Executable 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
 | 
			
		||||
# 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
 | 
			
		||||
#             such as /dev/vg/<devname>.
 | 
			
		||||
#             Otherwise it's suggested to use label or uuid.
 | 
			
		||||
#             Supported fs types: ext[234], xfs, btrfs, minix, virtiofs
 | 
			
		||||
#
 | 
			
		||||
# path <path>
 | 
			
		||||
#           - "path" represents the file system path in which vmcore
 | 
			
		||||
@ -171,6 +180,7 @@
 | 
			
		||||
#ext4 /dev/vg/lv_kdump
 | 
			
		||||
#ext4 LABEL=/boot
 | 
			
		||||
#ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
 | 
			
		||||
#virtiofs myfs
 | 
			
		||||
#nfs my.server.com:/export/tmp
 | 
			
		||||
#nfs [2001:db8::1:2:3:4]:/export/tmp
 | 
			
		||||
#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"
 | 
			
		||||
#fence_kdump_args -p 7410 -f auto -c 0 -i 10
 | 
			
		||||
#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
 | 
			
		||||
@ -7,6 +7,7 @@ DEFAULT_PATH="/var/crash/"
 | 
			
		||||
KDUMP_CONFIG_FILE="/etc/kdump.conf"
 | 
			
		||||
FENCE_KDUMP_CONFIG_FILE="/etc/sysconfig/fence_kdump"
 | 
			
		||||
FENCE_KDUMP_SEND="/usr/libexec/fence_kdump_send"
 | 
			
		||||
LVM_CONF="/etc/lvm/lvm.conf"
 | 
			
		||||
 | 
			
		||||
# Read kdump config in well formated style
 | 
			
		||||
kdump_read_conf()
 | 
			
		||||
@ -54,6 +55,11 @@ is_fs_type_nfs()
 | 
			
		||||
	[ "$1" = "nfs" ] || [ "$1" = "nfs4" ]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
is_fs_type_virtiofs()
 | 
			
		||||
{
 | 
			
		||||
	[ "$1" = "virtiofs" ]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# If $1 contains dracut_args "--mount", return <filesystem type>
 | 
			
		||||
get_dracut_args_fstype()
 | 
			
		||||
{
 | 
			
		||||
@ -109,6 +115,23 @@ is_raw_dump_target()
 | 
			
		||||
	[ -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()
 | 
			
		||||
{
 | 
			
		||||
	if [ -n "$(kdump_get_conf_val nfs)" ]; then
 | 
			
		||||
@ -128,5 +151,28 @@ is_nfs_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"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -34,6 +34,12 @@ is_zstd_command_available()
 | 
			
		||||
	[[ -x "$(command -v zstd)" ]]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dracut_have_option()
 | 
			
		||||
{
 | 
			
		||||
	local _option=$1
 | 
			
		||||
	! dracut "$_option" 2>&1 | grep -q "unrecognized option"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
perror_exit()
 | 
			
		||||
{
 | 
			
		||||
	derror "$@"
 | 
			
		||||
@ -78,35 +84,31 @@ to_dev_name()
 | 
			
		||||
 | 
			
		||||
is_user_configured_dump_target()
 | 
			
		||||
{
 | 
			
		||||
	[[ $(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix\|raw\|nfs\|ssh") ]] || 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"
 | 
			
		||||
	[[ $(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix\|raw\|nfs\|ssh\|virtiofs") ]] || is_mount_in_dracut_args
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
get_block_dump_target()
 | 
			
		||||
{
 | 
			
		||||
	local _target _path
 | 
			
		||||
	local _target _fstype
 | 
			
		||||
 | 
			
		||||
	if is_ssh_dump_target || is_nfs_dump_target; then
 | 
			
		||||
		return
 | 
			
		||||
	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
 | 
			
		||||
 | 
			
		||||
	# Get block device name from local save path
 | 
			
		||||
	_path=$(get_save_path)
 | 
			
		||||
	_target=$(get_target_from_path "$_path")
 | 
			
		||||
	[[ -b $_target ]] && to_dev_name "$_target"
 | 
			
		||||
	_target=$(get_dracut_args_target "$(kdump_get_conf_val "dracut_args")")
 | 
			
		||||
	[[ -b $_target ]] && to_dev_name "$_target" && return
 | 
			
		||||
 | 
			
		||||
	_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()
 | 
			
		||||
@ -114,6 +116,12 @@ is_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()
 | 
			
		||||
{
 | 
			
		||||
	local _target
 | 
			
		||||
@ -122,6 +130,7 @@ get_failure_action_target()
 | 
			
		||||
		# Get rootfs device name
 | 
			
		||||
		_target=$(get_root_fs_device)
 | 
			
		||||
		[[ -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
 | 
			
		||||
		echo "nfs"
 | 
			
		||||
	fi
 | 
			
		||||
@ -448,8 +457,7 @@ is_wdt_active()
 | 
			
		||||
 | 
			
		||||
have_compression_in_dracut_args()
 | 
			
		||||
{
 | 
			
		||||
	[[ "$(kdump_get_conf_val dracut_args)" =~ \
 | 
			
		||||
		(^|[[:space:]])--(gzip|bzip2|lzma|xz|lzo|lz4|zstd|no-compress|compress)([[:space:]]|$) ]]
 | 
			
		||||
	[[ "$(kdump_get_conf_val dracut_args)" =~ (^|[[:space:]])--(gzip|bzip2|lzma|xz|lzo|lz4|zstd|no-compress|compress|squash-compressor)([[:space:]]|$) ]]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# If "dracut_args" contains "--mount" information, use it
 | 
			
		||||
@ -672,7 +680,13 @@ prepare_kdump_bootinfo()
 | 
			
		||||
 | 
			
		||||
	if [[ -z $KDUMP_KERNELVER ]]; then
 | 
			
		||||
		KDUMP_KERNELVER=$(uname -r)
 | 
			
		||||
		nondebug_kernelver=$(sed -n -e 's/\(.*\)+debug$/\1/p' <<< "$KDUMP_KERNELVER")
 | 
			
		||||
 | 
			
		||||
		# 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")
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	# Use nondebug kernel if possible, because debug kernel will consume more memory and may oom.
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
# 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
 | 
			
		||||
# be left empty
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
# 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
 | 
			
		||||
# be left empty
 | 
			
		||||
 | 
			
		||||
@ -11,10 +11,10 @@ MKFADUMPRD="/sbin/mkfadumprd"
 | 
			
		||||
DRACUT_MODULES_FILE="/usr/lib/dracut/modules.txt"
 | 
			
		||||
SAVE_PATH=/var/crash
 | 
			
		||||
SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa"
 | 
			
		||||
INITRD_CHECKSUM_LOCATION="/boot/.fadump_initrd_checksum"
 | 
			
		||||
DUMP_TARGET=""
 | 
			
		||||
DEFAULT_INITRD=""
 | 
			
		||||
DEFAULT_INITRD_BAK=""
 | 
			
		||||
INITRD_CHECKSUM_LOCATION=""
 | 
			
		||||
KDUMP_INITRD=""
 | 
			
		||||
TARGET_INITRD=""
 | 
			
		||||
FADUMP_REGISTER_SYS_NODE="/sys/kernel/fadump_registered"
 | 
			
		||||
@ -44,9 +44,16 @@ fi
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
		exit 1
 | 
			
		||||
	fi
 | 
			
		||||
@ -181,7 +188,8 @@ backup_default_initrd()
 | 
			
		||||
		sha1sum "$DEFAULT_INITRD" > "$INITRD_CHECKSUM_LOCATION"
 | 
			
		||||
		if ! cp "$DEFAULT_INITRD" "$DEFAULT_INITRD_BAK"; then
 | 
			
		||||
			dwarn "WARNING: failed to backup $DEFAULT_INITRD."
 | 
			
		||||
			rm -f "$DEFAULT_INITRD_BAK"
 | 
			
		||||
			rm -f -- "$INITRD_CHECKSUM_LOCATION"
 | 
			
		||||
			rm -f -- "$DEFAULT_INITRD_BAK"
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
@ -232,7 +240,7 @@ check_config()
 | 
			
		||||
			fi
 | 
			
		||||
			config_opt=_target
 | 
			
		||||
			;;
 | 
			
		||||
		ext[234] | minix | btrfs | xfs | nfs | ssh)
 | 
			
		||||
		ext[234] | minix | btrfs | xfs | nfs | ssh | virtiofs)
 | 
			
		||||
			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) ;;
 | 
			
		||||
@ -307,6 +315,7 @@ setup_initrd()
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	DEFAULT_INITRD_BAK="$KDUMP_BOOTDIR/.$(basename "$DEFAULT_INITRD").default"
 | 
			
		||||
	INITRD_CHECKSUM_LOCATION="$DEFAULT_INITRD_BAK.checksum"
 | 
			
		||||
	if [[ $DEFAULT_DUMP_MODE == "fadump" ]]; then
 | 
			
		||||
		TARGET_INITRD="$DEFAULT_INITRD"
 | 
			
		||||
 | 
			
		||||
@ -380,6 +389,7 @@ check_files_modified()
 | 
			
		||||
 | 
			
		||||
	# HOOKS is mandatory and need to check the modification time
 | 
			
		||||
	files="$files $HOOKS"
 | 
			
		||||
	is_lvm2_thinp_dump_target && files="$files $LVM_CONF"
 | 
			
		||||
	check_exist "$files" && check_executable "$EXTRA_BINS" || return 2
 | 
			
		||||
 | 
			
		||||
	for file in $files; do
 | 
			
		||||
@ -468,8 +478,9 @@ check_fs_modified()
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	# No need to check in case of raw target.
 | 
			
		||||
	# Currently we do not check also if ssh/nfs target is specified
 | 
			
		||||
	if is_ssh_dump_target || is_nfs_dump_target || is_raw_dump_target; then
 | 
			
		||||
	# 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 ||
 | 
			
		||||
		is_virtiofs_dump_target || is_lvm2_thinp_dump_target; then
 | 
			
		||||
		return 0
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
@ -666,6 +677,7 @@ load_kdump()
 | 
			
		||||
	# and release it.
 | 
			
		||||
	exec 12>&2
 | 
			
		||||
	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}: '
 | 
			
		||||
	set -x
 | 
			
		||||
 | 
			
		||||
@ -1068,7 +1080,7 @@ start()
 | 
			
		||||
		return 1
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if check_current_status; then
 | 
			
		||||
	if [[ $DEFAULT_DUMP_MODE == "kdump" ]] && check_current_kdump_status; then
 | 
			
		||||
		dwarn "Kdump already running: [WARNING]"
 | 
			
		||||
		return 0
 | 
			
		||||
	fi
 | 
			
		||||
@ -1212,7 +1224,7 @@ do_estimate()
 | 
			
		||||
	local kdump_mods
 | 
			
		||||
	local -A large_mods
 | 
			
		||||
	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))
 | 
			
		||||
 | 
			
		||||
	setup_initrd
 | 
			
		||||
@ -1261,12 +1273,22 @@ do_estimate()
 | 
			
		||||
	for _dev in $(get_all_kdump_crypt_dev); do
 | 
			
		||||
		_crypt_info=$(cryptsetup luksDump "/dev/block/$_dev")
 | 
			
		||||
		[[ $(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))
 | 
			
		||||
			break
 | 
			
		||||
		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))
 | 
			
		||||
	if [[ $baseline_size -gt $estimated_size ]]; then
 | 
			
		||||
@ -1360,7 +1382,7 @@ _filter_grubby_kernel_str()
 | 
			
		||||
_find_kernel_path_by_release()
 | 
			
		||||
{
 | 
			
		||||
	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")
 | 
			
		||||
	if [[ -z $_kernel_path ]]; then
 | 
			
		||||
		derror "kernel $_release doesn't exist"
 | 
			
		||||
@ -1381,7 +1403,7 @@ _get_current_running_kernel_path()
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_update_grub()
 | 
			
		||||
_update_kernel_cmdline()
 | 
			
		||||
{
 | 
			
		||||
	local _kernel_path=$1 _crashkernel=$2 _dump_mode=$3 _fadump_val=$4
 | 
			
		||||
 | 
			
		||||
@ -1392,15 +1414,14 @@ _update_grub()
 | 
			
		||||
			rpm-ostree kargs --append="crashkernel=$_crashkernel"
 | 
			
		||||
		fi
 | 
			
		||||
	else
 | 
			
		||||
		[[ -f /etc/zipl.conf ]] && zipl_arg="--zipl"
 | 
			
		||||
		grubby --args "crashkernel=$_crashkernel" --update-kernel "$_kernel_path" $zipl_arg
 | 
			
		||||
		grubby --args "crashkernel=$_crashkernel" --update-kernel "$_kernel_path"
 | 
			
		||||
		if [[ $_dump_mode == kdump ]]; then
 | 
			
		||||
			grubby --remove-args="fadump" --update-kernel "$_kernel_path"
 | 
			
		||||
		else
 | 
			
		||||
			grubby --args="fadump=$_fadump_val" --update-kernel "$_kernel_path"
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
	[[ $zipl_arg ]] && zipl > /dev/null
 | 
			
		||||
	[[ -f /etc/zipl.conf ]] && zipl > /dev/null
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_valid_grubby_kernel_path()
 | 
			
		||||
@ -1448,6 +1469,10 @@ _update_kernel_arg_in_grub_etc_default()
 | 
			
		||||
{
 | 
			
		||||
	local _para=$1 _val=$2 _para_val
 | 
			
		||||
 | 
			
		||||
	if [[ $(uname -m) == s390x ]]; then
 | 
			
		||||
		return
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [[ -n $_val ]]; then
 | 
			
		||||
		_para_val="$_para=$_val"
 | 
			
		||||
	fi
 | 
			
		||||
@ -1526,7 +1551,7 @@ reset_crashkernel()
 | 
			
		||||
		_new_dump_mode=kdump
 | 
			
		||||
		_new_crashkernel=$(kdump_get_arch_recommend_crashkernel "$_new_dump_mode")
 | 
			
		||||
		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
 | 
			
		||||
				systemctl reboot
 | 
			
		||||
			fi
 | 
			
		||||
@ -1594,7 +1619,7 @@ reset_crashkernel()
 | 
			
		||||
		_old_crashkernel=$(get_grub_kernel_boot_parameter "$_kernel" crashkernel)
 | 
			
		||||
		_old_fadump_val=$(get_grub_kernel_boot_parameter "$_kernel" fadump)
 | 
			
		||||
		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 [[ $_old_crashkernel != "$_new_crashkernel" ]]; then
 | 
			
		||||
					_what_is_updated="Updated crashkernel=$_new_crashkernel"
 | 
			
		||||
@ -1613,6 +1638,15 @@ reset_crashkernel()
 | 
			
		||||
	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
 | 
			
		||||
#
 | 
			
		||||
# 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 _dump_mode _old_default_crashkernel _new_default_crashkernel
 | 
			
		||||
 | 
			
		||||
	if [[ $(uname -m) == s390x ]]; then
 | 
			
		||||
		return
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	_crashkernel=$(_read_kernel_arg_in_grub_etc_default crashkernel)
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
	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_fadump]=$(cat /tmp/old_default_crashkernel_fadump 2> /dev/null)
 | 
			
		||||
	_crashkernel_vals[new_kdump]=$(get_default_crashkernel kdump)
 | 
			
		||||
@ -1663,7 +1705,7 @@ reset_crashkernel_after_update()
 | 
			
		||||
			if [[ $_crashkernel == "$_old_default_crashkernel" ]] &&
 | 
			
		||||
				[[ $_new_default_crashkernel != "$_old_default_crashkernel" ]]; then
 | 
			
		||||
				_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."
 | 
			
		||||
				fi
 | 
			
		||||
			fi
 | 
			
		||||
@ -1697,6 +1739,12 @@ reset_crashkernel_for_installed_kernel()
 | 
			
		||||
	local _installed_kernel _running_kernel _crashkernel _crashkernel_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
 | 
			
		||||
		exit 1
 | 
			
		||||
	fi
 | 
			
		||||
@ -1719,9 +1767,11 @@ reset_crashkernel_for_installed_kernel()
 | 
			
		||||
	_fadump_val_running=$(get_grub_kernel_boot_parameter "$_kernel" fadump)
 | 
			
		||||
 | 
			
		||||
	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"
 | 
			
		||||
		fi
 | 
			
		||||
	elif [[ $_crashkernel == auto ]]; then
 | 
			
		||||
		reset_crashkernel "--kernel=$_installed_kernel"
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1790,12 +1840,12 @@ main()
 | 
			
		||||
		shift
 | 
			
		||||
		reset_crashkernel "$@"
 | 
			
		||||
		;;
 | 
			
		||||
	reset-crashkernel-after-update)
 | 
			
		||||
	_reset-crashkernel-after-update)
 | 
			
		||||
		if [[ $(kdump_get_conf_val auto_reset_crashkernel) != no ]]; then
 | 
			
		||||
			reset_crashkernel_after_update
 | 
			
		||||
		fi
 | 
			
		||||
		;;
 | 
			
		||||
	reset-crashkernel-for-installed_kernel)
 | 
			
		||||
	_reset-crashkernel-for-installed_kernel)
 | 
			
		||||
		if [[ $(kdump_get_conf_val auto_reset_crashkernel) != no ]]; then
 | 
			
		||||
			reset_crashkernel_for_installed_kernel "$2"
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ SAVE_PATH=$(get_save_path)
 | 
			
		||||
OVERRIDE_RESETTABLE=0
 | 
			
		||||
 | 
			
		||||
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)"
 | 
			
		||||
[ -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
 | 
			
		||||
	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
 | 
			
		||||
 | 
			
		||||
	check_size fs "$_target"
 | 
			
		||||
@ -391,7 +391,7 @@ while read -r config_opt config_val; do
 | 
			
		||||
	extra_modules)
 | 
			
		||||
		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"
 | 
			
		||||
		add_mount "$config_val" "$config_opt"
 | 
			
		||||
		;;
 | 
			
		||||
@ -432,10 +432,9 @@ done <<< "$(kdump_read_conf)"
 | 
			
		||||
handle_default_dump_target
 | 
			
		||||
 | 
			
		||||
if ! have_compression_in_dracut_args; then
 | 
			
		||||
	# Here zstd is set as the default compression method. If squash module
 | 
			
		||||
	# is available for dracut, libzstd will be used by mksquashfs. If
 | 
			
		||||
	# squash module is unavailable, command zstd will be used instead.
 | 
			
		||||
	if is_squash_available || is_zstd_command_available; then
 | 
			
		||||
	if is_squash_available && dracut_have_option "--squash-compressor"; then
 | 
			
		||||
		add_dracut_arg "--squash-compressor" "zstd"
 | 
			
		||||
	elif is_zstd_command_available; then
 | 
			
		||||
		add_dracut_arg "--compress" "zstd"
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@ -38,14 +38,18 @@ FADUMP_INITRD="$MKFADUMPRD_TMPDIR/fadump.img"
 | 
			
		||||
# this file tells the initrd is fadump enabled
 | 
			
		||||
touch "$MKFADUMPRD_TMPDIR/fadump.initramfs"
 | 
			
		||||
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"
 | 
			
		||||
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"
 | 
			
		||||
if ! (pushd "$MKFADUMPRD_TMPDIR/fadumproot" > /dev/null && lsinitrd --unpack "$FADUMP_INITRD" &&
 | 
			
		||||
	popd > /dev/null); then
 | 
			
		||||
if ! cpio -id --preserve-modification-time --quiet -D "$MKFADUMPRD_TMPDIR/fadumproot" < "$FADUMP_INITRD"; then
 | 
			
		||||
	derror "mkfadumprd: failed to unpack '$MKFADUMPRD_TMPDIR'"
 | 
			
		||||
	exit 1
 | 
			
		||||
fi
 | 
			
		||||
@ -58,13 +62,9 @@ _dracut_isolate_args=(
 | 
			
		||||
	/usr/lib/dracut/fadump-kernel-modules.txt
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if is_squash_available; then
 | 
			
		||||
	_dracut_isolate_args+=(--add squash)
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Same as setting zstd in mkdumprd
 | 
			
		||||
# Use zstd compression method, if available
 | 
			
		||||
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)
 | 
			
		||||
	fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@ -45,6 +45,7 @@ storage:
 | 
			
		||||
        hardware FCoE (qla2xxx, lpfc)
 | 
			
		||||
        software FCoE (bnx2fc) (Extra configuration required,
 | 
			
		||||
            please read "Note on FCoE" section below)
 | 
			
		||||
        NVMe-FC (qla2xxx, lpfc)
 | 
			
		||||
 | 
			
		||||
network:
 | 
			
		||||
        Hardware using kernel modules: (igb, ixgbe, ice, i40e, e1000e, igc,
 | 
			
		||||
@ -65,6 +66,7 @@ filesystem:
 | 
			
		||||
        ext[234]
 | 
			
		||||
        xfs
 | 
			
		||||
        nfs
 | 
			
		||||
        virtiofs
 | 
			
		||||
 | 
			
		||||
firmware:
 | 
			
		||||
        BIOS
 | 
			
		||||
 | 
			
		||||
@ -1,11 +1,11 @@
 | 
			
		||||
%global eppic_ver e8844d3793471163ae4a56d8f95897be9e5bd554
 | 
			
		||||
%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})
 | 
			
		||||
 | 
			
		||||
Name: kexec-tools
 | 
			
		||||
Version: 2.0.24
 | 
			
		||||
Release: 5%{?dist}
 | 
			
		||||
Version: 2.0.25
 | 
			
		||||
Release: 12%{?dist}
 | 
			
		||||
License: GPLv2
 | 
			
		||||
Summary: The kexec/kdump userspace component
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@ Source3: kdump.sysconfig.x86_64
 | 
			
		||||
Source4: kdump.sysconfig.i386
 | 
			
		||||
Source5: kdump.sysconfig.ppc64
 | 
			
		||||
Source7: mkdumprd
 | 
			
		||||
Source8: kdump.conf
 | 
			
		||||
Source8: gen-kdump-conf.sh
 | 
			
		||||
Source9: https://github.com/makedumpfile/makedumpfile/archive/%{mkdf_ver}/makedumpfile-%{mkdf_shortver}.tar.gz
 | 
			
		||||
Source10: kexec-kdump-howto.txt
 | 
			
		||||
Source11: fadump-howto.txt
 | 
			
		||||
@ -44,7 +44,8 @@ Source33: 92-crashkernel.install
 | 
			
		||||
Source34: crashkernel-howto.txt
 | 
			
		||||
Source35: kdump-migrate-action.sh
 | 
			
		||||
Source36: kdump-restart.sh
 | 
			
		||||
Source37: supported-kdump-targets.txt
 | 
			
		||||
Source37: 60-fadump.install
 | 
			
		||||
Source38: supported-kdump-targets.txt
 | 
			
		||||
 | 
			
		||||
#######################################
 | 
			
		||||
# These are sources for mkdumpramfs
 | 
			
		||||
@ -71,7 +72,6 @@ Requires: dracut >= 050
 | 
			
		||||
Requires: dracut-network >= 050
 | 
			
		||||
Requires: dracut-squash >= 050
 | 
			
		||||
Requires: ethtool
 | 
			
		||||
Recommends: zstd
 | 
			
		||||
Recommends: grubby
 | 
			
		||||
Recommends: hostname
 | 
			
		||||
BuildRequires: make
 | 
			
		||||
@ -100,6 +100,7 @@ Requires:       systemd-udev%{?_isa}
 | 
			
		||||
#
 | 
			
		||||
# 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
 | 
			
		||||
@ -112,7 +113,6 @@ Requires:       systemd-udev%{?_isa}
 | 
			
		||||
#
 | 
			
		||||
# Patches 601 onward are generic patches
 | 
			
		||||
#
 | 
			
		||||
Patch601: ./kexec-tools-2.0.23-makedumpfile-Avoid_false_positive_mem_section_validation_with_vmlinux.patch
 | 
			
		||||
 | 
			
		||||
%description
 | 
			
		||||
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 %{SOURCE19}
 | 
			
		||||
 | 
			
		||||
%patch601 -p1
 | 
			
		||||
%patch301 -p1
 | 
			
		||||
 | 
			
		||||
%ifarch ppc
 | 
			
		||||
%define archdef ARCH=ppc
 | 
			
		||||
@ -154,7 +154,10 @@ cp %{SOURCE21} .
 | 
			
		||||
cp %{SOURCE26} .
 | 
			
		||||
cp %{SOURCE27} .
 | 
			
		||||
cp %{SOURCE34} .
 | 
			
		||||
cp %{SOURCE37} .
 | 
			
		||||
cp %{SOURCE38} .
 | 
			
		||||
 | 
			
		||||
# Generate kdump.conf file
 | 
			
		||||
%{SOURCE8} %{_target_cpu} > kdump.conf
 | 
			
		||||
 | 
			
		||||
make
 | 
			
		||||
%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 755 %{SOURCE7} $RPM_BUILD_ROOT/usr/sbin/mkdumprd
 | 
			
		||||
install -m 755 %{SOURCE32} $RPM_BUILD_ROOT/usr/sbin/mkfadumprd
 | 
			
		||||
install -m 644 %{SOURCE8} $RPM_BUILD_ROOT%{_sysconfdir}/kdump.conf
 | 
			
		||||
install -m 644 kdump.conf $RPM_BUILD_ROOT%{_sysconfdir}/kdump.conf
 | 
			
		||||
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 %{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 %{SOURCE31} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-logger.sh
 | 
			
		||||
%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 %{SOURCE36} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-restart.sh
 | 
			
		||||
%endif
 | 
			
		||||
@ -215,6 +218,7 @@ install -m 644 %{SOURCE13} $RPM_BUILD_ROOT%{_udevrulesdir}/98-kexec.rules
 | 
			
		||||
%endif
 | 
			
		||||
%ifarch ppc64 ppc64le
 | 
			
		||||
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
 | 
			
		||||
install -m 644 %{SOURCE15} $RPM_BUILD_ROOT%{_mandir}/man5/kdump.conf.5
 | 
			
		||||
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/
 | 
			
		||||
 | 
			
		||||
%pre
 | 
			
		||||
# 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
 | 
			
		||||
# Save the old default crashkernel values to /tmp/ when upgrading the package
 | 
			
		||||
# 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
 | 
			
		||||
%ifarch ppc64 ppc64le
 | 
			
		||||
  kdumpctl get-default-crashkernel fadump > /tmp/old_default_crashkernel_fadump 2>/dev/null
 | 
			
		||||
%endif
 | 
			
		||||
fi
 | 
			
		||||
# don't block package update
 | 
			
		||||
:
 | 
			
		||||
 | 
			
		||||
%post
 | 
			
		||||
# Initial installation
 | 
			
		||||
@ -342,10 +352,15 @@ do
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
%posttrans
 | 
			
		||||
# try to reset kernel crashkernel value to new default value when upgrading
 | 
			
		||||
# the package
 | 
			
		||||
if ! grep -qs "ostree" /proc/cmdline && [ $1 == 1 ]; then
 | 
			
		||||
  kdumpctl reset-crashkernel-after-update
 | 
			
		||||
# Try to reset kernel crashkernel value to new default value based on the old
 | 
			
		||||
# default value or set up crasherkernel value for osbuild
 | 
			
		||||
#
 | 
			
		||||
# 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
 | 
			
		||||
%ifarch ppc64 ppc64le
 | 
			
		||||
  rm /tmp/old_default_crashkernel_fadump 2>/dev/null
 | 
			
		||||
@ -361,8 +376,11 @@ fi
 | 
			
		||||
%ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
 | 
			
		||||
/usr/sbin/makedumpfile
 | 
			
		||||
%endif
 | 
			
		||||
/usr/sbin/mkdumprd
 | 
			
		||||
%ifarch ppc64 ppc64le
 | 
			
		||||
/usr/sbin/mkfadumprd
 | 
			
		||||
%{_prefix}/lib/kernel/install.d/60-fadump.install
 | 
			
		||||
%endif
 | 
			
		||||
/usr/sbin/mkdumprd
 | 
			
		||||
/usr/sbin/vmcore-dmesg
 | 
			
		||||
%{_bindir}/*
 | 
			
		||||
%{_datadir}/kdump
 | 
			
		||||
@ -410,18 +428,95 @@ fi
 | 
			
		||||
%endif
 | 
			
		||||
 | 
			
		||||
%changelog
 | 
			
		||||
* 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
 | 
			
		||||
- kdump-lib: use non-debug kernels first
 | 
			
		||||
- 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
 | 
			
		||||
- 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
 | 
			
		||||
- 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
 | 
			
		||||
- update fadump-howto
 | 
			
		||||
- update kexec-kdump-howto
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user