On Tue, Jan 23, 2024 at 11:07:47AM +0100, Philipp Rudo wrote:
Hi Lichen,
On Mon, 22 Jan 2024 15:59:09 +0800
Lichen Liu <lichliu(a)redhat.com> wrote:
> 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/<FS_UUID>.
>
> During the kdump boot progress, the /dev/disk/by-uuid/<FS_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/<WWID> 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 <bmarzins(a)redhat.com>
> Suggested-by: Dave Young <dyoung(a)redhat.com>
> Signed-off-by: Lichen Liu <lichliu(a)redhat.com>
Looks good. Thanks for the great description in the commit message!
Reviewed-by: Philipp Rudo <prudo(a)redhat.com>
> ---
> dracut-module-setup.sh | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
> index 1dc88dc..0a901c2 100755
> --- a/dracut-module-setup.sh
> +++ b/dracut-module-setup.sh
> @@ -1089,6 +1089,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
> }
Patch merged, thanks to Lichen and Philipp!
--
Best regards,
Coiby