[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH 6/7] lxc: add driver config file lxc.conf



Add a config file for the lxc driver, based on existing qemu.conf.
There is currently one tunable "log_with_libvirtd" that controls
whether an lxc controller will log only to the container log file, or
whether it will honor libvirtd's log output configuration. This
provides a way to have libvirtd and its children log to a single file.
The default is to log to the container log file.
---

 libvirt.spec.in      |    6 ++++++
 src/Makefile.am      |    9 +++++++--
 src/lxc/lxc.conf     |   13 +++++++++++++
 src/lxc/lxc_conf.c   |   24 ++++++++++++++++++++++++
 src/lxc/lxc_conf.h   |    1 +
 src/lxc/lxc_driver.c |   19 +++++++++++++++----
 6 files changed, 66 insertions(+), 6 deletions(-)
 create mode 100644 src/lxc/lxc.conf

diff --git a/libvirt.spec.in b/libvirt.spec.in
index da3b2a7..725ef60 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -550,6 +550,9 @@ rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/libvirt-%{version}
 %if ! %{with_qemu}
 rm -rf $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/qemu.conf
 %endif
+%if ! %{with_lxc}
+rm -rf $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/lxc.conf
+%endif
 
 %if %{with_libvirtd}
 chmod 0644 $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/libvirtd
@@ -627,6 +630,9 @@ fi
 %if %{with_qemu}
 %config(noreplace) %{_sysconfdir}/libvirt/qemu.conf
 %endif
+%if %{with_lxc}
+%config(noreplace) %{_sysconfdir}/libvirt/lxc.conf
+%endif
 
 %dir %{_datadir}/libvirt/
 
diff --git a/src/Makefile.am b/src/Makefile.am
index f3d4559..73bbb70 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -32,6 +32,8 @@ lib_LTLIBRARIES = libvirt.la
 moddir = $(libdir)/libvirt/drivers
 mod_LTLIBRARIES =
 
+confdir = $(sysconfdir)/libvirt
+conf_DATA =
 
 # These files are not related to driver APIs. Simply generic
 # helper APIs for various purposes
@@ -425,8 +427,7 @@ libvirt_driver_qemu_la_LDFLAGS += -module -avoid-version
 endif
 libvirt_driver_qemu_la_SOURCES = $(QEMU_DRIVER_SOURCES)
 
-confdir = $(sysconfdir)/libvirt/
-conf_DATA = qemu/qemu.conf
+conf_DATA += qemu/qemu.conf
 
 augeasdir = $(datadir)/augeas/lenses
 augeas_DATA = qemu/libvirtd_qemu.aug
@@ -456,7 +457,11 @@ if WITH_DRIVER_MODULES
 libvirt_driver_lxc_la_LDFLAGS = -module -avoid-version
 endif
 libvirt_driver_lxc_la_SOURCES = $(LXC_DRIVER_SOURCES)
+
+conf_DATA += lxc/lxc.conf
+
 endif
+EXTRA_DIST += lxc/lxc.conf
 
 if WITH_UML
 if WITH_DRIVER_MODULES
diff --git a/src/lxc/lxc.conf b/src/lxc/lxc.conf
new file mode 100644
index 0000000..7a5066f
--- /dev/null
+++ b/src/lxc/lxc.conf
@@ -0,0 +1,13 @@
+# Master configuration file for the LXC driver.
+# All settings described here are optional - if omitted, sensible
+# defaults are used.
+
+# By default, log messages generated by the lxc controller go to the
+# container logfile. It is also possible to accumulate log messages
+# from all lxc controllers along with libvirtd's log outputs. In this
+# case, the lxc controller will honor either LIBVIRT_LOG_OUTPUTS or
+# log_outputs from libvirtd.conf.
+#
+# This is disabled by default, uncomment below to enable it.
+#
+# log_with_libvirtd = 1
diff --git a/src/lxc/lxc_conf.c b/src/lxc/lxc_conf.c
index fef60ba..de059bd 100644
--- a/src/lxc/lxc_conf.c
+++ b/src/lxc/lxc_conf.c
@@ -30,6 +30,7 @@
 #include "lxc_conf.h"
 #include "nodeinfo.h"
 #include "virterror_internal.h"
+#include "conf.h"
 #include "logging.h"
 
 
@@ -90,6 +91,10 @@ no_memory:
 
 int lxcLoadDriverConfig(lxc_driver_t *driver)
 {
+    char *filename;
+    virConfPtr conf;
+    virConfValuePtr p;
+
     /* Set the container configuration directory */
     if ((driver->configDir = strdup(LXC_CONFIG_DIR)) == NULL)
         goto no_memory;
@@ -98,6 +103,25 @@ int lxcLoadDriverConfig(lxc_driver_t *driver)
     if ((driver->logDir = strdup(LXC_LOG_DIR)) == NULL)
         goto no_memory;
 
+    if ((filename = strdup(SYSCONF_DIR "/libvirt/lxc.conf")) == NULL)
+        goto no_memory;
+
+    /* Avoid error from non-existant or unreadable file. */
+    if (access (filename, R_OK) == -1)
+        return 0;
+    conf = virConfReadFile(filename, 0);
+    if (!conf)
+        return 0;
+
+    p = virConfGetValue(conf, "log_with_libvirtd");
+    if (p) {
+        if (p->type != VIR_CONF_LONG)
+            VIR_WARN0("lxcLoadDriverConfig: invalid setting: log_with_libvirtd");
+        else
+            driver->log_libvirtd = p->l;
+    }
+
+    virConfFree(conf);
     return 0;
 
 no_memory:
diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h
index 15402d8..6e4c855 100644
--- a/src/lxc/lxc_conf.h
+++ b/src/lxc/lxc_conf.h
@@ -49,6 +49,7 @@ struct __lxc_driver {
     char *autostartDir;
     char *stateDir;
     char *logDir;
+    int log_libvirtd;
     int have_netns;
 
     /* An array of callbacks */
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 73cfecd..fceec2d 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -837,11 +837,13 @@ static int lxcControllerStart(virConnectPtr conn,
     virBuffer filterbuf = VIR_BUFFER_INITIALIZER;
     virBuffer outputbuf = VIR_BUFFER_INITIALIZER;
     char *tmp;
+    int log_level;
     pid_t child;
     int status;
     fd_set keepfd;
     char appPtyStr[30];
     const char *emulator;
+    lxc_driver_t *driver = conn->privateData;
 
     FD_ZERO(&keepfd);
 
@@ -891,7 +893,8 @@ static int lxcControllerStart(virConnectPtr conn,
         lenv[lenvc++] = envval;                                         \
     } while (0)
 
-    if (virAsprintf(&tmp, "LIBVIRT_DEBUG=%d", virLogGetDefaultPriority()) < 0)
+    log_level = virLogGetDefaultPriority();
+    if (virAsprintf(&tmp, "LIBVIRT_DEBUG=%d", log_level) < 0)
         goto no_memory;
     ADD_ENV(tmp);
 
@@ -901,10 +904,17 @@ static int lxcControllerStart(virConnectPtr conn,
         ADD_ENV_PAIR("LIBVIRT_LOG_FILTERS", virBufferContentAndReset(&filterbuf));
     }
 
-    if (virLogGetNbOutputs() > 0) {
-        if (virLogGetOutputs(&outputbuf) < 0)
+    if (driver->log_libvirtd) {
+        if (virLogGetNbOutputs() > 0) {
+            if (virLogGetOutputs(&outputbuf) < 0)
+                goto no_memory;
+            ADD_ENV_PAIR("LIBVIRT_LOG_OUTPUTS",
+                         virBufferContentAndReset(&outputbuf));
+        }
+    } else {
+        if (virAsprintf(&tmp, "LIBVIRT_LOG_OUTPUTS=%d:stderr", log_level) < 0)
             goto no_memory;
-        ADD_ENV_PAIR("LIBVIRT_LOG_OUTPUTS", virBufferContentAndReset(&outputbuf));
+        ADD_ENV(tmp);
     }
 
     ADD_ENV(NULL);
@@ -1510,6 +1520,7 @@ static int lxcStartup(int privileged)
          virEventAddTimeout(-1, lxcDomainEventFlush, lxc_driver, NULL)) < 0)
         goto cleanup;
 
+    lxc_driver->log_libvirtd = 0; /* by default log to container logfile */
     lxc_driver->have_netns = lxcCheckNetNsSupport();
 
     rc = virCgroupForDriver("lxc", &lxc_driver->cgroup, privileged, 1);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]