diff --git a/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/coreos-kargs.sh b/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/coreos-kargs.sh index 1dcc3add13..e5a8d26702 100755 --- a/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/coreos-kargs.sh +++ b/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/coreos-kargs.sh @@ -1,12 +1,25 @@ #!/bin/bash set -euo pipefail +# First check to see if the requested state is satisfied by the current boot +/usr/bin/rdcore kargs --current --create-if-changed /run/coreos-kargs-thisboot-differ "$@" + if is-live-image; then - /usr/bin/rdcore kargs --current --create-if-changed /run/coreos-kargs-changed "$@" - if [ -e /run/coreos-kargs-changed ]; then + # If we're in a live system and the kargs don't match then we must error. + if [ -e /run/coreos-kargs-thisboot-differ ]; then echo "Need to modify kernel arguments, but cannot affect live system." >&2 exit 1 fi else - /usr/bin/rdcore kargs --boot-device /dev/disk/by-label/boot --create-if-changed /run/coreos-kargs-reboot "$@" + /usr/bin/rdcore kargs --boot-device /dev/disk/by-label/boot --create-if-changed /run/coreos-kargs-changed "$@" + # If the bootloader was changed and the kernel arguments don't match this boot + # then we must reboot. If they do match this boot then we can skip the reboot. + if [ -e /run/coreos-kargs-changed ]; then + if [ -e /run/coreos-kargs-thisboot-differ ]; then + echo "Kernel arguments were changed. Requesting reboot." + touch /run/coreos-kargs-reboot + else + echo "Kernel arguments were changed, but they match this boot. Skipping reboot." + fi + fi fi