From 78e19be071ead366a10e369464cacab792b17a52 Mon Sep 17 00:00:00 2001 From: Lichen Liu Date: Wed, 24 Jan 2024 15:50:54 +0800 Subject: [PATCH] dracut-module-setup: Skip initrd-cleanup and initrd-parse-etc in kdump Resolves: https://issues.redhat.com/browse/RHEL-13996 Upstream: Fedora Conflict: None commit 468336700df86b52cd673d68561ba460ff2390be Author: Lichen Liu Date: Mon Jan 22 15:59:09 2024 +0800 dracut-module-setup: Skip initrd-cleanup and initrd-parse-etc in kdump When using multipath devices as the target for kdump, if user_friendly_name is also specified, devices default to names like "mpath*", e.g., mpatha. In dracut, we obtain a persistent device name via get_persistent_dev. However, dracut currently believes using /dev/mapper/mpath* could cause issues, thus alternatively names are used, here it's /dev/disk/by-uuid/. During the kdump boot progress, the /dev/disk/by-uuid/ will exist as soon as one of the path devices exists, but it won't be usable by systemd, since multipathd will claim that device as a path device. Then multipathd will get stopped before it can create the multipath device. Without user_friendly_name, /dev/mapper/ is considered a persistent device name, avoiding the issue. The exit of multipathd is due to two dependencies in the current dracut module 90multipath/multipathd.service, "Before=initrd-cleanup.service" and "Conflicts=initrd-cleanup.service". As per man 5 systemd.unit, if A.service has "Conflicts=B.service", starting B.service will stop A.service. This is useful during normal boot. However, we will never switch-root after capturing vmcore in kdump. We need to ensure that multipathd is not killed due to such dependency issue. Without modifying multipathd.service, we add ConditionPathExists=!/proc/vmcore to skip initrd-cleanup.service in kdump. This approach is beneficial as it avoid the potential termination of other services that conflict with initrd-cleanup.service. Also skip initrd-parse-etc.service as it will try to start initrd-cleanup.service. Both of these services are used for switch root, so they can be safely skipped in kdump. Suggested-by: Benjamin Marzinski Suggested-by: Dave Young Signed-off-by: Lichen Liu Reviewed-by: Philipp Rudo Signed-off-by: Lichen Liu --- dracut-module-setup.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh index 03d0cba..bcbb2e5 100755 --- a/dracut-module-setup.sh +++ b/dracut-module-setup.sh @@ -1100,6 +1100,15 @@ install() { 's/\(^[[:space:]]*reserved_memory[[:space:]]*=\)[[:space:]]*[[:digit:]]*/\1 1024/' \ "${initdir}/etc/lvm/lvm.conf" &> /dev/null + # Skip initrd-cleanup.service and initrd-parse-etc.service becasue we don't + # need to switch root. Instead of removing them, we use ConditionPathExists + # to check if /proc/vmcore exists to determine if we are in kdump. + sed -i '/\[Unit\]/a ConditionPathExists=!\/proc\/vmcore' \ + "${initdir}/${systemdsystemunitdir}/initrd-cleanup.service" &> /dev/null + + sed -i '/\[Unit\]/a ConditionPathExists=!\/proc\/vmcore' \ + "${initdir}/${systemdsystemunitdir}/initrd-parse-etc.service" &> /dev/null + # Save more memory by dropping switch root capability dracut_no_switch_root }