diff --git a/man/kernel-command-line.xml b/man/kernel-command-line.xml index abe68e5496..612dc28cd5 100644 --- a/man/kernel-command-line.xml +++ b/man/kernel-command-line.xml @@ -98,6 +98,21 @@ + + systemd.restore_state= + + Parameter understood by + several system tools to control + whether or not they should restore + system state from the previous boot. + For details, see + systemd-backlight@.service8 + and + systemd-rfkill@.service8. + + + + quiet @@ -307,6 +322,8 @@ systemd-cryptsetup-generator8, systemd-fstab-generator8, systemd-modules-load.service8 + systemd-backlight@.service8 + systemd-rfkill@.service8 diff --git a/man/systemd-backlight@.service.xml b/man/systemd-backlight@.service.xml index 6d26d4b2ed..672fd05eb3 100644 --- a/man/systemd-backlight@.service.xml +++ b/man/systemd-backlight@.service.xml @@ -61,6 +61,26 @@ /var/lib/systemd/backlight/. + + Kernel Command Line + + systemd-backlight understands + the following kernel command line parameter: + + + + systemd.restore_state= + + Takes a boolean + argument. Defaults to + 1. If + 0, does not restore + the backlight settings on boot. However, + settings will still be stored on shutdown. + + + + See Also diff --git a/man/systemd-rfkill@.service.xml b/man/systemd-rfkill@.service.xml index b274cb818b..9ae834d5dd 100644 --- a/man/systemd-rfkill@.service.xml +++ b/man/systemd-rfkill@.service.xml @@ -61,6 +61,26 @@ /var/lib/systemd/rfkill/. + + Kernel Command Line + + systemd-rfkill understands + the following kernel command line parameter: + + + + systemd.restore_state= + + Takes a boolean + argument. Defaults to + 1. If + 0, does not restore + the rfkill settings on boot. However, + settings will still be stored on shutdown. + + + + See Also diff --git a/src/backlight/backlight.c b/src/backlight/backlight.c index e8cdad61ed..6c00b00d82 100644 --- a/src/backlight/backlight.c +++ b/src/backlight/backlight.c @@ -24,6 +24,7 @@ #include "fileio.h" #include "libudev.h" #include "udev-util.h" +#include "util.h" static struct udev_device *find_pci_or_platform_parent(struct udev_device *device) { struct udev_device *parent; @@ -290,7 +291,7 @@ int main(int argc, char *argv[]) { * device probing should be complete), so that the validity * check at boot time doesn't have to be reliable. */ - if (streq(argv[1], "load")) { + if (streq(argv[1], "load") && restore_state()) { _cleanup_free_ char *value = NULL; if (!validate_device(udev, device)) diff --git a/src/rfkill/rfkill.c b/src/rfkill/rfkill.c index 812cf408fb..b814e5c5fc 100644 --- a/src/rfkill/rfkill.c +++ b/src/rfkill/rfkill.c @@ -24,6 +24,7 @@ #include "fileio.h" #include "libudev.h" #include "udev-util.h" +#include "utils.h" int main(int argc, char *argv[]) { _cleanup_udev_unref_ struct udev *udev = NULL; @@ -95,7 +96,7 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - if (streq(argv[1], "load")) { + if (streq(argv[1], "load") && restore_state()) { _cleanup_free_ char *value = NULL; r = read_one_line_file(saved, &value); diff --git a/src/shared/util.c b/src/shared/util.c index 1822770304..d086fac7f8 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -76,6 +76,7 @@ #include "device-nodes.h" #include "utf8.h" #include "gunicode.h" +#include "virt.h" int saved_argc = 0; char **saved_argv = NULL; @@ -5990,3 +5991,25 @@ int split_pair(const char *s, const char *sep, char **l, char **r) { return 0; } + +bool restore_state(void) { + _cleanup_free_ char *line; + char *w, *state; + int r; + size_t l; + + if (detect_container(NULL) > 0) + return true; + + r = read_one_line_file("/proc/cmdline", &line); + if (r < 0) { + log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r)); + return 0; + } + + FOREACH_WORD_QUOTED(w, l, line, state) + if (strneq(w, "systemd.restore_state=0", l)) + return false; + + return true; +} diff --git a/src/shared/util.h b/src/shared/util.h index 63cb4ac636..dc35b4d980 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -765,6 +765,8 @@ void parse_user_at_host(char *arg, char **user, char **host); int split_pair(const char *s, const char *sep, char **l, char **r); +bool restore_state(void); + /** * Normal qsort requires base to be nonnull. Here were require * that only if nmemb > 0.