diff --git a/man/systemd-debug-generator.xml b/man/systemd-debug-generator.xml index d5cf4109b0..fa88e8ac01 100644 --- a/man/systemd-debug-generator.xml +++ b/man/systemd-debug-generator.xml @@ -33,27 +33,38 @@ that reads the kernel command line and understands three options: - If the option is specified - and followed by a unit name, this unit is masked for the runtime, - similar to the effect of + If the or + option is specified and followed by a unit name, this unit is + masked for the runtime, similar to the effect of systemctl1's mask command. This is useful to boot with certain units removed from the initial boot transaction for - debugging system startup. May be specified more than once. + debugging system startup. May be specified more than once. + is honored only by initial + RAM disk (initrd) while is + honored only in the main system. - If the option is specified + If the or + option is specified and followed by a unit name, a start job for this unit is added to the initial transaction. This is useful to start one or more - additional units at boot. May be specified more than once. + additional units at boot. May be specified more than once. + is honored only by initial + RAM disk (initrd) while is + honored only in the main system. - If the option is + If the or + option is specified, the debug shell service debug-shell.service is pulled into the boot transaction. It will spawn a debug shell on tty9 during early system startup. Note that the shell may also be turned on persistently by enabling it with systemctl1's - enable command. + enable command. + is honored only by initial + RAM disk (initrd) while is + honored only in the main system. systemd-debug-generator implements systemd.generator7. diff --git a/src/basic/proc-cmdline.c b/src/basic/proc-cmdline.c index b386c705e1..647c61ce73 100644 --- a/src/basic/proc-cmdline.c +++ b/src/basic/proc-cmdline.c @@ -66,7 +66,8 @@ int proc_cmdline_parse_given(const char *line, proc_cmdline_parse_t parse_item, if (flags & PROC_CMDLINE_STRIP_RD_PREFIX) key = q; - } + } else if (in_initrd() && flags & PROC_CMDLINE_RD_STRICT) + continue; value = strchr(key, '='); if (value) diff --git a/src/basic/proc-cmdline.h b/src/basic/proc-cmdline.h index ffc45fddb9..bb8b18d3b1 100644 --- a/src/basic/proc-cmdline.h +++ b/src/basic/proc-cmdline.h @@ -8,6 +8,7 @@ enum { PROC_CMDLINE_STRIP_RD_PREFIX = 1, PROC_CMDLINE_VALUE_OPTIONAL = 2, + PROC_CMDLINE_RD_STRICT = 4 }; typedef int (*proc_cmdline_parse_t)(const char *key, const char *value, void *data); diff --git a/src/debug-generator/debug-generator.c b/src/debug-generator/debug-generator.c index dd6ab94fa2..800d31cebe 100644 --- a/src/debug-generator/debug-generator.c +++ b/src/debug-generator/debug-generator.c @@ -154,7 +154,7 @@ int main(int argc, char *argv[]) { umask(0022); - r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0); + r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, PROC_CMDLINE_RD_STRICT | PROC_CMDLINE_STRIP_RD_PREFIX); if (r < 0) log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");