firstboot: Add --kernel-command-line option

This commit is contained in:
Daan De Meyer 2020-05-25 21:39:51 +02:00
parent 676339a191
commit a5925354bb
2 changed files with 44 additions and 0 deletions

View file

@ -164,6 +164,15 @@
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--kernel-command-line=<replaceable>CMDLINE</replaceable></option></term>
<listitem><para>Sets the system's kernel command line. This controls the
<filename>/etc/kernel/cmdline</filename> file which is used by
<citerefentry><refentrytitle>kernel-install</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--prompt-locale</option></term>
<term><option>--prompt-keymap</option></term>

View file

@ -42,6 +42,7 @@ static char *arg_timezone = NULL;
static char *arg_hostname = NULL;
static sd_id128_t arg_machine_id = {};
static char *arg_root_password = NULL;
static char *arg_kernel_cmdline = NULL;
static bool arg_prompt_locale = false;
static bool arg_prompt_keymap = false;
static bool arg_prompt_timezone = false;
@ -804,6 +805,27 @@ static int process_root_password(void) {
return 0;
}
static int process_kernel_cmdline(void) {
const char *etc_kernel_cmdline;
int r;
etc_kernel_cmdline = prefix_roota(arg_root, "/etc/kernel/cmdline");
if (laccess(etc_kernel_cmdline, F_OK) >= 0 && !arg_force)
return 0;
if (!arg_kernel_cmdline)
return 0;
r = write_string_file(etc_kernel_cmdline, arg_kernel_cmdline,
WRITE_STRING_FILE_CREATE | WRITE_STRING_FILE_SYNC | WRITE_STRING_FILE_MKDIR_0755 |
(arg_force ? WRITE_STRING_FILE_ATOMIC : 0));
if (r < 0)
return log_error_errno(r, "Failed to write %s: %m", etc_kernel_cmdline);
log_info("%s written.", etc_kernel_cmdline);
return 0;
}
static int help(void) {
_cleanup_free_ char *link = NULL;
int r;
@ -862,6 +884,7 @@ static int parse_argv(int argc, char *argv[]) {
ARG_ROOT_PASSWORD,
ARG_ROOT_PASSWORD_FILE,
ARG_ROOT_PASSWORD_HASHED,
ARG_KERNEL_COMMAND_LINE,
ARG_PROMPT,
ARG_PROMPT_LOCALE,
ARG_PROMPT_KEYMAP,
@ -891,6 +914,7 @@ static int parse_argv(int argc, char *argv[]) {
{ "root-password", required_argument, NULL, ARG_ROOT_PASSWORD },
{ "root-password-file", required_argument, NULL, ARG_ROOT_PASSWORD_FILE },
{ "root-password-hashed", required_argument, NULL, ARG_ROOT_PASSWORD_HASHED },
{ "kernel-command-line", required_argument, NULL, ARG_KERNEL_COMMAND_LINE },
{ "prompt", no_argument, NULL, ARG_PROMPT },
{ "prompt-locale", no_argument, NULL, ARG_PROMPT_LOCALE },
{ "prompt-keymap", no_argument, NULL, ARG_PROMPT_KEYMAP },
@ -1010,6 +1034,13 @@ static int parse_argv(int argc, char *argv[]) {
break;
case ARG_KERNEL_COMMAND_LINE:
r = free_and_strdup(&arg_kernel_cmdline, optarg);
if (r < 0)
return log_oom();
break;
case ARG_PROMPT:
arg_prompt_locale = arg_prompt_keymap = arg_prompt_timezone = arg_prompt_hostname = arg_prompt_root_password = true;
break;
@ -1134,6 +1165,10 @@ static int run(int argc, char *argv[]) {
if (r < 0)
return r;
r = process_kernel_cmdline();
if (r < 0)
return r;
return 0;
}