Commit 80a881b2 by Serge Hallyn Committed by Daniel Lezcano

templates: use relative paths when creating containers

At the same time, allow lxc.mount.entry to specify an absolute target path relative to /var/lib/lxc/CN/rootfs, even if rootfs is a blockdev. Otherwise all such entries are ignored for blockdev-backed containers. Signed-off-by: 's avatarSerge Hallyn <serge.hallyn@ubuntu.com> Signed-off-by: 's avatarDaniel Lezcano <dlezcano@fr.ibm.com>
parent 26ddeedd
...@@ -1142,27 +1142,50 @@ static inline int mount_entry_on_systemfs(struct mntent *mntent) ...@@ -1142,27 +1142,50 @@ static inline int mount_entry_on_systemfs(struct mntent *mntent)
} }
static int mount_entry_on_absolute_rootfs(struct mntent *mntent, static int mount_entry_on_absolute_rootfs(struct mntent *mntent,
const struct lxc_rootfs *rootfs) const struct lxc_rootfs *rootfs,
const char *lxc_name)
{ {
char *aux; char *aux;
char path[MAXPATHLEN]; char path[MAXPATHLEN];
unsigned long mntflags; unsigned long mntflags;
char *mntdata; char *mntdata;
int ret = 0; int r, ret = 0, offset;
if (parse_mntopts(mntent->mnt_opts, &mntflags, &mntdata) < 0) { if (parse_mntopts(mntent->mnt_opts, &mntflags, &mntdata) < 0) {
ERROR("failed to parse mount option '%s'", mntent->mnt_opts); ERROR("failed to parse mount option '%s'", mntent->mnt_opts);
return -1; return -1;
} }
/* if rootfs->path is a blockdev path, allow container fstab to
* use /var/lib/lxc/CN/rootfs as the target prefix */
r = snprintf(path, MAXPATHLEN, "/var/lib/lxc/%s/rootfs", lxc_name);
if (r < 0 || r >= MAXPATHLEN)
goto skipvarlib;
aux = strstr(mntent->mnt_dir, path);
if (aux) {
offset = strlen(path);
goto skipabs;
}
skipvarlib:
aux = strstr(mntent->mnt_dir, rootfs->path); aux = strstr(mntent->mnt_dir, rootfs->path);
if (!aux) { if (!aux) {
WARN("ignoring mount point '%s'", mntent->mnt_dir); WARN("ignoring mount point '%s'", mntent->mnt_dir);
goto out; goto out;
} }
offset = strlen(rootfs->path);
skipabs:
snprintf(path, MAXPATHLEN, "%s/%s", rootfs->mount, snprintf(path, MAXPATHLEN, "%s/%s", rootfs->mount,
aux + strlen(rootfs->path)); aux + offset);
if (r < 0 || r >= MAXPATHLEN) {
WARN("pathnme too long for '%s'", mntent->mnt_dir);
ret = -1;
goto out;
}
ret = mount_entry(mntent->mnt_fsname, path, mntent->mnt_type, ret = mount_entry(mntent->mnt_fsname, path, mntent->mnt_type,
mntflags, mntdata); mntflags, mntdata);
...@@ -1196,7 +1219,8 @@ static int mount_entry_on_relative_rootfs(struct mntent *mntent, ...@@ -1196,7 +1219,8 @@ static int mount_entry_on_relative_rootfs(struct mntent *mntent,
return ret; return ret;
} }
static int mount_file_entries(const struct lxc_rootfs *rootfs, FILE *file) static int mount_file_entries(const struct lxc_rootfs *rootfs, FILE *file,
const char *lxc_name)
{ {
struct mntent *mntent; struct mntent *mntent;
int ret = -1; int ret = -1;
...@@ -1217,7 +1241,7 @@ static int mount_file_entries(const struct lxc_rootfs *rootfs, FILE *file) ...@@ -1217,7 +1241,7 @@ static int mount_file_entries(const struct lxc_rootfs *rootfs, FILE *file)
continue; continue;
} }
if (mount_entry_on_absolute_rootfs(mntent, rootfs)) if (mount_entry_on_absolute_rootfs(mntent, rootfs, lxc_name))
goto out; goto out;
} }
...@@ -1228,7 +1252,8 @@ out: ...@@ -1228,7 +1252,8 @@ out:
return ret; return ret;
} }
static int setup_mount(const struct lxc_rootfs *rootfs, const char *fstab) static int setup_mount(const struct lxc_rootfs *rootfs, const char *fstab,
const char *lxc_name)
{ {
FILE *file; FILE *file;
int ret; int ret;
...@@ -1242,13 +1267,14 @@ static int setup_mount(const struct lxc_rootfs *rootfs, const char *fstab) ...@@ -1242,13 +1267,14 @@ static int setup_mount(const struct lxc_rootfs *rootfs, const char *fstab)
return -1; return -1;
} }
ret = mount_file_entries(rootfs, file); ret = mount_file_entries(rootfs, file, lxc_name);
endmntent(file); endmntent(file);
return ret; return ret;
} }
static int setup_mount_entries(const struct lxc_rootfs *rootfs, struct lxc_list *mount) static int setup_mount_entries(const struct lxc_rootfs *rootfs, struct lxc_list *mount,
const char *lxc_name)
{ {
FILE *file; FILE *file;
struct lxc_list *iterator; struct lxc_list *iterator;
...@@ -1268,7 +1294,7 @@ static int setup_mount_entries(const struct lxc_rootfs *rootfs, struct lxc_list ...@@ -1268,7 +1294,7 @@ static int setup_mount_entries(const struct lxc_rootfs *rootfs, struct lxc_list
rewind(file); rewind(file);
ret = mount_file_entries(rootfs, file); ret = mount_file_entries(rootfs, file, lxc_name);
fclose(file); fclose(file);
return ret; return ret;
...@@ -2060,12 +2086,12 @@ int lxc_setup(const char *name, struct lxc_conf *lxc_conf) ...@@ -2060,12 +2086,12 @@ int lxc_setup(const char *name, struct lxc_conf *lxc_conf)
return -1; return -1;
} }
if (setup_mount(&lxc_conf->rootfs, lxc_conf->fstab)) { if (setup_mount(&lxc_conf->rootfs, lxc_conf->fstab, name)) {
ERROR("failed to setup the mounts for '%s'", name); ERROR("failed to setup the mounts for '%s'", name);
return -1; return -1;
} }
if (setup_mount_entries(&lxc_conf->rootfs, &lxc_conf->mount_list)) { if (setup_mount_entries(&lxc_conf->rootfs, &lxc_conf->mount_list, name)) {
ERROR("failed to setup the mount entries for '%s'", name); ERROR("failed to setup the mount entries for '%s'", name);
return -1; return -1;
} }
......
...@@ -212,8 +212,8 @@ lxc.cgroup.devices.allow = c 5:2 rwm ...@@ -212,8 +212,8 @@ lxc.cgroup.devices.allow = c 5:2 rwm
lxc.cgroup.devices.allow = c 254:0 rwm lxc.cgroup.devices.allow = c 254:0 rwm
# mounts point # mounts point
lxc.mount.entry=proc $rootfs/proc proc nodev,noexec,nosuid 0 0 lxc.mount.entry=proc proc proc nodev,noexec,nosuid 0 0
lxc.mount.entry=sysfs $rootfs/sys sysfs defaults 0 0 lxc.mount.entry=sysfs sys sysfs defaults 0 0
EOF EOF
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
......
...@@ -263,9 +263,9 @@ lxc.cgroup.devices.allow = c 254:0 rwm ...@@ -263,9 +263,9 @@ lxc.cgroup.devices.allow = c 254:0 rwm
EOF EOF
cat <<EOF > $config_path/fstab cat <<EOF > $config_path/fstab
proc $rootfs_path/proc proc nodev,noexec,nosuid 0 0 proc proc proc nodev,noexec,nosuid 0 0
devpts $rootfs_path/dev/pts devpts defaults 0 0 devpts dev/pts devpts defaults 0 0
sysfs $rootfs_path/sys sysfs defaults 0 0 sysfs sys sysfs defaults 0 0
EOF EOF
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "Failed to add configuration" echo "Failed to add configuration"
......
...@@ -200,8 +200,8 @@ lxc.cgroup.devices.allow = c 5:2 rwm ...@@ -200,8 +200,8 @@ lxc.cgroup.devices.allow = c 5:2 rwm
lxc.cgroup.devices.allow = c 254:0 rwm lxc.cgroup.devices.allow = c 254:0 rwm
# mounts point # mounts point
lxc.mount.entry=proc $rootfs/proc proc nodev,noexec,nosuid 0 0 lxc.mount.entry=proc proc proc nodev,noexec,nosuid 0 0
lxc.mount.entry=sysfs $rootfs/sys sysfs defaults 0 0 lxc.mount.entry=sysfs sys sysfs defaults 0 0
EOF EOF
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
......
...@@ -281,8 +281,8 @@ lxc.cgroup.devices.allow = c 254:0 rwm ...@@ -281,8 +281,8 @@ lxc.cgroup.devices.allow = c 254:0 rwm
EOF EOF
cat <<EOF > $path/fstab cat <<EOF > $path/fstab
proc $rootfs/proc proc nodev,noexec,nosuid 0 0 proc proc proc nodev,noexec,nosuid 0 0
sysfs $rootfs/sys sysfs defaults 0 0 sysfs sys sysfs defaults 0 0
EOF EOF
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
......
...@@ -101,18 +101,18 @@ cat <<EOF >> $path/config ...@@ -101,18 +101,18 @@ cat <<EOF >> $path/config
lxc.utsname = $name lxc.utsname = $name
lxc.pts = 1024 lxc.pts = 1024
lxc.rootfs = $rootfs lxc.rootfs = $rootfs
lxc.mount.entry=/dev $rootfs/dev none ro,bind 0 0 lxc.mount.entry=/dev dev none ro,bind 0 0
lxc.mount.entry=/lib $rootfs/lib none ro,bind 0 0 lxc.mount.entry=/lib lib none ro,bind 0 0
lxc.mount.entry=/bin $rootfs/bin none ro,bind 0 0 lxc.mount.entry=/bin bin none ro,bind 0 0
lxc.mount.entry=/usr /$rootfs/usr none ro,bind 0 0 lxc.mount.entry=/usr usr none ro,bind 0 0
lxc.mount.entry=/sbin $rootfs/sbin none ro,bind 0 0 lxc.mount.entry=/sbin sbin none ro,bind 0 0
lxc.mount.entry=tmpfs $rootfs/var/run/sshd tmpfs mode=0644 0 0 lxc.mount.entry=tmpfs var/run/sshd tmpfs mode=0644 0 0
lxc.mount.entry=@LXCTEMPLATEDIR@/lxc-sshd $rootfs/sbin/init none bind 0 0 lxc.mount.entry=@LXCTEMPLATEDIR@/lxc-sshd sbin/init none bind 0 0
EOF EOF
if [ "$(uname -m)" = "x86_64" ]; then if [ "$(uname -m)" = "x86_64" ]; then
cat <<EOF >> $path/config cat <<EOF >> $path/config
lxc.mount.entry=/lib64 $rootfs/lib64 none ro,bind 0 0 lxc.mount.entry=/lib64 lib64 none ro,bind 0 0
EOF EOF
fi fi
} }
......
...@@ -87,8 +87,8 @@ lxc.cgroup.devices.allow = c 10:232 rwm ...@@ -87,8 +87,8 @@ lxc.cgroup.devices.allow = c 10:232 rwm
EOF EOF
cat <<EOF > $path/fstab cat <<EOF > $path/fstab
proc $rootfs/proc proc nodev,noexec,nosuid 0 0 proc proc proc nodev,noexec,nosuid 0 0
sysfs $rootfs/sys sysfs defaults 0 0 sysfs sys sysfs defaults 0 0
EOF EOF
return 0 return 0
......
...@@ -366,8 +366,8 @@ lxc.cgroup.devices.allow = c 10:232 rwm ...@@ -366,8 +366,8 @@ lxc.cgroup.devices.allow = c 10:232 rwm
EOF EOF
cat <<EOF > $path/fstab cat <<EOF > $path/fstab
proc $rootfs/proc proc nodev,noexec,nosuid 0 0 proc proc proc nodev,noexec,nosuid 0 0
sysfs $rootfs/sys sysfs defaults 0 0 sysfs sys sysfs defaults 0 0
EOF EOF
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
...@@ -543,7 +543,7 @@ do_bindhome() ...@@ -543,7 +543,7 @@ do_bindhome()
# bind-mount the user's path into the container's /home # bind-mount the user's path into the container's /home
h=`getent passwd $user | cut -d: -f 6` h=`getent passwd $user | cut -d: -f 6`
mkdir -p $rootfs/$h mkdir -p $rootfs/$h
echo "$h $rootfs/$h none bind 0 0" >> $path/fstab echo "$h $h none bind 0 0" >> $path/fstab
# Make sure the group exists in container # Make sure the group exists in container
grp=`echo $pwd | cut -d: -f 4` # group number for $user grp=`echo $pwd | cut -d: -f 4` # group number for $user
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment