chiark / gitweb /
journald: add Storage= setting to control where the journal is stored
authorLennart Poettering <lennart@poettering.net>
Sun, 1 Jul 2012 18:17:48 +0000 (20:17 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 2 Jul 2012 08:43:57 +0000 (10:43 +0200)
TODO
man/journald.conf.xml
src/journal/journald-gperf.gperf
src/journal/journald.c
src/journal/journald.h
src/login/logind.conf

diff --git a/TODO b/TODO
index 37c048c32deb536ea2a2633f00aba9208e2ecd28..6790088483ee99379118e6751b0d92087586c7a2 100644 (file)
--- a/TODO
+++ b/TODO
@@ -22,6 +22,14 @@ Bugfixes:
 
 Features:
 
+* reexec journald across initrd transition
+
+* nspawn: bind mount /var/log/journal from the host
+
+* The current Storage=auto logic is borked, since people cannot mount
+  /var/log/journal via NFS since the mount point has to exist and we
+  already take that as signal to store our stuff there.
+
 * rename systemd-udev.service to systemd-udevd.service
 
 * document that journal data is primarily ASCII, UTF-8 where necessary and binary only where nothing else makes sense.
@@ -110,8 +118,6 @@ Features:
 
 * don't delete /tmp/systemd-namespace-* before a process is gone down
 
-* don't delete /run/users/lennart if lennart is still logged in even if aging is used
-
 * vconsole: implement setterm -store -foreground xxx --background zzz
 
 * ExecOnFailure=/usr/bin/foo
@@ -170,8 +176,6 @@ Features:
 
 * journal: store euid in journal if it differs from uid
 
-* support chrony in addition to ntpd in timedated
-
 * There's currently no way to cancel fsck (used to be possible via C-c or c on the console)
 
 * journal: sanely deal with entries which are larger than the individual file size, but where the componets would fit
@@ -236,8 +240,6 @@ Features:
 
 * when an instanced service exits, remove its parent cgroup too if possible.
 
-* automatically escape unit names passed on the service (i.e. think "systemctl start serial-getty.service@serial/by-path/jshdfjsdfhkjh" being automatically escaped as necessary.
-
 * if we can not get user quota for tmpfs, mount a separate tmpfs instance
   for every user in /run/user/$USER with a configured maximum size
 
@@ -417,3 +419,5 @@ Regularly:
 Scheduled for removal (or fixing):
 
 * xxxOverridable dependencies
+
+* journald.conf: ImportKernel=
index deb2344fc0e18a743908525e7ea15b6110a895e7..72d81fbdf454d668173087bb96eed00a4a37c561 100644 (file)
                                 traditional syslog service.
                                 </para></listitem>
                         </varlistentry>
+
+                        <varlistentry>
+                                <term><varname>Storage=</varname></term>
+
+                                <listitem><para>Controls where to
+                                store journal data. One of
+                                <literal>volatile</literal>,
+                                <literal>permanent</literal>,
+                                <literal>auto</literal> and
+                                <literal>none</literal>. If
+                                <literal>volatile</literal> journal
+                                log data will be stored only in
+                                memory, i.e. below the
+                                <filename>/run/log/journal</filename>
+                                hierarchy (which is created if
+                                needed). If
+                                <literal>permanent</literal> data will
+                                be stored preferably on disk,
+                                i.e. below the
+                                <filename>/var/log/journal</filename>
+                                hierarchy (which is created if
+                                needed), with a fallback to
+                                <filename>/run/log/journal</filename>
+                                (which is created if needed), during
+                                early boot and if the disk is not
+                                writable. <literal>auto</literal> is
+                                similar to
+                                <literal>permanent</literal> but the
+                                directory
+                                <filename>/var/log/journal</filename>
+                                is not created if needed, so that its
+                                existance controls where log data
+                                goes. <literal>none</literal> turns
+                                off all storage, all log data received
+                                will be dropped. Forwarding to other
+                                targets, such as the console, the
+                                kernel log buffer or a syslog daemon
+                                will still work however.  Defaults to
+                                <literal>auto</literal>.</para></listitem>
+                        </varlistentry>
                 </variablelist>
 
         </refsect1>
index c9b0fbb0e2da982f0a910354866dffb612f38ec1..4fe2ea0ec641a8fb5343c32db52045a9e77fac47 100644 (file)
@@ -34,3 +34,4 @@ Journal.MaxLevelStore,      config_parse_level,     0, offsetof(Server, max_leve
 Journal.MaxLevelSyslog,     config_parse_level,     0, offsetof(Server, max_level_syslog)
 Journal.MaxLevelKMsg,       config_parse_level,     0, offsetof(Server, max_level_kmsg)
 Journal.MaxLevelConsole,    config_parse_level,     0, offsetof(Server, max_level_console)
+Journal.Storage,            config_parse_storage,   0, offsetof(Server, storage)
index 7ea68aab3cac7dd4c4de4ea4c4f45a28218516c8..08597ae3eb9630dc22b43151d7163336465a0ead 100644 (file)
@@ -111,6 +111,16 @@ struct StdoutStream {
         LIST_FIELDS(StdoutStream, stdout_stream);
 };
 
+static const char* const storage_table[] = {
+        [STORAGE_AUTO] = "auto",
+        [STORAGE_VOLATILE] = "volatile",
+        [STORAGE_PERMANENT] = "permanent",
+        [STORAGE_NONE] = "none"
+};
+
+DEFINE_STRING_TABLE_LOOKUP(storage, Storage);
+DEFINE_CONFIG_PARSE_ENUM(config_parse_storage, storage, Storage, "Failed to parse storage setting");
+
 static int server_flush_to_var(Server *s);
 
 static uint64_t available_space(Server *s) {
@@ -397,7 +407,6 @@ static void server_vacuum(Server *s) {
                 free(p);
         }
 
-
         if (s->runtime_journal) {
                 if (asprintf(&p, "/run/log/journal/%s", ids) < 0) {
                         log_error("Out of memory.");
@@ -625,9 +634,7 @@ static void dispatch_message_real(
 
 retry:
         f = find_journal(s, realuid == 0 ? 0 : loginuid);
-        if (!f)
-                log_warning("Dropping message, as we can't find a place to store the data.");
-        else {
+        if (f) {
                 r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
 
                 if ((r == -E2BIG || /* hit limit */
@@ -1955,12 +1962,23 @@ static int system_journal_open(Server *s) {
 
         sd_id128_to_string(machine, ids);
 
-        if (!s->system_journal) {
+        if (!s->system_journal &&
+            (s->storage == STORAGE_PERMANENT ||
+             s->storage == STORAGE_AUTO)) {
+
+                /* If in auto mode: first try to create the machine
+                 * path, but not the prefix.
+                 *
+                 * If in permanent mode: create /var/log/journal and
+                 * the machine path */
+
+                if (s->storage & STORAGE_PERMANENT)
+                        (void) mkdir("/var/log/journal/", 0755);
 
-                /* First try to create the machine path, but not the prefix */
                 fn = strappend("/var/log/journal/", ids);
                 if (!fn)
                         return -ENOMEM;
+
                 (void) mkdir(fn, 0755);
                 free(fn);
 
@@ -1988,7 +2006,8 @@ static int system_journal_open(Server *s) {
                 }
         }
 
-        if (!s->runtime_journal) {
+        if (!s->runtime_journal &&
+            (s->storage != STORAGE_NONE)) {
 
                 fn = join("/run/log/journal/", ids, "/system.journal", NULL);
                 if (!fn)
@@ -2048,6 +2067,10 @@ static int server_flush_to_var(Server *s) {
 
         assert(s);
 
+        if (s->storage != STORAGE_AUTO &&
+            s->storage != STORAGE_PERMANENT)
+                return 0;
+
         if (!s->runtime_journal)
                 return 0;
 
index 159364d930bf61fdddfdbf19dc271a474055421c..34deb8561e89f9f4476030825504af11fc53b4d8 100644 (file)
 #include "journal-rate-limit.h"
 #include "list.h"
 
+typedef enum Storage {
+        STORAGE_AUTO,
+        STORAGE_VOLATILE,
+        STORAGE_PERMANENT,
+        STORAGE_NONE,
+        _STORAGE_MAX,
+        _STORAGE_INVALID = -1
+} Storage;
+
 typedef struct StdoutStream StdoutStream;
 
 typedef struct Server {
@@ -86,9 +95,16 @@ typedef struct Server {
         int max_level_syslog;
         int max_level_kmsg;
         int max_level_console;
+
+        Storage storage;
 } Server;
 
 /* gperf lookup function */
 const struct ConfigPerfItem* journald_gperf_lookup(const char *key, unsigned length);
 
+int config_parse_storage(const char *filename, unsigned line, const char *section, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
+
+const char *storage_to_string(Storage s);
+Storage storage_from_string(const char *s);
+
 #endif
index 78496a0ef164f9181c1901d55644d5cf8b445c32..c3798f7c7ccd8eca5453d5008acda16362c73af9 100644 (file)
@@ -18,3 +18,4 @@
 #HandlePowerKey=no-session
 #HandleSleepKey=tty-session
 #HandleLidSwitch=off
+#Storage=auto