23.11.2010 13:25, Michael Tokarev wrote:
> Hello again.
> 
> I asked this question before, but got no (satisfactory)
> answer. So here it goes again.
> 
> Why not chdir into the root of container right when
> the root filesystem is (bind-)mounted, and let all
> mount entries to be relative to the container root?
> 
> Even more, to warn if lxc.mount[.entry] contains
> absolute path for the destination directory (or a
> variation of this, absolute and does not start with
> container root mount point)?
> 
> This way, all mounts will look much more sane, and
> it will be much easier to move/clone containers -
> by changing only lxc.rootfs.
> 
> I can easily cook a patch for that (it's trivial),
> but I want to hear any disagreements before ;)
> 
> I do it this way locally since the beginning, by
> chdir'ing to the proper directory (rootfs) before
> running lxc-start (in a startup script), but this
> is now broken in 0.7.3 which bind-mounts rootfs
> somewhere in /usr/lib/lxc.

I looked into the code and it turned out to be easier
than I thought.  Something like the attached.  It
just qualifies the relative paths found in mount
entries with rootfs->mount, as all other places
(/dev processing etc) does.

Just in case,

Signed-Off-By: Michael Tokarev <m...@tls.msk.ru>

/mjt
diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index ee5acd0..5e988f1 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -915,12 +915,14 @@ static int parse_mntopts(struct mntent *mntent, unsigned long *mntflags,
 	return 0;
 }
 
-static int mount_file_entries(FILE *file)
+static int mount_file_entries(const struct lxc_rootfs *rootfs, FILE *file)
 {
 	struct mntent *mntent;
 	int ret = -1;
 	unsigned long mntflags;
 	char *mntdata;
+	char path[MAXPATHLEN];
+	const char *mntdir;
 
 	while ((mntent = getmntent(file))) {
 
@@ -932,7 +934,20 @@ static int mount_file_entries(FILE *file)
 			goto out;
 		}
 
-		if (mount(mntent->mnt_fsname, mntent->mnt_dir,
+		mntdir =  mntent->mnt_dir;
+		if (mntdir[0] != '/') {
+			snprintf(path, sizeof(path), "%s/%s",
+				rootfs->mount, mntdir);
+			mntdir = path;
+		}
+		else if (strncmp(mntdir, rootfs->mount, strlen(rootfs->mount)))
+			WARN("mount target directory '%s' is outside container root",
+				mntdir);
+		else
+			WARN("mount target directory '%s' is not relative to container root",
+				mntdir);
+
+		if (mount(mntent->mnt_fsname, mntdir,
 			  mntent->mnt_type, mntflags & ~MS_REMOUNT, mntdata)) {
 			SYSERROR("failed to mount '%s' on '%s'",
 					 mntent->mnt_fsname, mntent->mnt_dir);
@@ -968,7 +983,7 @@ out:
 	return ret;
 }
 
-static int setup_mount(const char *fstab)
+static int setup_mount(const struct lxc_rootfs *rootfs, const char *fstab)
 {
 	FILE *file;
 	int ret;
@@ -982,13 +997,13 @@ static int setup_mount(const char *fstab)
 		return -1;
 	}
 
-	ret = mount_file_entries(file);
+	ret = mount_file_entries(rootfs, file);
 
 	endmntent(file);
 	return ret;
 }
 
-static int setup_mount_entries(struct lxc_list *mount)
+static int setup_mount_entries(const struct lxc_rootfs *rootfs, struct lxc_list *mount)
 {
 	FILE *file;
 	struct lxc_list *iterator;
@@ -1008,7 +1023,7 @@ static int setup_mount_entries(struct lxc_list *mount)
 
 	rewind(file);
 
-	ret = mount_file_entries(file);
+	ret = mount_file_entries(rootfs, file);
 
 	fclose(file);
 	return ret;
@@ -1612,12 +1627,12 @@ int lxc_setup(const char *name, struct lxc_conf *lxc_conf)
 		return -1;
 	}
 
-	if (setup_mount(lxc_conf->fstab)) {
+	if (setup_mount(&lxc_conf->rootfs, lxc_conf->fstab)) {
 		ERROR("failed to setup the mounts for '%s'", name);
 		return -1;
 	}
 
-	if (setup_mount_entries(&lxc_conf->mount_list)) {
+	if (setup_mount_entries(&lxc_conf->rootfs, &lxc_conf->mount_list)) {
 		ERROR("failed to setup the mount entries for '%s'", name);
 		return -1;
 	}
------------------------------------------------------------------------------
Increase Visibility of Your 3D Game App & Earn a Chance To Win $500!
Tap into the largest installed PC base & get more eyes on your game by
optimizing for Intel(R) Graphics Technology. Get started today with the
Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs.
http://p.sf.net/sfu/intelisp-dev2dev
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to