]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
fix(dracut-shutdown): add cleanup handler on failure
authorRenaud Métrich <rmetrich@redhat.com>
Thu, 13 Jan 2022 16:35:59 +0000 (17:35 +0100)
committerJóhann B. Guðmundsson <johannbg@gmail.com>
Wed, 2 Feb 2022 22:53:31 +0000 (22:53 +0000)
It may happen that dracut-shutdown.service fails, for example on timeout
due to very low bandwidth.
In such case, for hardening purposes, a new dracut-shutdown-onfailure.service
unit doing dracut-shutdown.service cleanup needs to execute to make sure
switching root to an incomplete initramfs won't occur later.

See also RHBZ #1924587 (https://bugzilla.redhat.com/show_bug.cgi?id=1924587).

Makefile
modules.d/98dracut-systemd/dracut-shutdown-onfailure.service [new file with mode: 0644]
modules.d/98dracut-systemd/dracut-shutdown.service
modules.d/98dracut-systemd/dracut-shutdown.service.8.asc
pkgbuild/dracut.spec

index 85e1020aeee403abacb7c277864bfb8cacc54a37..ab47fed86041d5b8d87d8e218626a39b6d042516 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -178,6 +178,7 @@ ifneq ($(enable_documentation),no)
 endif
        if [ -n "$(systemdsystemunitdir)" ]; then \
                mkdir -p $(DESTDIR)$(systemdsystemunitdir); \
+               ln -srf $(DESTDIR)$(pkglibdir)/modules.d/98dracut-systemd/dracut-shutdown-onfailure.service $(DESTDIR)$(systemdsystemunitdir)/dracut-shutdown-onfailure.service; \
                ln -srf $(DESTDIR)$(pkglibdir)/modules.d/98dracut-systemd/dracut-shutdown.service $(DESTDIR)$(systemdsystemunitdir)/dracut-shutdown.service; \
                mkdir -p $(DESTDIR)$(systemdsystemunitdir)/sysinit.target.wants; \
                ln -s ../dracut-shutdown.service \
diff --git a/modules.d/98dracut-systemd/dracut-shutdown-onfailure.service b/modules.d/98dracut-systemd/dracut-shutdown-onfailure.service
new file mode 100644 (file)
index 0000000..96de58c
--- /dev/null
@@ -0,0 +1,13 @@
+#  This file is part of dracut.
+#
+# See dracut.bootup(7) for details
+
+[Unit]
+Description=Service executing upon dracut-shutdown failure to perform cleanup
+Documentation=man:dracut-shutdown.service(8)
+DefaultDependencies=no
+
+[Service]
+Type=oneshot
+ExecStart=-/bin/rm /run/initramfs/shutdown
+StandardError=null
index 81043b2d84f5fc161fb5cbfb4915d4420d78eb99..7c36f14f44217d29c898090f534609f2442e7716 100644 (file)
@@ -10,6 +10,7 @@ Wants=local-fs.target
 Conflicts=shutdown.target umount.target
 DefaultDependencies=no
 ConditionPathExists=!/run/initramfs/bin/sh
+OnFailure=dracut-shutdown-onfailure.service
 
 [Service]
 RemainAfterExit=yes
index ba80b1875d66acf7e4cc82e989eaf47a3003c61b..21ec88caa1c5729ac9bfe3b535432d1dd02b1d8b 100644 (file)
@@ -40,6 +40,9 @@ by injecting "rd.break=pre-shutdown rd.shell" or "rd.break=shutdown rd.shell".
 # touch /run/initramfs/.need_shutdown
 ----
 
+In case the unpack of the initramfs fails, dracut-shutdown-onfailure.service
+executes to make sure switch root doesn't happen, since it would result in
+switching to an incomplete initramfs.
 
 AUTHORS
 -------
index f94cbb3e90bbfe7113208c04f0e4ab3d7655f01e..eca626bd8f5dce2b55822c8ff302cbef4baaae77 100644 (file)
@@ -416,6 +416,7 @@ echo 'dracut_rescue_image="yes"' > $RPM_BUILD_ROOT%{dracutlibdir}/dracut.conf.d/
 %dir %{_sharedstatedir}/initramfs
 %if %{defined _unitdir}
 %{_unitdir}/dracut-shutdown.service
+%{_unitdir}/dracut-shutdown-onfailure.service
 %{_unitdir}/sysinit.target.wants/dracut-shutdown.service
 %{_unitdir}/dracut-cmdline.service
 %{_unitdir}/dracut-initqueue.service