[lxc-devel] [PATCH 2/2] lxc-start: allow configuring explicit path to overlayfs workdir

Serge Hallyn serge.hallyn at ubuntu.com
Mon May 4 13:53:21 UTC 2015


Quoting Marcin Bachry (hegel666 at gmail.com):
> At the moment LXC creates an "olwork" directory under upper
> directory's parent. In many cases it's going to be /var/lib/lxc/name,
> but it's not necessarily the case. The target directory may be a
> read-only file system or simply a place where user doesn't want to
> have sudden scratch directories created. This commit gives the user
> more control by adding an optional third path to existing overlay
> rootfs syntax:
> 
>     overlayfs:/lower:/upper:/work
> 
> Signed-off-by: Marcin Bachry <hegel666 at gmail.com>

Seems reasonable, one comment below.

> ---
>  doc/lxc.container.conf.sgml.in |  8 ++++++--
>  src/lxc/bdev.c                 | 43 +++++++++++++++++++++++++++---------------
>  2 files changed, 34 insertions(+), 17 deletions(-)
> 
> diff --git a/doc/lxc.container.conf.sgml.in b/doc/lxc.container.conf.sgml.in
> index aceeb1e..45dcced 100644
> --- a/doc/lxc.container.conf.sgml.in
> +++ b/doc/lxc.container.conf.sgml.in
> @@ -959,8 +959,12 @@ proc proc proc nodev,noexec,nosuid 0 0
>            itself should be mounted.  <filename>overlayfs:/lower:/upper</filename>
>            specifies that the rootfs should be an overlay with <filename>/upper</filename>
>            being mounted read-write over a read-only mount of <filename>/lower</filename>.
> -          <filename>aufs:/lower:/upper</filename> does the same using aufs in place
> -          of overlayfs. <filename>loop:/file</filename> tells lxc to attach
> +          <filename>aufs:/lower:/upper</filename> does the same using
> +          aufs in place of overlayfs.  overlayfs also accepts an
> +          optional workdir path separated by colon - if it's not
> +          provided, LXC uses <filename>olwork</filename> directory
> +          created under the same path where upper directory is present.
> +          <filename>loop:/file</filename> tells lxc to attach
>            <filename>/file</filename> to a loop device and mount the loop device.
>              </para>
>            </listitem>
> diff --git a/src/lxc/bdev.c b/src/lxc/bdev.c
> index abc75f8..f9800df 100644
> --- a/src/lxc/bdev.c
> +++ b/src/lxc/bdev.c
> @@ -2183,27 +2183,36 @@ static int overlayfs_mount(struct bdev *bdev)
>  
>  	//  separately mount it first
>  	//  mount -t overlayfs -oupperdir=${upper},lowerdir=${lower} lower dest
> -	dup = alloca(strlen(bdev->src)+1);
> -	strcpy(dup, bdev->src);
> +	dup = strdupa(bdev->src);

as i recall strdupa isn't defined in the android c library,
so this needs to be split up.

>  	if (!(lower = strchr(dup, ':')))
>  		return -22;
>  	if (!(upper = strchr(++lower, ':')))
>  		return -22;
>  	*upper = '\0';
>  	upper++;
> +	// work dir is optional
> +	work = strchr(upper, ':');
> +	if (work) {
> +		*work = '\0';
> +		work++;
> +	}
> +
> +	if (!work) {
> +		// overlayfs.v22 or higher needs workdir option, if it
> +		// wasn't provided in config, infer it in the
> +		// following way:
> +		// if upper is /var/lib/lxc/c2/delta0,
> +		// then workdir is /var/lib/lxc/c2/olwork
> +		lastslash = strrchr(upper, '/');
> +		if (!lastslash)
> +			return -22;
> +		lastslash++;
> +		lastslashidx = lastslash - upper;
>  
> -	// overlayfs.v22 or higher needs workdir option
> -	// if upper is /var/lib/lxc/c2/delta0,
> -	// then workdir is /var/lib/lxc/c2/olwork
> -	lastslash = strrchr(upper, '/');
> -	if (!lastslash)
> -		return -22;
> -	lastslash++;
> -	lastslashidx = lastslash - upper;
> -
> -	work = alloca(lastslashidx + 7);
> -	strncpy(work, upper, lastslashidx+7);
> -	strcpy(work+lastslashidx, "olwork");
> +		work = alloca(lastslashidx + 7);
> +		strncpy(work, upper, lastslashidx+7);
> +		strcpy(work+lastslashidx, "olwork");
> +	}
>  	if ((mkdir(work, 0755) < 0) && errno != EEXIST) {
>  		SYSERROR("error: mkdir %s", work);
>  		return -22;
> @@ -2385,7 +2394,7 @@ static int overlayfs_clonepaths(struct bdev *orig, struct bdev *new, const char
>  		// private delta which is originally rsynced from the
>  		// original delta
>  		char *osrc, *odelta, *nsrc, *ndelta, *work;
> -		char *lastslash;
> +		char *lastslash, *x;
>  		int len, ret, lastslashidx;
>  		if (!(osrc = strdup(orig->src)))
>  			return -22;
> @@ -2396,6 +2405,10 @@ static int overlayfs_clonepaths(struct bdev *orig, struct bdev *new, const char
>  		}
>  		*odelta = '\0';
>  		odelta++;
> +		// ignore optional path to workdir, if present
> +		x = strchr(odelta, ':');
> +		if (x)
> +			*x = '\0';
>  		ndelta = dir_new_path(odelta, oldname, cname, oldpath, lxcpath);
>  		if (!ndelta) {
>  			free(osrc);
> -- 
> 2.1.4
> 
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel


More information about the lxc-devel mailing list