On Fri, Apr 2, 2021 at 12:28 PM Coiby Xu <coxu(a)redhat.com> wrote:
On Thu, Mar 18, 2021 at 01:12:30PM +0800, Kairui Song wrote:
>The wrapper is introduced in commit 002337c, according to the commit
>message, the only usage of the wrapper is when dracut-initqueue calls
>"systemctl start emergency" directly. In that case, emergency
>is started, but not in a isolation mode, which means dracut-initqueue
>is still running. On the other hand, emergency will call
>"systemctl start dracut-initqueue" again when default action is
dump_to_rootfs.
>
>systemd would block on the last dracut-initqueue, waiting for the first
>instance to exit, which leaves us hang.
>
>In previous commit we added initqueue status detect in dump_to_rootfs,
>so now even without the wrapper, it will not hang.
>
>And actually, previously, with the wrapper, emergency might still hang
>for like 30s. When dracut called emergency service because initqueue
>timed out, dump_to_rootfs will try start initqueue again and timeout
>again. Now with the wrapper removed, we can avoid these two kinds of
>hangs, bacause without the isolation we can detect initqueue service
>status correctly in such case.
>
I'm curious why should we start dracut-initqueue again in
dump_to_rootfs? When failure_action=dump_to_rootfs and I comment out
"systemctl start dracut-initqueue", kdump works fine. And if
dracut-iniqueue timed out before (e.g. because the dump target is nfs
and there's no response from nfs server), won't dracut-initque time out
again if we start it?
Hi Coiby,
It depends on how kdump failed, and how rootfs is structured.
If kdump failed before starting initqueue, then it might be necessary
to start initqueue.
The initqueue is responsible for a lot of things. eg. setup lvm
mappers. If the rootfs is a partition on lvm, we will have to setup
lvm mappers first, so we need to ensure the initqueue is started. If
the initqueue haven't started yet, kdump can't find the rootfs.
Same for rootfs over net, and any other rootfs structure.
>Also remove the invalid header comments in service file, the
service
>is not part of systemd code. And sync the service spec with dracut.
>
>Signed-off-by: Kairui Song <kasong(a)redhat.com>
>---
> dracut-kdump-emergency.service | 25 +++++++++++-----------
> dracut-kdump-error-handler.service | 33 ------------------------------
> dracut-module-setup.sh | 1 -
> kexec-tools.spec | 2 --
> 4 files changed, 12 insertions(+), 49 deletions(-)
> delete mode 100644 dracut-kdump-error-handler.service
>
>diff --git a/dracut-kdump-emergency.service b/dracut-kdump-emergency.service
>index e023284..f2f6fad 100644
>--- a/dracut-kdump-emergency.service
>+++ b/dracut-kdump-emergency.service
>@@ -1,27 +1,26 @@
>-# This file is part of systemd.
>-#
>-# systemd is free software; you can redistribute it and/or modify it
>-# under the terms of the GNU Lesser General Public License as published by
>-# the Free Software Foundation; either version 2.1 of the License, or
>-# (at your option) any later version.
>-
>-# This service will be placed in kdump initramfs and replace both the systemd
>-# emergency service and dracut emergency shell. IOW, any emergency will be
>-# kick this service and in turn isolating to kdump error handler.
>+# This service will run the real kdump error handler code. Executing the
>+# failure action configured in kdump.conf
>
> [Unit]
>-Description=Kdump Emergency
>+Description=Kdump Error Handler
> DefaultDependencies=no
>-IgnoreOnIsolate=yes
>+After=systemd-vconsole-setup.service
>+Wants=systemd-vconsole-setup.service
>
> [Service]
>-ExecStart=/usr/bin/systemctl --no-block isolate kdump-error-handler.service
>+Environment=HOME=/
>+Environment=DRACUT_SYSTEMD=1
>+Environment=NEWROOT=/sysroot
>+WorkingDirectory=/
>+ExecStart=/bin/kdump-error-handler.sh
>+ExecStopPost=-/bin/rm -f -- /.console_lock
> Type=oneshot
> StandardInput=tty-force
> StandardOutput=inherit
> StandardError=inherit
> KillMode=process
> IgnoreSIGPIPE=no
>+TasksMax=infinity
>
> # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash
> # terminates cleanly.
>diff --git a/dracut-kdump-error-handler.service b/dracut-kdump-error-handler.service
>deleted file mode 100644
>index a23b75e..0000000
>--- a/dracut-kdump-error-handler.service
>+++ /dev/null
>@@ -1,33 +0,0 @@
>-# This file is part of systemd.
>-#
>-# systemd is free software; you can redistribute it and/or modify it
>-# under the terms of the GNU Lesser General Public License as published by
>-# the Free Software Foundation; either version 2.1 of the License, or
>-# (at your option) any later version.
>-
>-# This service will run the real kdump error handler code. Executing the
>-# failure action configured in kdump.conf
>-
>-[Unit]
>-Description=Kdump Error Handler
>-DefaultDependencies=no
>-After=systemd-vconsole-setup.service
>-Wants=systemd-vconsole-setup.service
>-AllowIsolate=yes
>-
>-[Service]
>-Environment=HOME=/
>-Environment=DRACUT_SYSTEMD=1
>-Environment=NEWROOT=/sysroot
>-WorkingDirectory=/
>-ExecStart=/bin/kdump-error-handler.sh
>-Type=oneshot
>-StandardInput=tty-force
>-StandardOutput=inherit
>-StandardError=inherit
>-KillMode=process
>-IgnoreSIGPIPE=no
>-
>-# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash
>-# terminates cleanly.
>-KillSignal=SIGHUP
>diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
>index 21143b4..ac0f196 100755
>--- a/dracut-module-setup.sh
>+++ b/dracut-module-setup.sh
>@@ -856,7 +856,6 @@ install() {
> inst "$moddir/kdump-capture.service"
"$systemdsystemunitdir/kdump-capture.service"
> systemctl -q --root "$initdir" add-wants initrd.target
kdump-capture.service
> inst "$moddir/kdump-error-handler.sh"
"/usr/bin/kdump-error-handler.sh"
>- inst "$moddir/kdump-error-handler.service"
"$systemdsystemunitdir/kdump-error-handler.service"
> # Replace existing emergency service and emergency target
> cp "$moddir/kdump-emergency.service"
"$initdir/$systemdsystemunitdir/emergency.service"
> cp "$moddir/kdump-emergency.target"
"$initdir/$systemdsystemunitdir/emergency.target"
>diff --git a/kexec-tools.spec b/kexec-tools.spec
>index 00cf64c..f81b523 100644
>--- a/kexec-tools.spec
>+++ b/kexec-tools.spec
>@@ -49,7 +49,6 @@ Source101: dracut-module-setup.sh
> Source102: dracut-monitor_dd_progress
> Source103: dracut-kdump-error-handler.sh
> Source104: dracut-kdump-emergency.service
>-Source105: dracut-kdump-error-handler.service
> Source106: dracut-kdump-capture.service
> Source107: dracut-kdump-emergency.target
> Source108: dracut-early-kdump.sh
>@@ -228,7 +227,6 @@ cp %{SOURCE101}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpb
> cp %{SOURCE102}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE102}}
> cp %{SOURCE103}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE103}}
> cp %{SOURCE104}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE104}}
>-cp %{SOURCE105}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE105}}
> cp %{SOURCE106}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE106}}
> cp %{SOURCE107}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE107}}
> chmod 755
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE100}}
>--
>2.29.2
>_______________________________________________
>kexec mailing list -- kexec(a)lists.fedoraproject.org
>To unsubscribe send an email to kexec-leave(a)lists.fedoraproject.org
>Fedora Code of Conduct:
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
>List Guidelines:
https://fedoraproject.org/wiki/Mailing_list_guidelines
>List Archives:
https://lists.fedoraproject.org/archives/list/kexec@lists.fedoraproject.org
>Do not reply to spam on the list, report it:
https://pagure.io/fedora-infrastructure
--
Best regards,
Coiby
--
Best Regards,
Kairui Song