From fc4375c8cf6be1ca2bd1605888824fe2e27c6f73 Mon Sep 17 00:00:00 2001 From: Allen Bai Date: Mon, 24 Jun 2019 16:39:27 -0400 Subject: [PATCH] dracut/30ignition: Reboot the system after ignition if kargs.d exists As mentioned in https://github.com/coreos/ignition-dracut/issues/81#issuecomment-494888494, this change adds a service that checks for the presence of `/etc/ostree/kargs.d` and redeploys then reboots the system if it exists. Closes: #81 --- .../30ignition/ignition-apply-kargs.service | 18 +++++++++++++ dracut/30ignition/ignition-apply-kargs.sh | 27 +++++++++++++++++++ dracut/30ignition/module-setup.sh | 7 ++++- 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 dracut/30ignition/ignition-apply-kargs.service create mode 100755 dracut/30ignition/ignition-apply-kargs.sh diff --git a/dracut/30ignition/ignition-apply-kargs.service b/dracut/30ignition/ignition-apply-kargs.service new file mode 100644 index 0000000..28f99da --- /dev/null +++ b/dracut/30ignition/ignition-apply-kargs.service @@ -0,0 +1,18 @@ +[Unit] +Description=Reboot after Ignition to apply kargs +Documentation=https://github.com/coreos/ignition-dracut +DefaultDependencies=false +Before=ignition-complete.target + +OnFailure=emergency.target +OnFailureJobMode=isolate + +# Make sure /sysroot/ostree/deploy/ is not empty +Requires=ostree-prepare-root.service +# Make sure /sysroot/etc/ostree/kargs.d exists if there are default kernel args +After=ignition-files.service + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/sbin/ignition-apply-kargs diff --git a/dracut/30ignition/ignition-apply-kargs.sh b/dracut/30ignition/ignition-apply-kargs.sh new file mode 100755 index 0000000..2a84480 --- /dev/null +++ b/dracut/30ignition/ignition-apply-kargs.sh @@ -0,0 +1,27 @@ +#!/bin/bash +set -euo pipefail + +# Reads default kernel arguments +kargs=$(cat /sysroot/etc/ostree/kargs.d/karg_file) + +# Copied from ignition-generator +cmdline_bool() { + local value=$(cmdline_arg "$@") + case "$value" in + ""|0|no|off) return 1;; + *) return 0;; + esac +} + +# Checks if kernel argument directory exists, +# then redeploy and reboot the system if it exists +reboot_if_kargs_dir_exists() { + if [ -d /sysroot/etc/ostree/kargs.d ]; then + ostree admin instutil set-kargs -v --sysroot=/sysroot --merge ${kargs} + exec systemctl reboot + fi +} + +if $(cmdline_bool 'ignition.firstboot' 0); then + reboot_if_kargs_dir_exists +fi diff --git a/dracut/30ignition/module-setup.sh b/dracut/30ignition/module-setup.sh index 49d4a59..f125c85 100755 --- a/dracut/30ignition/module-setup.sh +++ b/dracut/30ignition/module-setup.sh @@ -30,7 +30,8 @@ install() { useradd \ usermod \ realpath \ - touch + touch \ + ostree # This one is optional; https://src.fedoraproject.org/rpms/ignition/pull-request/9 inst_multiple -o mkfs.btrfs @@ -43,6 +44,9 @@ install() { inst_script "$moddir/ignition-setup-user.sh" \ "/usr/sbin/ignition-setup-user" + inst_script "$moddir/ignition-apply-kargs.sh" \ + "/usr/sbin/ignition-apply-kargs" + # Distro packaging is expected to install the ignition binary into the # module directory. inst_simple "$moddir/ignition" \ @@ -64,6 +68,7 @@ install() { install_ignition_unit ignition-mount.service install_ignition_unit ignition-files.service install_ignition_unit ignition-remount-sysroot.service + install_ignition_unit ignition-apply-kargs.service # needed for openstack config drive support inst_rules 60-cdrom_id.rules