diff --git a/.gitignore b/.gitignore
index 605d109dfa..6149b01c6c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -96,7 +96,6 @@
/systemd-kmsg-syslogd
/systemd-localed
/systemd-logind
-/systemd-machine-id-commit
/systemd-machine-id-setup
/systemd-machined
/systemd-modules-load
diff --git a/Makefile-man.am b/Makefile-man.am
index 7dd014116f..49586fe04c 100644
--- a/Makefile-man.am
+++ b/Makefile-man.am
@@ -102,7 +102,6 @@ MANPAGES += \
man/systemd-inhibit.1 \
man/systemd-initctl.service.8 \
man/systemd-journald.service.8 \
- man/systemd-machine-id-commit.1 \
man/systemd-machine-id-commit.service.8 \
man/systemd-machine-id-setup.1 \
man/systemd-notify.1 \
@@ -2351,7 +2350,6 @@ EXTRA_DIST += \
man/systemd-localed.service.xml \
man/systemd-logind.service.xml \
man/systemd-machine-id-commit.service.xml \
- man/systemd-machine-id-commit.xml \
man/systemd-machine-id-setup.xml \
man/systemd-machined.service.xml \
man/systemd-modules-load.service.xml \
diff --git a/Makefile.am b/Makefile.am
index e9ad72333b..6ddc0b74f3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -397,7 +397,6 @@ rootlibexec_PROGRAMS = \
systemd-remount-fs \
systemd-reply-password \
systemd-fsck \
- systemd-machine-id-commit \
systemd-ac-power \
systemd-sysctl \
systemd-sleep \
@@ -2331,6 +2330,9 @@ systemd_machine_id_setup_SOURCES = \
systemd_machine_id_setup_LDADD = \
libshared.la
+SYSINIT_TARGET_WANTS += \
+ systemd-machine-id-commit.service
+
# ------------------------------------------------------------------------------
systemd_sysctl_SOURCES = \
src/sysctl/sysctl.c
@@ -2352,18 +2354,6 @@ systemd_fsck_SOURCES = \
systemd_fsck_LDADD = \
libshared.la
-# ------------------------------------------------------------------------------
-systemd_machine_id_commit_SOURCES = \
- src/machine-id-commit/machine-id-commit.c \
- src/core/machine-id-setup.c \
- src/core/machine-id-setup.h
-
-systemd_machine_id_commit_LDADD = \
- libshared.la
-
-SYSINIT_TARGET_WANTS += \
- systemd-machine-id-commit.service
-
# ------------------------------------------------------------------------------
systemd_ac_power_SOURCES = \
src/ac-power/ac-power.c
diff --git a/man/machine-id.xml b/man/machine-id.xml
index 92d67a3869..8ce9c46ff1 100644
--- a/man/machine-id.xml
+++ b/man/machine-id.xml
@@ -63,7 +63,7 @@
The machine ID is usually generated from a random source
during system installation and stays constant for all subsequent
boots. Optionally, for stateless systems, it is generated during
- runtime at boot if it is found to be empty.
+ runtime at early boot if it is found to be empty.
The machine ID does not change based on user configuration
or when hardware is replaced.
diff --git a/man/systemd-machine-id-commit.service.xml b/man/systemd-machine-id-commit.service.xml
index 7c8fc0874e..10f36b3008 100644
--- a/man/systemd-machine-id-commit.service.xml
+++ b/man/systemd-machine-id-commit.service.xml
@@ -42,55 +42,50 @@
systemd-machine-id-commit.service
- Commit transient machine-id to disk
+ Commit a transient machine-id to disksystemd-machine-id-commit.service
- /usr/lib/systemd/systemd-machine-id-commitDescription
- systemd-machine-id-commit.service is a
- service responsible for committing any transient
- /etc/machine-id file to a writable file
+ systemd-machine-id-commit.service is an
+ early-boot service responsible for committing transient
+ /etc/machine-id files to a writable disk file
system. See
machine-id5
- for more information about this file.
+ for more information about machine IDs.
- This service is started shortly after
- local-fs.target if
- /etc/machine-id is an independent mount point
- (probably a tmpfs one) and /etc is writable.
- systemd-machine-id-commit will then write
- current machine ID to disk and unmount the transient
+ This service is started after
+ local-fs.target in case
+ /etc/machine-id is a mount point of its own
+ (usually from a memory file system such as
+ tmpfs) and /etc is writable. The service will
+ invoke systemd-machine-id-setup --commit, which
+ writes the current transient machine ID to disk and unmount the
/etc/machine-id file in a race-free manner to
- ensure that file is always valid for other processes.
+ ensure that file is always valid and accessible for other
+ processes. See
+ systemd-machine-id-setup1
+ for details.
- Note that the traditional way to initialize the machine ID
- in /etc/machine-id is to use
- systemd-machine-id-setup by system installer
- tools. You can also use
- systemd-firstboot1
- to initialize the machine ID on mounted (but not booted) system
- images. The main use case for that service is
- /etc/machine-id being an empty file at boot
- and initrd chaining to systemd giving it a read only file system
- that will be turned read-write later during the boot
- process.
-
- There is no consequence if that service fails other than a
- newer machine-id will be generated during next system boot.
-
+ The main use case of this service are systems where
+ /etc/machine-id is read-only and initially
+ not initialized. In this case the system manager will generate a
+ transient machine ID file on a memory file system, and mount it
+ over /etc/machine-id, during the early boot
+ phase. This service is then invoked in a later boot phase, as soon
+ as /etc has been remounted writable and the
+ ID may thus be committed to disk to make it permanent.See Alsosystemd1,
- systemd-machine-id-commit1,
systemd-machine-id-setup1,
machine-id5,
systemd-firstboot1
diff --git a/man/systemd-machine-id-commit.xml b/man/systemd-machine-id-commit.xml
deleted file mode 100644
index d216aa0745..0000000000
--- a/man/systemd-machine-id-commit.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-
-
-
-
-
-
-
-
- systemd-machine-id-commit
- systemd
-
-
-
- Developer
- Didier
- Roche
- didrocks@ubuntu.com
-
-
-
-
-
- systemd-machine-id-commit
- 1
-
-
-
- systemd-machine-id-commit
- Commit transient machine ID to /etc/machine-id
-
-
-
-
- systemd-machine-id-commit
-
-
-
-
- Description
-
- systemd-machine-id-commit may be used to
- write on disk any transient machine ID mounted as a temporary file
- system in /etc/machine-id at boot time. See
- machine-id5
- for more information about this file.
-
- This tool will execute no operation if
- /etc/machine-id doesn't contain any valid
- machine ID, isn't mounted as an independent temporary file system,
- or /etc is read-only. If those conditions are
- met, it will then write current machine ID to disk and unmount the
- transient /etc/machine-id file in a race-free
- manner to ensure that this file is always valid for other
- processes.
-
- Note that the traditional way to initialize the machine ID
- in /etc/machine-id is to use
- systemd-machine-id-setup by system installer
- tools. You can also use
- systemd-firstboot1
- to initialize the machine ID on mounted (but not booted) system
- images.
-
-
-
- Options
-
- The following options are understood:
-
-
-
-
- Takes a directory path
- as an argument. All paths will be
- prefixed with the given alternate
- root path,
- including config search paths.
-
-
-
-
-
-
-
-
-
- Exit status
-
- On success, 0 is returned, a non-zero failure code
- otherwise.
-
-
-
- See Also
-
- systemd1,
- systemd-machine-id-commit.service8,
- systemd-machine-id-setup1,
- machine-id5,
- systemd-firstboot1
-
-
-
-
diff --git a/man/systemd-machine-id-setup.xml b/man/systemd-machine-id-setup.xml
index 182717f524..efcf408332 100644
--- a/man/systemd-machine-id-setup.xml
+++ b/man/systemd-machine-id-setup.xml
@@ -1,4 +1,4 @@
-
+
@@ -35,6 +35,12 @@
Poetteringlennart@poettering.net
+
+ Developer
+ Didier
+ Roche
+ didrocks@ubuntu.com
+
@@ -59,30 +65,43 @@
systemd-machine-id-setup may be used by
system installer tools to initialize the machine ID stored in
- /etc/machine-id at install time with a
- randomly generated ID. See
+ /etc/machine-id at install time, with a
+ provisioned or randomly generated ID. See
machine-id5
for more information about this file.
- This tool will execute no operation if
- /etc/machine-id is already
- initialized.
+ If the tool is invoked without the
+ switch /etc/machine-id is initialized with a
+ valid, new machined ID if it is missing or empty. The new machine
+ ID will be acquired in the following fashion:
- If a valid D-Bus machine ID is already configured for the
- system, the D-Bus machine ID is copied and used to initialize the
- machine ID in /etc/machine-id.
+
+ If a valid D-Bus machine ID is already
+ configured for the system, the D-Bus machine ID is copied and
+ used to initialize the machine ID in
+ /etc/machine-id.
- If run inside a KVM virtual machine and a UUID is passed via
- the option, this UUID is used to initialize
- the machine ID instead of a randomly generated one. The caller
- must ensure that the UUID passed is sufficiently unique and is
- different for every booted instanced of the VM.
+ If run inside a KVM virtual machine and a UUID
+ is was configured (via the
+ option), this UUID is used to initialize the machine ID. The
+ caller must ensure that the UUID passed is sufficiently unique
+ and is different for every booted instance of the
+ VM.
- Similar, if run inside a Linux container environment and a
- UUID is set for the container this is used to initialize the
- machine ID. For details see the documentation of the Container
- Interface.
+ Similar, if run inside a Linux container
+ environment and a UUID is configured for the container this is
+ used to initialize the machine ID. For details see the
+ documentation of the Container
+ Interface.
+
+ Otherwise a new ID is randomly
+ generated.
+
+
+ The switch may be used to commit a
+ transient machined ID to disk, making it persistent. For details,
+ see below.Use
systemd-firstboot1
@@ -97,13 +116,41 @@
The following options are understood:
+
- Takes a directory path as an argument. All
- paths will be prefixed with the given alternate
- root path, including config search
- paths.
+ Takes a directory path as argument. All paths
+ operated will be prefixed with the given alternate
+ root path, including the path for
+ /etc/machine-id itself.
+
+
+
+ Commit a transient machine ID to disk. This
+ command may be used to convert a transient machine ID into a
+ persistent one. A transient machine ID file is one that was
+ bind mounted from a memory file system (usually
+ tmpfs) to
+ /etc/machine-id during the early phase of
+ the boot process. This may happen because
+ /etc is initially read-only and was
+ missing a valid machine ID file at that point.
+
+ This command will execute no operation if
+ /etc/machine-id is not mounted from a
+ memory file system, or if /etc is
+ read-only. The command will write the current transient
+ machine ID to disk and unmount the
+ /etc/machine-id mount point in a
+ race-free manner to ensure that this file is always valid and
+ accessible for other processes.
+
+ This command is primarily used by the
+ systemd-machine-id-commit.service8
+ early-boot service.
+
+
@@ -122,6 +169,7 @@
systemd1,
machine-id5,
+ systemd-machine-id-commit.service8,
dbus-uuidgen1,
systemd-firstboot1
diff --git a/src/machine-id-commit/Makefile b/src/machine-id-commit/Makefile
deleted file mode 120000
index d0b0e8e008..0000000000
--- a/src/machine-id-commit/Makefile
+++ /dev/null
@@ -1 +0,0 @@
-../Makefile
\ No newline at end of file
diff --git a/src/machine-id-commit/machine-id-commit.c b/src/machine-id-commit/machine-id-commit.c
deleted file mode 100644
index ec3d7f8f97..0000000000
--- a/src/machine-id-commit/machine-id-commit.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
-
-/***
- This file is part of systemd.
-
- Copyright 2014 Didier Roche
-
- systemd is free software; you can redistribute it and/or modify it
- under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
-
- systemd is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with systemd; If not, see .
-***/
-
-#include
-#include
-#include
-#include
-
-#include "log.h"
-#include "machine-id-setup.h"
-#include "util.h"
-
-static const char *arg_root = NULL;
-
-static void help(void) {
- printf("%s [OPTIONS...]\n\n"
- "Commit a transient /etc/machine-id on disk if writable.\n\n"
- " -h --help Show this help\n"
- " --version Show package version\n"
- " --root=ROOT Filesystem root\n",
- program_invocation_short_name);
-}
-
-static int parse_argv(int argc, char *argv[]) {
-
- enum {
- ARG_VERSION = 0x100,
- ARG_ROOT,
- };
-
- static const struct option options[] = {
- { "help", no_argument, NULL, 'h' },
- { "version", no_argument, NULL, ARG_VERSION },
- { "root", required_argument, NULL, ARG_ROOT },
- {}
- };
-
- int c;
-
- assert(argc >= 0);
- assert(argv);
-
- while ((c = getopt_long(argc, argv, "hqcv", options, NULL)) >= 0)
- switch (c) {
-
- case 'h':
- help();
- return 0;
-
- case ARG_VERSION:
- return version();
-
- case ARG_ROOT:
- arg_root = optarg;
- break;
-
- case '?':
- return -EINVAL;
-
- default:
- assert_not_reached("Unhandled option");
- }
-
- if (optind < argc) {
- log_error("Extraneous arguments");
- return -EINVAL;
- }
-
- return 1;
-}
-
-int main(int argc, char *argv[]) {
- int r;
-
- log_set_target(LOG_TARGET_AUTO);
- log_parse_environment();
- log_open();
-
- r = parse_argv(argc, argv);
- if (r <= 0)
- goto finish;
-
- r = machine_id_commit(arg_root);
-
-finish:
- return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
-}
diff --git a/src/machine-id-setup/machine-id-setup-main.c b/src/machine-id-setup/machine-id-setup-main.c
index e5606c9a03..a9c4e3fadf 100644
--- a/src/machine-id-setup/machine-id-setup-main.c
+++ b/src/machine-id-setup/machine-id-setup-main.c
@@ -28,15 +28,17 @@
#include "machine-id-setup.h"
#include "util.h"
-static const char *arg_root = "";
+static const char *arg_root = NULL;
+static bool arg_commit = false;
static void help(void) {
printf("%s [OPTIONS...]\n\n"
"Initialize /etc/machine-id from a random source.\n\n"
" -h --help Show this help\n"
" --version Show package version\n"
- " --root=ROOT Filesystem root\n",
- program_invocation_short_name);
+ " --root=ROOT Filesystem root\n"
+ " --commit Commit transient ID\n"
+ , program_invocation_short_name);
}
static int parse_argv(int argc, char *argv[]) {
@@ -44,12 +46,14 @@ static int parse_argv(int argc, char *argv[]) {
enum {
ARG_VERSION = 0x100,
ARG_ROOT,
+ ARG_COMMIT,
};
static const struct option options[] = {
{ "help", no_argument, NULL, 'h' },
{ "version", no_argument, NULL, ARG_VERSION },
{ "root", required_argument, NULL, ARG_ROOT },
+ { "commit", no_argument, NULL, ARG_COMMIT },
{}
};
@@ -73,6 +77,10 @@ static int parse_argv(int argc, char *argv[]) {
arg_root = optarg;
break;
+ case ARG_COMMIT:
+ arg_commit = true;
+ break;
+
case '?':
return -EINVAL;
@@ -98,5 +106,11 @@ int main(int argc, char *argv[]) {
if (r <= 0)
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
- return machine_id_setup(arg_root) < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
+ if (arg_commit)
+ r = machine_id_commit(arg_root);
+ else
+ r = machine_id_setup(arg_root);
+
+
+ return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}
diff --git a/units/systemd-machine-id-commit.service.in b/units/systemd-machine-id-commit.service.in
index cccbf7b626..1f3f5da0f3 100644
--- a/units/systemd-machine-id-commit.service.in
+++ b/units/systemd-machine-id-commit.service.in
@@ -18,5 +18,5 @@ ConditionPathIsMountPoint=/etc/machine-id
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStart=@rootlibexecdir@/systemd-machine-id-commit
+ExecStart=@rootbindir@/systemd-machine-id-setup --commit
TimeoutSec=30s