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