diff --git a/dracut/30ignition/ignition-generator b/dracut/30ignition/ignition-generator index 5503f41..2f8a7e2 100755 --- a/dracut/30ignition/ignition-generator +++ b/dracut/30ignition/ignition-generator @@ -53,6 +53,12 @@ Requires=dev-disk-by\x2dlabel-boot.device After=dev-disk-by\x2dlabel-boot.device EOF fi +else + # If we're doing a non-Ignition (subsequent) boot, then + # queue a different target. This is necessary so that units + # like `ignition-ostree-mount-sysroot.service` + # can cleanly distinguish between the two. + add_requires ignition-subsequent.target initrd.target fi echo "PLATFORM_ID=$(cmdline_arg ignition.platform.id)" > /run/ignition.env diff --git a/dracut/30ignition/ignition-subsequent.target b/dracut/30ignition/ignition-subsequent.target new file mode 100644 index 0000000..0282336 --- /dev/null +++ b/dracut/30ignition/ignition-subsequent.target @@ -0,0 +1,14 @@ +# This target is queued to run when Ignition will *not* run. +# It's intended right now for mounting sysroot, which happens in a quite +# different order on the Ignition boot versus "subsequent" boots. +[Unit] +Description=Subsequent (Not Ignition) boot complete +Before=initrd.target + +# See comments in ignition-complete.target +OnFailure=emergency.target +OnFailureJobMode=isolate + +# Make sure we stop all the units before switching root +Conflicts=initrd-switch-root.target umount.target +Conflicts=dracut-emergency.service emergency.service emergency.target diff --git a/dracut/30ignition/module-setup.sh b/dracut/30ignition/module-setup.sh index 94d0d65..05038f1 100755 --- a/dracut/30ignition/module-setup.sh +++ b/dracut/30ignition/module-setup.sh @@ -54,6 +54,8 @@ install() { inst_simple "$moddir/ignition-complete.target" \ "$systemdsystemunitdir/ignition-complete.target" + inst_simple "$moddir/ignition-subsequent.target" \ + "$systemdsystemunitdir/ignition-subsequent.target" inst_simple "$moddir/ignition-diskful.target" \ "$systemdsystemunitdir/ignition-diskful.target"