diff options
author | Martin Pitt <martin.pitt@ubuntu.com> | 2014-11-20 14:30:52 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-11-21 14:27:26 +0100 |
commit | 574edc90066c3faeadcf4666928ed9b0ac409c75 (patch) | |
tree | b5ea9f666f2ef3b366e7722c5a2aa97e4f92433f | |
parent | 812bd1e6ab4c463507557f2bdbb8875fedd92ade (diff) |
nspawn: Add try-{host,guest} journal link modes
--link-journal={host,guest} fail if the host does not have persistent
journalling enabled and /var/log/journal/ does not exist. Even worse, as there
is no stdout/err any more, there is no error message to point that out.
Introduce two new modes "try-host" and "try-guest" which don't fail in this
case, and instead just silently skip the guest journal setup.
Change -j to mean "try-guest" instead of "guest", and fix the wrong --help
output for it (it said "host" before).
Change systemd-nspawn@.service.in to use "try-guest" so that this unit works
with both persistent and non-persistent journals on the host without failing.
https://bugs.debian.org/770275
-rw-r--r-- | man/systemd-nspawn.xml | 11 | ||||
-rw-r--r-- | src/nspawn/nspawn.c | 37 | ||||
-rw-r--r-- | units/systemd-nspawn@.service.in | 2 |
3 files changed, 38 insertions, 12 deletions
diff --git a/man/systemd-nspawn.xml b/man/systemd-nspawn.xml index b3a2d3285..75db65eac 100644 --- a/man/systemd-nspawn.xml +++ b/man/systemd-nspawn.xml @@ -439,7 +439,9 @@ versa). Takes one of <literal>no</literal>, <literal>host</literal>, + <literal>try-host</literal>, <literal>guest</literal>, + <literal>try-guest</literal>, <literal>auto</literal>. If <literal>no</literal>, the journal is not linked. If <literal>host</literal>, @@ -453,8 +455,11 @@ guest file system (beneath <filename>/var/log/journal/<replaceable>machine-id</replaceable></filename>) and the subdirectory is symlinked into the host - at the same location. If - <literal>auto</literal> (the default), + at the same location. <literal>try-host</literal> + and <literal>try-guest</literal> do the same + but do not fail if the host does not have + persistant journalling enabled. + If <literal>auto</literal> (the default), and the right subdirectory of <filename>/var/log/journal</filename> exists, it will be bind mounted @@ -473,7 +478,7 @@ <term><option>-j</option></term> <listitem><para>Equivalent to - <option>--link-journal=guest</option>.</para></listitem> + <option>--link-journal=try-guest</option>.</para></listitem> </varlistentry> <varlistentry> diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index c2311b36d..b4dcf39e8 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -124,6 +124,7 @@ static bool arg_private_network = false; static bool arg_read_only = false; static bool arg_boot = false; static LinkJournal arg_link_journal = LINK_AUTO; +static bool arg_link_journal_try = false; static uint64_t arg_retain = (1ULL << CAP_CHOWN) | (1ULL << CAP_DAC_OVERRIDE) | @@ -202,8 +203,9 @@ static void help(void) { " --capability=CAP In addition to the default, retain specified\n" " capability\n" " --drop-capability=CAP Drop the specified capability from the default set\n" - " --link-journal=MODE Link up guest journal, one of no, auto, guest, host\n" - " -j Equivalent to --link-journal=host\n" + " --link-journal=MODE Link up guest journal, one of no, auto, guest, host,\n" + " try-guest, try-host\n" + " -j Equivalent to --link-journal=try-guest\n" " --read-only Mount the root directory read-only\n" " --bind=PATH[:PATH] Bind mount a file or directory from the host into\n" " the container\n" @@ -428,6 +430,7 @@ static int parse_argv(int argc, char *argv[]) { case 'j': arg_link_journal = LINK_GUEST; + arg_link_journal_try = true; break; case ARG_LINK_JOURNAL: @@ -439,7 +442,13 @@ static int parse_argv(int argc, char *argv[]) { arg_link_journal = LINK_GUEST; else if (streq(optarg, "host")) arg_link_journal = LINK_HOST; - else { + else if (streq(optarg, "try-guest")) { + arg_link_journal = LINK_GUEST; + arg_link_journal_try = true; + } else if (streq(optarg, "try-host")) { + arg_link_journal = LINK_HOST; + arg_link_journal_try = true; + } else { log_error("Failed to parse link journal mode %s", optarg); return -EINVAL; } @@ -1404,8 +1413,13 @@ static int setup_journal(const char *directory) { if (arg_link_journal == LINK_GUEST) { if (symlink(q, p) < 0) { - log_error("Failed to symlink %s to %s: %m", q, p); - return -errno; + if (arg_link_journal_try) { + log_debug("Failed to symlink %s to %s, skipping journal setup: %m", q, p); + return 0; + } else { + log_error("Failed to symlink %s to %s: %m", q, p); + return -errno; + } } r = mkdir_p(q, 0755); @@ -1415,10 +1429,17 @@ static int setup_journal(const char *directory) { } if (arg_link_journal == LINK_HOST) { - r = mkdir_p(p, 0755); + /* don't create parents here -- if the host doesn't have + * permanent journal set up, don't force it here */ + r = mkdir(p, 0755); if (r < 0) { - log_error("Failed to create %s: %m", p); - return r; + if (arg_link_journal_try) { + log_debug("Failed to create %s, skipping journal setup: %m", p); + return 0; + } else { + log_error("Failed to create %s: %m", p); + return r; + } } } else if (access(p, F_OK) < 0) diff --git a/units/systemd-nspawn@.service.in b/units/systemd-nspawn@.service.in index dec2ce7df..e3eaa5323 100644 --- a/units/systemd-nspawn@.service.in +++ b/units/systemd-nspawn@.service.in @@ -10,7 +10,7 @@ Description=Container %i Documentation=man:systemd-nspawn(1) [Service] -ExecStart=@bindir@/systemd-nspawn --quiet --keep-unit --boot --link-journal=guest --directory=/var/lib/container/%i +ExecStart=@bindir@/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --directory=/var/lib/container/%i KillMode=mixed Type=notify RestartForceExitStatus=133 |