core: Add machine-id setting
Allow for overriding all other machine-ids which may be present on the system using a kernel command line systemd.machine_id or --machine-id= option. This is especially useful for network booted systems where the machine-id needs to be static, or for containers where a specific machine-id is wanted.
This commit is contained in:
parent
a41a7181c9
commit
ee48dbd55f
|
@ -91,6 +91,7 @@
|
||||||
<term><varname>systemd.default_standard_output=</varname></term>
|
<term><varname>systemd.default_standard_output=</varname></term>
|
||||||
<term><varname>systemd.default_standard_error=</varname></term>
|
<term><varname>systemd.default_standard_error=</varname></term>
|
||||||
<term><varname>systemd.setenv=</varname></term>
|
<term><varname>systemd.setenv=</varname></term>
|
||||||
|
<term><varname>systemd.machine_id=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>Parameters understood by the system and service
|
<para>Parameters understood by the system and service
|
||||||
manager to control system behavior. For details, see
|
manager to control system behavior. For details, see
|
||||||
|
|
|
@ -84,6 +84,12 @@
|
||||||
at install time. Use
|
at install time. Use
|
||||||
<citerefentry><refentrytitle>systemd-firstboot</refentrytitle><manvolnum>1</manvolnum></citerefentry>
|
<citerefentry><refentrytitle>systemd-firstboot</refentrytitle><manvolnum>1</manvolnum></citerefentry>
|
||||||
to initialize it on mounted (but not booted) system images.</para>
|
to initialize it on mounted (but not booted) system images.</para>
|
||||||
|
|
||||||
|
<para>The machine-id may also be set, for example when network
|
||||||
|
booting, by setting the <varname>systemd.machine_id=</varname>
|
||||||
|
kernel command line parameter or passing the option
|
||||||
|
<option>--machine-id=</option> to systemd. A machine-id may not
|
||||||
|
be set to all zeros.</para>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
<refsect1>
|
<refsect1>
|
||||||
|
|
|
@ -255,6 +255,14 @@
|
||||||
<option>inherit</option>.</para></listitem>
|
<option>inherit</option>.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--machine-id=</option></term>
|
||||||
|
|
||||||
|
<listitem><para>Override the machine-id set on the hard drive,
|
||||||
|
userful for network booting or for containers. May not be set
|
||||||
|
to all zeros.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<xi:include href="standard-options.xml" xpointer="help" />
|
<xi:include href="standard-options.xml" xpointer="help" />
|
||||||
<xi:include href="standard-options.xml" xpointer="version" />
|
<xi:include href="standard-options.xml" xpointer="version" />
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
@ -976,6 +984,15 @@
|
||||||
than once to set multiple variables.</para></listitem>
|
than once to set multiple variables.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>systemd.machine_id=</varname></term>
|
||||||
|
|
||||||
|
<listitem><para>Takes a 32 character hex value to be
|
||||||
|
used for setting the machine-id. Intended mostly for
|
||||||
|
network booting where the same machine-id is desired
|
||||||
|
for every boot.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>quiet</varname></term>
|
<term><varname>quiet</varname></term>
|
||||||
|
|
||||||
|
|
|
@ -198,7 +198,7 @@ static int generate_machine_id(char id[34], const char *root) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int machine_id_setup(const char *root) {
|
int machine_id_setup(const char *root, sd_id128_t machine_id) {
|
||||||
const char *etc_machine_id, *run_machine_id;
|
const char *etc_machine_id, *run_machine_id;
|
||||||
_cleanup_close_ int fd = -1;
|
_cleanup_close_ int fd = -1;
|
||||||
bool writable = true;
|
bool writable = true;
|
||||||
|
@ -248,15 +248,22 @@ int machine_id_setup(const char *root) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (read_machine_id(fd, id) >= 0)
|
/* A machine id argument overrides all other machined-ids */
|
||||||
return 0;
|
if (!sd_id128_is_null(machine_id)) {
|
||||||
|
sd_id128_to_string(machine_id, id);
|
||||||
|
id[32] = '\n';
|
||||||
|
id[33] = 0;
|
||||||
|
} else {
|
||||||
|
if (read_machine_id(fd, id) >= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* Hmm, so, the id currently stored is not useful, then let's
|
/* Hmm, so, the id currently stored is not useful, then let's
|
||||||
* generate one */
|
* generate one */
|
||||||
|
|
||||||
r = generate_machine_id(id, root);
|
r = generate_machine_id(id, root);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
if (writable)
|
if (writable)
|
||||||
if (write_machine_id(fd, id) >= 0)
|
if (write_machine_id(fd, id) >= 0)
|
||||||
|
|
|
@ -22,4 +22,4 @@
|
||||||
***/
|
***/
|
||||||
|
|
||||||
int machine_id_commit(const char *root);
|
int machine_id_commit(const char *root);
|
||||||
int machine_id_setup(const char *root);
|
int machine_id_setup(const char *root, sd_id128_t machine_id);
|
||||||
|
|
|
@ -127,6 +127,7 @@ static bool arg_default_blockio_accounting = false;
|
||||||
static bool arg_default_memory_accounting = false;
|
static bool arg_default_memory_accounting = false;
|
||||||
static bool arg_default_tasks_accounting = true;
|
static bool arg_default_tasks_accounting = true;
|
||||||
static uint64_t arg_default_tasks_max = UINT64_C(512);
|
static uint64_t arg_default_tasks_max = UINT64_C(512);
|
||||||
|
static sd_id128_t arg_machine_id = {};
|
||||||
|
|
||||||
static void pager_open_if_enabled(void) {
|
static void pager_open_if_enabled(void) {
|
||||||
|
|
||||||
|
@ -300,6 +301,17 @@ static int parse_crash_chvt(const char *value) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int set_machine_id(const char *m) {
|
||||||
|
|
||||||
|
if (sd_id128_from_string(m, &arg_machine_id) < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (sd_id128_is_null(arg_machine_id))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int parse_proc_cmdline_item(const char *key, const char *value) {
|
static int parse_proc_cmdline_item(const char *key, const char *value) {
|
||||||
|
|
||||||
int r;
|
int r;
|
||||||
|
@ -388,6 +400,12 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
|
||||||
} else
|
} else
|
||||||
log_warning("Environment variable name '%s' is not valid. Ignoring.", value);
|
log_warning("Environment variable name '%s' is not valid. Ignoring.", value);
|
||||||
|
|
||||||
|
} else if (streq(key, "systemd.machine_id") && value) {
|
||||||
|
|
||||||
|
r = set_machine_id(value);
|
||||||
|
if (r < 0)
|
||||||
|
log_warning("MachineID '%s' is not valid. Ignoring.", value);
|
||||||
|
|
||||||
} else if (streq(key, "quiet") && !value) {
|
} else if (streq(key, "quiet") && !value) {
|
||||||
|
|
||||||
if (arg_show_status == _SHOW_STATUS_UNSET)
|
if (arg_show_status == _SHOW_STATUS_UNSET)
|
||||||
|
@ -743,7 +761,8 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
ARG_DESERIALIZE,
|
ARG_DESERIALIZE,
|
||||||
ARG_SWITCHED_ROOT,
|
ARG_SWITCHED_ROOT,
|
||||||
ARG_DEFAULT_STD_OUTPUT,
|
ARG_DEFAULT_STD_OUTPUT,
|
||||||
ARG_DEFAULT_STD_ERROR
|
ARG_DEFAULT_STD_ERROR,
|
||||||
|
ARG_MACHINE_ID
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct option options[] = {
|
static const struct option options[] = {
|
||||||
|
@ -769,6 +788,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
{ "switched-root", no_argument, NULL, ARG_SWITCHED_ROOT },
|
{ "switched-root", no_argument, NULL, ARG_SWITCHED_ROOT },
|
||||||
{ "default-standard-output", required_argument, NULL, ARG_DEFAULT_STD_OUTPUT, },
|
{ "default-standard-output", required_argument, NULL, ARG_DEFAULT_STD_OUTPUT, },
|
||||||
{ "default-standard-error", required_argument, NULL, ARG_DEFAULT_STD_ERROR, },
|
{ "default-standard-error", required_argument, NULL, ARG_DEFAULT_STD_ERROR, },
|
||||||
|
{ "machine-id", required_argument, NULL, ARG_MACHINE_ID },
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -964,6 +984,14 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
arg_switched_root = true;
|
arg_switched_root = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ARG_MACHINE_ID:
|
||||||
|
r = set_machine_id(optarg);
|
||||||
|
if (r < 0) {
|
||||||
|
log_error("MachineID '%s' is not valid.", optarg);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 'h':
|
case 'h':
|
||||||
arg_action = ACTION_HELP;
|
arg_action = ACTION_HELP;
|
||||||
if (arg_no_pager < 0)
|
if (arg_no_pager < 0)
|
||||||
|
@ -1617,7 +1645,7 @@ int main(int argc, char *argv[]) {
|
||||||
status_welcome();
|
status_welcome();
|
||||||
|
|
||||||
hostname_setup();
|
hostname_setup();
|
||||||
machine_id_setup(NULL);
|
machine_id_setup(NULL, arg_machine_id);
|
||||||
loopback_setup();
|
loopback_setup();
|
||||||
bump_unix_max_dgram_qlen();
|
bump_unix_max_dgram_qlen();
|
||||||
|
|
||||||
|
|
|
@ -112,7 +112,7 @@ int main(int argc, char *argv[]) {
|
||||||
if (arg_commit)
|
if (arg_commit)
|
||||||
r = machine_id_commit(arg_root);
|
r = machine_id_commit(arg_root);
|
||||||
else
|
else
|
||||||
r = machine_id_setup(arg_root);
|
r = machine_id_setup(arg_root, SD_ID128_NULL);
|
||||||
|
|
||||||
finish:
|
finish:
|
||||||
free(arg_root);
|
free(arg_root);
|
||||||
|
|
Loading…
Reference in a new issue