summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-12-12 17:26:31 +0100
committerLennart Poettering <lennart@poettering.net>2014-12-12 17:30:25 +0100
commitb9ba4dabbab8a58a044ec42655e11e65bd3ecc47 (patch)
tree23a8f6590c33000cd350e1df99ddecccce22cbc8
parentc4e34a612c81266773cf8358cb38a43d2e43474e (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.xml43
-rw-r--r--src/nspawn/nspawn.c21
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;