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.
This commit is contained in:
Lennart Poettering 2014-12-12 17:26:31 +01:00
parent c4e34a612c
commit b9ba4dabba
2 changed files with 49 additions and 15 deletions

View File

@ -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>

View File

@ -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;