diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-12-12 17:26:31 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-12-12 17:30:25 +0100 |
commit | b9ba4dabbab8a58a044ec42655e11e65bd3ecc47 (patch) | |
tree | 23a8f6590c33000cd350e1df99ddecccce22cbc8 | |
parent | c4e34a612c81266773cf8358cb38a43d2e43474e (diff) |
nspawn: when booting in ephemeral mode, append random token to machine name
Also, when booting up an ephemeral container of / use the system
hostname as default machine name.
This way specifiyng -M is unnecessary when booting up an ephemeral
container, while allowing any number of ephemeral containers to run from
the same tree.
-rw-r--r-- | man/systemd-nspawn.xml | 43 | ||||
-rw-r--r-- | src/nspawn/nspawn.c | 21 |
2 files changed, 49 insertions, 15 deletions
diff --git a/man/systemd-nspawn.xml b/man/systemd-nspawn.xml index b66c34df01..d7d60e52c2 100644 --- a/man/systemd-nspawn.xml +++ b/man/systemd-nspawn.xml @@ -231,8 +231,10 @@ its root directory (as configured with <option>--directory=</option>), that is removed immediately when the - container terminates. May not be - specified together with + container terminates. This option is + only supported if the root file system + is <literal>btrfs</literal>. May not + be specified together with <option>--image=</option> or <option>--template=</option>.</para></listitem> </varlistentry> @@ -303,13 +305,22 @@ <listitem><para>Sets the machine name for this container. This name may be - used to identify this container on the - host, and is used to initialize the - container's hostname (which the - container can choose to override, - however). If not specified, the last - component of the root directory of the - container is used.</para></listitem> + used to identify this container during + its runtime (for example in tools like + <citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry> + and similar), and is used to + initialize the container's hostname + (which the container can choose to + override, however). If not specified, + the last component of the root + directory path of the container is + used, possibly suffixed with a random + identifier in case + <option>--ephemeral</option> mode is + selected. If the root directory + selected is the host's root directory + the host's hostname is used as default + instead.</para></listitem> </varlistentry> <varlistentry> @@ -814,13 +825,16 @@ </example> <example> - <title>Boot into a <literal>btrfs</literal> snapshot of the host system</title> + <title>Boot into an ephemeral <literal>btrfs</literal> snapshot of the host system</title> - <programlisting># btrfs subvolume snapshot / /.tmp -# systemd-nspawn --private-network -D /.tmp -b</programlisting> + <programlisting># systemd-nspawn -D / -xb</programlisting> <para>This runs a copy of the host system in a - <literal>btrfs</literal> snapshot.</para> + <literal>btrfs</literal> snapshot which is + removed immediately when the container + exits. All file system changes made during + runtime will be lost on shutdown, + hence.</para> </example> <example> @@ -847,7 +861,8 @@ <citerefentry project='die-net'><refentrytitle>debootstrap</refentrytitle><manvolnum>8</manvolnum></citerefentry>, <citerefentry project='archlinux'><refentrytitle>pacman</refentrytitle><manvolnum>8</manvolnum></citerefentry>, <citerefentry><refentrytitle>systemd.slice</refentrytitle><manvolnum>5</manvolnum></citerefentry>, - <citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry> + <citerefentry><refentrytitle>machinectl</refentrytitle><manvolnum>1</manvolnum></citerefentry>, + <citerefentry><refentrytitle>btrfs</refentrytitle><manvolnum>8</manvolnum></citerefentry> </para> </refsect1> diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index 651a45126b..9ca53cd1b4 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -2875,7 +2875,11 @@ static int determine_names(void) { } if (!arg_machine) { - arg_machine = strdup(basename(arg_image ?: arg_directory)); + if (arg_directory && path_equal(arg_directory, "/")) + arg_machine = gethostname_malloc(); + else + arg_machine = strdup(basename(arg_image ?: arg_directory)); + if (!arg_machine) return log_oom(); @@ -2884,6 +2888,21 @@ static int determine_names(void) { log_error("Failed to determine machine name automatically, please use -M."); return -EINVAL; } + + if (arg_ephemeral) { + char *b; + + /* Add a random suffix when this is an + * ephemeral machine, so that we can run many + * instances at once without manually having + * to specify -M each time. */ + + if (asprintf(&b, "%s-%016" PRIx64, arg_machine, random_u64()) < 0) + return log_oom(); + + free(arg_machine); + arg_machine = b; + } } return 0; |