[lxc-devel] [PATCH] Watch utmp if /var/run is not shared

Ward, David - 0663 - MITLL david.ward at ll.mit.edu
Tue Mar 1 05:24:38 UTC 2011


The two variables I added have misleading names.  I will fix these, 
clarify the commit message, and resend shortly.

David

On 02/28/2011 07:08 PM, Ward, David - 0663 - MITLL wrote:
> lxc watches /var/run/utmp in the container to monitor its runlevel, so that
> it can stop or "reboot" the container when appropriate. This should not
> happen though if the container shares /var/run/utmp with the system (which
> should only be the case if the container does not run init).
>
> Currently this is avoided by requiring that the container has a separate
> filesystem root (i.e. "lxc.rootfs" is configured) in order to watch utmp.
> However it is also sufficient to share the filesystem root, but to re-mount
> /var/run so that there is a separate utmp file. (In the case of Upstart,
> /etc/init can be re-mounted as well to allow the container to have its own
> set of init scripts. The remainder of the filesystem can still be shared.)
>
> With this change, lxc checks the device ID and inode number of /var/run to
> see if the container has re-mounted it as a pre-condition of watching utmp.
> This replaces the check for "lxc.rootfs" in the configuration.
>
> Signed-off-by: David Ward<david.ward at 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..3356396 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_utmp_stat, system_utmp_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_utmp_stat)) {
>   		WARN("'%s' not found", path);
>   		return 0;
>   	}
>
> +	if (stat("/var/run",&system_utmp_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_utmp_stat.st_dev == system_utmp_stat.st_dev)
> +	&&  (container_utmp_stat.st_ino == system_utmp_stat.st_ino)) {
> +		return 0;
> +	}
> +
>   	utmp_data = (struct lxc_utmp *)malloc(sizeof(struct lxc_utmp));
>
>   	if (NULL == utmp_data) {

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5650 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20110301/0a08590d/attachment.bin>


More information about the lxc-devel mailing list