diff --git a/SOURCES/dracut-module-setup.sh b/SOURCES/dracut-module-setup.sh index bcbb2e5..8b67c86 100755 --- a/SOURCES/dracut-module-setup.sh +++ b/SOURCES/dracut-module-setup.sh @@ -391,10 +391,18 @@ _get_hpyerv_physical_driver() { _get_nic_driver "$_physical_nic" } +_get_physical_function_driver() { + local _physfn_dir=/sys/class/net/"$1"/device/physfn + + if [[ -e "$_physfn_dir" ]]; then + basename "$(readlink -f "$_physfn_dir"/driver)" + fi +} + kdump_install_nic_driver() { local _netif _driver _drivers - _drivers=() + _drivers=('=drivers/net/phy' '=drivers/net/mdio') for _netif in $1; do [[ $_netif == lo ]] && continue @@ -418,6 +426,9 @@ kdump_install_nic_driver() { fi _drivers+=("$_driver") + # For a Single Root I/O Virtualization (SR-IOV) virtual device, + # the driver of physical device needs to be installed as well + _drivers+=("$(_get_physical_function_driver "$_netif")") done [[ -n ${_drivers[*]} ]] || return @@ -483,6 +494,24 @@ _find_znet_nmconnection() { "$1"/*.nmconnection | LC_ALL=C sed -e "$2" } +kdump_setup_ovs() { + local _netdev="$1" + local _dev _phy_if + + _phy_if=$(ovs_find_phy_if "$_netdev") + + if kdump_is_bridge "$_phy_if"; then + kdump_setup_vlan "$_phy_if" + elif kdump_is_bond "$_phy_if"; then + kdump_setup_bond "$_phy_if" || return 1 + elif kdump_is_team "$_phy_if"; then + derror "Ovs bridge over team is not supported!" + exit 1 + fi + + _save_kdump_netifs "$_phy_if" +} + # setup s390 znet # # Note part of code is extracted from ccw_init provided by s390utils @@ -534,6 +563,28 @@ kdump_get_remote_ip() { echo "$_remote" } +# Find the physical interface of Open vSwitch (Ovs) bridge +# +# The physical network interface has the same MAC address as the Ovs bridge +ovs_find_phy_if() { + local _mac _dev + _mac=$(kdump_get_mac_addr $1) + + for _dev in $(ovs-vsctl list-ifaces $1); do + if [[ $_mac == $("${initdir}/etc/sysconfig/openvswitch" + + KDUMP_DROP_IN_DIR="${initdir}/etc/systemd/system/nm-initrd.service.d" + mkdir -p "$KDUMP_DROP_IN_DIR" + printf "[Unit]\nAfter=openvswitch.service\n" >$KDUMP_DROP_IN_DIR/01-after-ovs.conf + + $SYSTEMCTL -q --root "$initdir" enable openvswitch.service + $SYSTEMCTL -q --root "$initdir" add-wants basic.target openvswitch.service +} + # Setup dracut to bring up network interface that enable # initramfs accessing giving destination kdump_install_net() { @@ -616,6 +693,7 @@ kdump_install_net() { kdump_install_nm_netif_allowlist "$_netifs" kdump_install_nic_driver "$_netifs" kdump_install_resolv_conf + kdump_install_ovs_deps fi } @@ -1030,7 +1108,7 @@ remove_cpu_online_rule() { install() { declare -A unique_netifs ipv4_usage ipv6_usage - local arch + local arch has_ovs_bridge kdump_module_init kdump_install_conf @@ -1077,6 +1155,9 @@ install() { # Also redirect dracut-emergency to kdump error handler ln_r "$systemdsystemunitdir/emergency.service" "$systemdsystemunitdir/dracut-emergency.service" + # Disable ostree as we only need the physical root + systemctl -q --root "$initdir" mask ostree-prepare-root.service + # Check for all the devices and if any device is iscsi, bring up iscsi # target. Ideally all this should be pushed into dracut iscsi module # at some point of time. diff --git a/SOURCES/kdump-lib-initramfs.sh b/SOURCES/kdump-lib-initramfs.sh index 41dc751..6eaec93 100755 --- a/SOURCES/kdump-lib-initramfs.sh +++ b/SOURCES/kdump-lib-initramfs.sh @@ -101,8 +101,15 @@ get_fs_type_from_target() get_mntpoint_from_target() { - # --source is applied to ensure non-bind mount is returned - get_mount_info TARGET source "$1" -f + local SOURCE TARGET + findmnt -k --pairs -o SOURCE,TARGET "$1" | while read line; do + eval "$line" + # omit sources that are bind mounts i.e. they contain a [/path/to/subpath]. + if [[ ! "$SOURCE" =~ \[ ]]; then + echo $TARGET + break + fi + done } is_ssh_dump_target() diff --git a/SOURCES/kdump-lib.sh b/SOURCES/kdump-lib.sh index 1890bb7..28ee6c0 100755 --- a/SOURCES/kdump-lib.sh +++ b/SOURCES/kdump-lib.sh @@ -15,7 +15,7 @@ is_uki() img="$1" [[ -f "$img" ]] || return - [[ "$(file -b --mime-type "$img")" == application/x-dosexec ]] || return + [[ "$(objdump -a "$img" 2> /dev/null)" =~ pei-(x86-64|aarch64-little) ]] || return objdump -h -j .linux "$img" &> /dev/null } @@ -213,7 +213,7 @@ get_bind_mount_source() _fsroot=${_src#${_src_nofsroot}[} _fsroot=${_fsroot%]} - _mnt=$(get_mount_info TARGET source "$_src_nofsroot" -f) + _mnt=$(get_mntpoint_from_target "$_src_nofsroot") # for btrfs, _fsroot will also contain the subvol value as well, strip it if [[ $_fstype == btrfs ]]; then diff --git a/SOURCES/kdump.sysconfig b/SOURCES/kdump.sysconfig index c1143f3..a185e41 100644 --- a/SOURCES/kdump.sysconfig +++ b/SOURCES/kdump.sysconfig @@ -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 reset_devices novmcoredd cma=0 hugetlb_cma=0" +KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices novmcoredd cma=0 hugetlb_cma=0" # Any additional kexec arguments required. In most situations, this should # be left empty diff --git a/SOURCES/kdump.sysconfig.ppc64 b/SOURCES/kdump.sysconfig.ppc64 index 1b0cdc7..b7c4e79 100644 --- a/SOURCES/kdump.sysconfig.ppc64 +++ b/SOURCES/kdump.sysconfig.ppc64 @@ -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 nr_cpus=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" # Any additional kexec arguments required. In most situations, this should # be left empty diff --git a/SOURCES/kdump.sysconfig.ppc64le b/SOURCES/kdump.sysconfig.ppc64le index d951def..c1cee45 100644 --- a/SOURCES/kdump.sysconfig.ppc64le +++ b/SOURCES/kdump.sysconfig.ppc64le @@ -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 nr_cpus=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" # Any additional kexec arguments required. In most situations, this should # be left empty diff --git a/SOURCES/kdump.sysconfig.x86_64 b/SOURCES/kdump.sysconfig.x86_64 index 6a3ba6e..09d7350 100644 --- a/SOURCES/kdump.sysconfig.x86_64 +++ b/SOURCES/kdump.sysconfig.x86_64 @@ -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 nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 acpi_no_memhotplug transparent_hugepage=never nokaslr hest_disable novmcoredd cma=0 hugetlb_cma=0" +KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 acpi_no_memhotplug transparent_hugepage=never nokaslr hest_disable novmcoredd cma=0 hugetlb_cma=0 pcie_ports=compat" # Any additional kexec arguments required. In most situations, this should # be left empty diff --git a/SOURCES/kdumpctl b/SOURCES/kdumpctl index 503e44e..cb20708 100755 --- a/SOURCES/kdumpctl +++ b/SOURCES/kdumpctl @@ -5,7 +5,6 @@ KDUMP_KERNELVER="" KDUMP_KERNEL="" KDUMP_COMMANDLINE="" KEXEC_ARGS="" -KDUMP_LOG_PATH="/var/log" MKDUMPRD="/sbin/mkdumprd -f" MKFADUMPRD="/sbin/mkfadumprd" DRACUT_MODULES_FILE="/usr/lib/dracut/modules.txt" @@ -21,7 +20,7 @@ TARGET_INITRD="" DEFAULT_DUMP_MODE="kdump" image_time=0 -standard_kexec_args="-d -p" +standard_kexec_args="-p" # Some default values in case /etc/sysconfig/kdump doesn't include KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug" @@ -639,7 +638,7 @@ function load_kdump_kernel_key() # as the currently running kernel. load_kdump() { - local ret uki + local uki KEXEC_ARGS=$(prepare_kexec_args "${KEXEC_ARGS}") KDUMP_COMMANDLINE=$(prepare_cmdline "${KDUMP_COMMANDLINE}" "${KDUMP_COMMANDLINE_REMOVE}" "${KDUMP_COMMANDLINE_APPEND}") @@ -656,26 +655,12 @@ load_kdump() ddebug "$KEXEC $KEXEC_ARGS $standard_kexec_args --command-line=$KDUMP_COMMANDLINE --initrd=$TARGET_INITRD $KDUMP_KERNEL" - # The '12' represents an intermediate temporary file descriptor - # to store the standard error file descriptor '2', and later - # restore the error file descriptor with the file descriptor '12' - # 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 - # shellcheck disable=SC2086 $KEXEC $KEXEC_ARGS $standard_kexec_args \ --command-line="$KDUMP_COMMANDLINE" \ --initrd="$TARGET_INITRD" "$KDUMP_KERNEL" - ret=$? - set +x - exec 2>&12 12>&- - - if [[ $ret == 0 ]]; then + if [[ $? == 0 ]]; then dinfo "kexec: loaded kdump kernel" return 0 else @@ -1658,6 +1643,7 @@ reset_crashkernel() _old_crashkernel=$(get_grub_kernel_boot_parameter "$_kernel" crashkernel) _old_fadump_val=$(get_grub_kernel_boot_parameter "$_kernel" fadump) + [[ "$_new_fadump_val" == off ]] && _new_fadump_val="" if [[ $_old_crashkernel != "$_new_crashkernel" || $_old_fadump_val != "$_new_fadump_val" ]]; then _update_kernel_cmdline "$_kernel" "$_new_crashkernel" "$_new_dump_mode" "$_new_fadump_val" if [[ $_reboot != yes ]]; then diff --git a/SOURCES/kdumpctl.8 b/SOURCES/kdumpctl.8 index 33c1115..29a6119 100644 --- a/SOURCES/kdumpctl.8 +++ b/SOURCES/kdumpctl.8 @@ -62,6 +62,10 @@ grubby's kernel-path=ALL and kernel-path=DEFAULT. ppc64le supports FADump and supports an additional [--fadump=[on|off|nocma]] parameter to toggle FADump on/off. +If the optional parameter [--reboot] is provided the system will automatically +reboot for changes to take effect. If no changes were made to the kernel +command line the reboot is omitted. + Note: The memory requirements for kdump varies heavily depending on the used hardware and system configuration. Thus the recommended crashkernel might not work for your specific setup. Please test if diff --git a/SOURCES/kexec-kdump-howto.txt b/SOURCES/kexec-kdump-howto.txt index 6741faf..c65d45a 100644 --- a/SOURCES/kexec-kdump-howto.txt +++ b/SOURCES/kexec-kdump-howto.txt @@ -1016,12 +1016,7 @@ Debugging Tips and the second kernel. In the first kernel, you can find the historical logs with the journalctl - command and check kdump service debugging information. In addition, the - 'kexec -d' debugging messages are also saved to /var/log/kdump.log in the - first kernel. For example: - - [root@ibm-z-109 ~]# ls -al /var/log/kdump.log - -rw-r--r--. 1 root root 63238 Oct 28 06:40 /var/log/kdump.log + command and check kdump service debugging information. If you want to get the debugging information of building kdump initramfs, you can enable the '--debug' option for the dracut_args in the /etc/kdump.conf, and diff --git a/SOURCES/kexec_file-add-kexec_file-flag-to-support-debug-prin.patch b/SOURCES/kexec_file-add-kexec_file-flag-to-support-debug-prin.patch new file mode 100644 index 0000000..7ded28a --- /dev/null +++ b/SOURCES/kexec_file-add-kexec_file-flag-to-support-debug-prin.patch @@ -0,0 +1,44 @@ +From 9d9cf8de8b2ad8273861a30476a46f34cd34871a Mon Sep 17 00:00:00 2001 +From: Baoquan He +Date: Tue, 14 Nov 2023 23:20:30 +0800 +Subject: [PATCH] kexec_file: add kexec_file flag to support debug printing +Content-type: text/plain + +This add KEXEC_FILE_DEBUG to kexec_file_flags so that it can be passed +to kernel when '-d' is added with kexec_file_load interface. With that +flag enabled, kernel can enable the debugging message printing. + +Signed-off-by: Baoquan He +Signed-off-by: Simon Horman +--- + kexec/kexec-syscall.h | 1 + + kexec/kexec.c | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/kexec/kexec-syscall.h b/kexec/kexec-syscall.h +index 2559bffb93da..73e52543e1b0 100644 +--- a/kexec/kexec-syscall.h ++++ b/kexec/kexec-syscall.h +@@ -119,6 +119,7 @@ static inline long kexec_file_load(int kernel_fd, int initrd_fd, + #define KEXEC_FILE_UNLOAD 0x00000001 + #define KEXEC_FILE_ON_CRASH 0x00000002 + #define KEXEC_FILE_NO_INITRAMFS 0x00000004 ++#define KEXEC_FILE_DEBUG 0x00000008 + + /* These values match the ELF architecture values. + * Unless there is a good reason that should continue to be the case. +diff --git a/kexec/kexec.c b/kexec/kexec.c +index 9d0ec46e5657..222f79e3112e 100644 +--- a/kexec/kexec.c ++++ b/kexec/kexec.c +@@ -1477,6 +1477,7 @@ int main(int argc, char *argv[]) + return 0; + case OPT_DEBUG: + kexec_debug = 1; ++ kexec_file_flags |= KEXEC_FILE_DEBUG; + break; + case OPT_NOIFDOWN: + skip_ifdown = 1; +-- +2.41.0 + diff --git a/SOURCES/mkdumprd b/SOURCES/mkdumprd index dc69e2f..af0006d 100644 --- a/SOURCES/mkdumprd +++ b/SOURCES/mkdumprd @@ -257,7 +257,7 @@ check_user_configured_target() verify_core_collector() { local _cmd="${1%% *}" - local _params="${1#* }" + local _params="${1#${_cmd}}" if [[ $_cmd != "makedumpfile" ]]; then if is_raw_dump_target; then diff --git a/SPECS/kexec-tools.spec b/SPECS/kexec-tools.spec index aa54097..46abc54 100644 --- a/SPECS/kexec-tools.spec +++ b/SPECS/kexec-tools.spec @@ -5,7 +5,7 @@ Name: kexec-tools Version: 2.0.27 -Release: 8%{?dist} +Release: 15%{?dist} License: GPLv2 Summary: The kexec/kdump userspace component @@ -114,6 +114,7 @@ Requires: systemd-udev%{?_isa} # Patches 601 onward are generic patches # Patch601: kexec-update-manpage-with-explicit-mention-of-clean-.patch +Patch602: kexec_file-add-kexec_file-flag-to-support-debug-prin.patch %description kexec-tools provides /sbin/kexec binary that facilitates a new @@ -130,6 +131,7 @@ tar -z -x -v -f %{SOURCE9} tar -z -x -v -f %{SOURCE19} %patch601 -p1 +%patch602 -p1 %ifarch ppc %define archdef ARCH=ppc @@ -408,6 +410,33 @@ fi %endif %changelog +* Wed Aug 7 2024 Tao Liu - 2.0.27-15 +- Support setting up Open vSwitch (Ovs) Bridge network + +* Wed Jul 24 2024 Tao Liu - 2.0.27-14 +- lib: Ensure we don't find bind mounts for device target +- dracut: Disable ostree-prepare-root + +* Tue Jul 16 2024 Tao Liu - 2.0.27-13 +- kdump-lib: Drop 'file' dependency in is_uki +- kdumpctl.8: Add description to reset-crashkernel --reboot +- kdumpctl: Fix misleading message and erratic reboot in reset_crashkernel +- kdumpctl: Drop default kexec '-d' option + +* Thu Jun 27 2024 Tao Liu - 2.0.27-12 +- ppc64le: replace kernel cmdline maxcpu=1 with nr_cpus=1 + +* Fri May 31 2024 Tao Liu - 2.0.27-11 +- sysconfig: add pcie_ports compat to KDUMP_COMMANDLINE_APPEND on x86_64 + +* Tue May 14 2024 Tao Liu - 2.0.27-10 +- mkdumprd: Fix makedumpfile parameter check. +- Install the driver of physical device for a SR-IOV virtual device +- Try to install PHY and MDIO bus drivers explicitly + +* Wed May 08 2024 Tao Liu - 2.0.27-9 +- kexec_file: add kexec_file flag to support debug printing + * Tue Jan 30 2024 Tao Liu - 2.0.27-8 - dracut-module-setup: Skip initrd-cleanup and initrd-parse-etc in kdump