mirror of
https://github.com/systemd/systemd.git
synced 2025-03-25 18:50:18 +03:00
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_error=</varname></term>
|
||||
<term><varname>systemd.setenv=</varname></term>
|
||||
<term><varname>systemd.machine_id=</varname></term>
|
||||
<listitem>
|
||||
<para>Parameters understood by the system and service
|
||||
manager to control system behavior. For details, see
|
||||
|
@ -84,6 +84,12 @@
|
||||
at install time. Use
|
||||
<citerefentry><refentrytitle>systemd-firstboot</refentrytitle><manvolnum>1</manvolnum></citerefentry>
|
||||
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>
|
||||
|
@ -255,6 +255,14 @@
|
||||
<option>inherit</option>.</para></listitem>
|
||||
</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="version" />
|
||||
</variablelist>
|
||||
@ -976,6 +984,15 @@
|
||||
than once to set multiple variables.</para></listitem>
|
||||
</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>
|
||||
<term><varname>quiet</varname></term>
|
||||
|
||||
|
@ -198,7 +198,7 @@ static int generate_machine_id(char id[34], const char *root) {
|
||||
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;
|
||||
_cleanup_close_ int fd = -1;
|
||||
bool writable = true;
|
||||
@ -248,15 +248,22 @@ int machine_id_setup(const char *root) {
|
||||
}
|
||||
}
|
||||
|
||||
if (read_machine_id(fd, id) >= 0)
|
||||
return 0;
|
||||
/* A machine id argument overrides all other machined-ids */
|
||||
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
|
||||
* generate one */
|
||||
/* Hmm, so, the id currently stored is not useful, then let's
|
||||
* generate one */
|
||||
|
||||
r = generate_machine_id(id, root);
|
||||
if (r < 0)
|
||||
return r;
|
||||
r = generate_machine_id(id, root);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
if (writable)
|
||||
if (write_machine_id(fd, id) >= 0)
|
||||
|
@ -22,4 +22,4 @@
|
||||
***/
|
||||
|
||||
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_tasks_accounting = true;
|
||||
static uint64_t arg_default_tasks_max = UINT64_C(512);
|
||||
static sd_id128_t arg_machine_id = {};
|
||||
|
||||
static void pager_open_if_enabled(void) {
|
||||
|
||||
@ -300,6 +301,17 @@ static int parse_crash_chvt(const char *value) {
|
||||
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) {
|
||||
|
||||
int r;
|
||||
@ -388,6 +400,12 @@ static int parse_proc_cmdline_item(const char *key, const char *value) {
|
||||
} else
|
||||
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) {
|
||||
|
||||
if (arg_show_status == _SHOW_STATUS_UNSET)
|
||||
@ -743,7 +761,8 @@ static int parse_argv(int argc, char *argv[]) {
|
||||
ARG_DESERIALIZE,
|
||||
ARG_SWITCHED_ROOT,
|
||||
ARG_DEFAULT_STD_OUTPUT,
|
||||
ARG_DEFAULT_STD_ERROR
|
||||
ARG_DEFAULT_STD_ERROR,
|
||||
ARG_MACHINE_ID
|
||||
};
|
||||
|
||||
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 },
|
||||
{ "default-standard-output", required_argument, NULL, ARG_DEFAULT_STD_OUTPUT, },
|
||||
{ "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;
|
||||
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':
|
||||
arg_action = ACTION_HELP;
|
||||
if (arg_no_pager < 0)
|
||||
@ -1617,7 +1645,7 @@ int main(int argc, char *argv[]) {
|
||||
status_welcome();
|
||||
|
||||
hostname_setup();
|
||||
machine_id_setup(NULL);
|
||||
machine_id_setup(NULL, arg_machine_id);
|
||||
loopback_setup();
|
||||
bump_unix_max_dgram_qlen();
|
||||
|
||||
|
@ -112,7 +112,7 @@ int main(int argc, char *argv[]) {
|
||||
if (arg_commit)
|
||||
r = machine_id_commit(arg_root);
|
||||
else
|
||||
r = machine_id_setup(arg_root);
|
||||
r = machine_id_setup(arg_root, SD_ID128_NULL);
|
||||
|
||||
finish:
|
||||
free(arg_root);
|
||||
|
Loading…
x
Reference in New Issue
Block a user