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.