From: Martin Wilck Date: Mon, 9 Oct 2017 12:39:12 +0000 (+0200) Subject: emergency.service: use Type=idle X-Git-Tag: 047~95 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4c2d98c75b0dd3dad45430becb78c9d40bc6be1b;p=thirdparty%2Fdracut.git emergency.service: use Type=idle Type=oneshot, as currently set in dracut's emergency service file, causes an awkward situation if emergency mode is entered e.g. because of a root device timeout, and the root device appears later because it just has taken longer than the timeout. In that situation, my expectation (backed by past positive experience) is that the user should be able to simply exit the emergency shell and resume normal boot. :/# systemctl status sysroot.mount ● sysroot.mount - /sysroot Loaded: loaded (/proc/cmdline; bad; vendor preset: enabled) Active: active (mounted) since Mon 2017-10-09 14:32:15 CEST; 16s ago Where: /sysroot What: /dev/mapper/3600601600a30200024fbbaf3f500e411-part5 Docs: man:fstab(5) man:systemd-fstab-generator(8) Process: 1873 ExecMount=/usr/bin/mount /dev/disk/by-uuid/63751805-6abc-46a3-a66f-427920dece4d /sysroot -o ro (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 512) :/# systemctl list-jobs JOB UNIT TYPE STATE 56 emergency.target start waiting 57 emergency.service start running 2 jobs listed. :/# exit logout Failed to start default.target: Transaction is destructive. (system keeps idling from this point on, user has no chance to do anything). This results from the combination of two effects: 1) initrd-root-fs.target sets "OnFailureJobMode=replace-irreversibly", 2) emergency.service's Type=oneshot causes the start jobs for both emergency.service and emergency.target to persist while the user is in the emergency shell. When the shell is exited, systemd tries to isolate "initrd.target" again, but this fails with "the transaction is destructive" error because of the still pending jobs. This patch fixes this by changing the Type of "emergency.service" from "oneshot" to "idle". --- diff --git a/modules.d/98dracut-systemd/emergency.service b/modules.d/98dracut-systemd/emergency.service index 288aac39c..100146a36 100644 --- a/modules.d/98dracut-systemd/emergency.service +++ b/modules.d/98dracut-systemd/emergency.service @@ -17,7 +17,7 @@ Environment=NEWROOT=/sysroot WorkingDirectory=/ ExecStart=/bin/dracut-emergency ExecStopPost=-/usr/bin/systemctl --fail --no-block default -Type=oneshot +Type=idle StandardInput=tty-force StandardOutput=inherit StandardError=inherit