In order to stop or restart a container that runs "init" as its top-level
process, lxc must watch for changes to the "utmp" file (which stores init's
current and previous runlevel) located in /var/run in the container. Because
lxc should only react to the container runlevel (if one exists) and not the
system runlevel, lxc must first check that utmp is not shared between the
container and the system.

Presently, lxc will only watch utmp if the "lxc.rootfs" parameter is set in
the container configuration. However, lxc should also watch utmp if the
filesystem root is shared but "/var/run" has been re-mounted from another
location. (In this scenario, Upstart could be used to control the container
if "/etc/init" has also been re-mounted to a directory that holds Upstart
scripts specifically written for the container.)

With this change, lxc checks to see if "/var/run" is shared between the
container and the system by comparing the device and inode numbers. If not,
lxc will watch utmp. This replaces the check for "lxc.rootfs".

Signed-off-by: David Ward <david.w...@ll.mit.edu>
---
 src/lxc/utmp.c |   21 ++++++++++++++++-----
 1 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/src/lxc/utmp.c b/src/lxc/utmp.c
index 691c3ef..48998ca 100644
--- a/src/lxc/utmp.c
+++ b/src/lxc/utmp.c
@@ -30,6 +30,7 @@
 #include <sys/inotify.h>
 #include <sys/ioctl.h>
 #include <sys/timerfd.h>
+#include <sys/stat.h>
 
 #include "conf.h"
 #include "cgroup.h"
@@ -221,10 +222,7 @@ int lxc_utmp_mainloop_add(struct lxc_epoll_descr *descr,
        char path[MAXPATHLEN];
        int fd, wd;
        struct lxc_utmp *utmp_data;
-       struct lxc_conf *conf = handler->conf;
-
-       if (!conf->rootfs.path)
-               return 0;
+       struct stat container_stat, system_stat;
 
        /* We set up a watch for the /var/run directory. We're only interested
         * in utmp at the moment, but want to watch for delete and create
@@ -236,11 +234,24 @@ int lxc_utmp_mainloop_add(struct lxc_epoll_descr *descr,
                return -1;
        }
 
-       if (access(path, F_OK)) {
+       if (stat(path, &container_stat)) {
                WARN("'%s' not found", path);
                return 0;
        }
 
+       if (stat("/var/run", &system_stat)) {
+               WARN("'/var/run' not found");
+               return 0;
+       }
+
+       /* Do not watch the /var/run directory if the container shares it with
+        * the system.
+        */
+       if ((container_stat.st_dev == system_stat.st_dev)
+           && (container_stat.st_ino == system_stat.st_ino)) {
+               return 0;
+       }
+
        utmp_data = (struct lxc_utmp *)malloc(sizeof(struct lxc_utmp));
 
        if (NULL == utmp_data) {
-- 
1.7.4


------------------------------------------------------------------------------
Free Software Download: Index, Search & Analyze Logs and other IT data in 
Real-Time with Splunk. Collect, index and harness all the fast moving IT data 
generated by your applications, servers and devices whether physical, virtual
or in the cloud. Deliver compliance at lower cost and gain new business 
insights. http://p.sf.net/sfu/splunk-dev2dev 
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to