diff --git a/man/bootctl.xml b/man/bootctl.xml
index 822d07a606..7ce41b70f9 100644
--- a/man/bootctl.xml
+++ b/man/bootctl.xml
@@ -133,6 +133,15 @@
and the firmware's boot loader list.
+
+
+
+ Checks whether systemd-boot is installed in the ESP. Note that a
+ single ESP might host multiple boot loaders; this hence checks whether
+ systemd-boot is one (of possibly many) installed boot loaders — and neither
+ whether it is the default nor whether it is registered in any EFI variables.
+
+
@@ -150,12 +159,13 @@
-
+ VALUE
- Checks whether systemd-boot is installed in the ESP. Note that a
- single ESP might host multiple boot loaders; this hence checks whether
- systemd-boot is one (of possibly many) installed boot loaders — and neither
- whether it is the default nor whether it is registered in any EFI variables.
+ When called without the optional argument, prints the current value of the
+ SystemdOptions EFI variable. When called with an argument, sets the
+ variable to that value. See
+ systemd1
+ for the meaning of that variable.
diff --git a/man/kernel-command-line.xml b/man/kernel-command-line.xml
index a79be5997d..848f5ec443 100644
--- a/man/kernel-command-line.xml
+++ b/man/kernel-command-line.xml
@@ -452,7 +452,8 @@
systemd-backlight@.service8,
systemd-rfkill.service8,
systemd-hibernate-resume-generator8,
- systemd-firstboot.service8
+ systemd-firstboot.service8,
+ bootctl1
diff --git a/src/boot/bootctl.c b/src/boot/bootctl.c
index 097c796a4e..2c8163360f 100644
--- a/src/boot/bootctl.c
+++ b/src/boot/bootctl.c
@@ -1052,8 +1052,9 @@ static int help(int argc, char *argv[], void *userdata) {
" install Install systemd-boot to the ESP and EFI variables\n"
" update Update systemd-boot in the ESP and EFI variables\n"
" remove Remove systemd-boot from the ESP and EFI variables\n"
- " random-seed Initialize random seed in ESP and EFI variables\n"
" is-installed Test whether systemd-boot is installed in the ESP\n"
+ " random-seed Initialize random seed in ESP and EFI variables\n"
+ " system-options Query or set system options string in EFI variable\n"
"\nBoot Loader Entries Commands:\n"
" list List boot loader entries\n"
" set-default ID Set default boot loader entry\n"
@@ -1710,18 +1711,40 @@ static int verb_random_seed(int argc, char *argv[], void *userdata) {
return 0;
}
+static int verb_system_options(int argc, char *argv[], void *userdata) {
+ int r;
+
+ if (argc == 1) {
+ _cleanup_free_ char *line = NULL;
+
+ r = efi_systemd_options_variable(&line);
+ if (r < 0)
+ return log_error_errno(r, "Failed to query SystemdOptions EFI variable: %m");
+
+ printf("SystemdOptions: %s\n", line);
+
+ } else {
+ r = efi_set_variable_string(EFI_VENDOR_SYSTEMD, "SystemdOptions", argv[1]);
+ if (r < 0)
+ return log_error_errno(r, "Failed to set SystemdOptions EFI variable: %m");
+ }
+
+ return 0;
+}
+
static int bootctl_main(int argc, char *argv[]) {
static const Verb verbs[] = {
- { "help", VERB_ANY, VERB_ANY, 0, help },
- { "status", VERB_ANY, 1, VERB_DEFAULT, verb_status },
- { "install", VERB_ANY, 1, 0, verb_install },
- { "update", VERB_ANY, 1, 0, verb_install },
- { "remove", VERB_ANY, 1, 0, verb_remove },
- { "random-seed", VERB_ANY, 1, 0, verb_random_seed },
- { "is-installed", VERB_ANY, 1, 0, verb_is_installed },
- { "list", VERB_ANY, 1, 0, verb_list },
- { "set-default", 2, 2, 0, verb_set_default },
- { "set-oneshot", 2, 2, 0, verb_set_default },
+ { "help", VERB_ANY, VERB_ANY, 0, help },
+ { "status", VERB_ANY, 1, VERB_DEFAULT, verb_status },
+ { "install", VERB_ANY, 1, 0, verb_install },
+ { "update", VERB_ANY, 1, 0, verb_install },
+ { "remove", VERB_ANY, 1, 0, verb_remove },
+ { "is-installed", VERB_ANY, 1, 0, verb_is_installed },
+ { "list", VERB_ANY, 1, 0, verb_list },
+ { "set-default", 2, 2, 0, verb_set_default },
+ { "set-oneshot", 2, 2, 0, verb_set_default },
+ { "random-seed", VERB_ANY, 1, 0, verb_random_seed },
+ { "system-options", VERB_ANY, 2, 0, verb_system_options },
{}
};