chiark / gitweb /
nspawn: when booting in ephemeral mode, append random token to machine name
authorLennart Poettering <lennart@poettering.net>
Fri, 12 Dec 2014 16:26:31 +0000 (17:26 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 12 Dec 2014 16:30:25 +0000 (17:30 +0100)
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.

man/systemd-nspawn.xml
src/nspawn/nspawn.c

index b66c34d..d7d60e5 100644 (file)
                                 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>
 
                                 <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>
                 </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>
                         <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>
 
index 651a451..9ca53cd 100644 (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;