[arch-projects] [mkinitcpio][PATCH] init: introduce a non-interactive mode (rd.noninteractive)

Martin Peres martin.peres at free.fr
Mon Feb 27 09:20:26 UTC 2017


CI systems compile and boot on kernels that are sometimes broken and
fail to find the root device.

This patch adds a new parameter (rd.noninteractive) that prevents
starting an interactive shell and reboots the machine 2 seconds after
warning the user about the issue.

This allows me to test the kernel faster than would be possible using
external watchdogs which would require at least 2 minutes before
kicking in.
---
 init_functions          | 16 ++++++++++++++++
 man/mkinitcpio.8.txt    |  3 +++
 test/test_parse_cmdline |  2 ++
 3 files changed, 21 insertions(+)

diff --git a/init_functions b/init_functions
index d5a584e..7287086 100644
--- a/init_functions
+++ b/init_functions
@@ -47,6 +47,19 @@ poll_device() {
 }
 
 launch_interactive_shell() {
+    if [ -n "$rd_noninteractive" ]; then
+        printf '%s\n' \
+                "************** REBOOT REQUIRED **************" \
+                "*                                           *" \
+                "*      running in non-interactive mode      *" \
+                "*                     -                     *" \
+                "*   automatically restarting in 2 seconds   *" \
+                "*                                           *" \
+                "*********************************************"
+        sleep 2
+        reboot -f
+    fi
+
     export PS1='[rootfs \W]\$ '
 
     # explicitly redirect to /dev/console in case we're logging. note that
@@ -174,6 +187,9 @@ parse_cmdline_item() {
                 rd_logmask=$(( _rdlog_kmsg | _rdlog_cons ))
             fi
             ;;
+        rd.noninteractive)
+            rd_noninteractive=y
+            ;;
         [![:alpha:]_]*|[[:alpha:]_]*[![:alnum:]_]*)
             # invalid shell variable, ignore it
             ;;
diff --git a/man/mkinitcpio.8.txt b/man/mkinitcpio.8.txt
index 5c3118e..d9410dc 100644
--- a/man/mkinitcpio.8.txt
+++ b/man/mkinitcpio.8.txt
@@ -292,6 +292,9 @@ the kernel command line:
 	*all*;;
 		Writes output to all known log targets.
 
+*rd.noninteractive*::
+	If specified, reboot the machine instead of starting an interactive shell.
+
 These are only the variables that the core of mkinitcpio honor. Additional
 hooks may look for other environment variables and should be documented by the
 help output for the hook.
diff --git a/test/test_parse_cmdline b/test/test_parse_cmdline
index ff855e4..9249962 100755
--- a/test/test_parse_cmdline
+++ b/test/test_parse_cmdline
@@ -217,6 +217,8 @@ test_parse 'rd.log=kmsg' \
   'rd_logmask' '2'
 test_parse 'rd.log=file' \
   'rd_logmask' '1'
+test_parse 'rd.noninteractive' \
+  'rd_noninteractive' 'y'
 
 # a mix of stuff
 test_parse 'foo=bar bareword bar="ba az"' \
-- 
2.11.1


More information about the arch-projects mailing list