[lxc-devel] [lxc/master] 2016 02 19/cgfs
hallyn on Github
lxc-bot at linuxcontainers.org
Sat Feb 20 02:50:38 UTC 2016
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 377 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20160220/b9219058/attachment.bin>
-------------- next part --------------
From dddf7c5b7e0fbf35006bbf3a524c0c15ed687deb Mon Sep 17 00:00:00 2001
From: Serge Hallyn <serge.hallyn at ubuntu.com>
Date: Fri, 19 Feb 2016 18:43:50 -0800
Subject: [PATCH 1/2] cgfs: also check for EACCES when writing devices
Because that's what lxcfs gives us.
Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
---
src/lxc/cgfs.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/lxc/cgfs.c b/src/lxc/cgfs.c
index f303a11..603d63a 100644
--- a/src/lxc/cgfs.c
+++ b/src/lxc/cgfs.c
@@ -1918,12 +1918,12 @@ static int do_setup_cgroup_limits(struct cgfs_data *d,
cgroup_devices_has_allow_or_deny(d, cg->value, true))
continue;
if (lxc_cgroup_set_data(cg->subsystem, cg->value, d)) {
- if (do_devices && errno == EPERM) {
+ if (do_devices && (errno == EACCES || errno == EPERM)) {
WARN("Error setting %s to %s for %s",
cg->subsystem, cg->value, d->name);
continue;
}
- ERROR("Error setting %s to %s for %s",
+ SYSERROR("Error setting %s to %s for %s",
cg->subsystem, cg->value, d->name);
goto out;
}
From 836514a877bac367d443b17f4c43afbf472f7222 Mon Sep 17 00:00:00 2001
From: Ubuntu <ubuntu at localhost.localdomain>
Date: Sat, 20 Feb 2016 02:25:55 +0000
Subject: [PATCH 2/2] lxc: cgfs: handle lxcfs
When containers have lxcfs mounted instead of cgroupfs, we have to
process /proc/self/mountinfo a bit differently. In particular, we
should look for fuse.lxcfs fstype, we need to look elsewhere for the
list of comounted controllers, and the mount_prefix is not a cgroup path
which was bind mounted, so we should ignore it, and named subsystems
show up without the 'name=' prefix.
With this patchset I can start containers inside a privileged lxd
container with lxcfs mounted (i.e. without cgroup namespaces).
Closes #830
Signed-off-by: Ubuntu <ubuntu at localhost.localdomain>
---
src/lxc/cgfs.c | 44 ++++++++++++++++++++++++++++++--------------
1 file changed, 30 insertions(+), 14 deletions(-)
diff --git a/src/lxc/cgfs.c b/src/lxc/cgfs.c
index 603d63a..d41e74c 100644
--- a/src/lxc/cgfs.c
+++ b/src/lxc/cgfs.c
@@ -433,6 +433,7 @@ static bool find_hierarchy_mountpts( struct cgroup_meta_data *meta_data, char **
struct cgroup_mount_point *mount_point;
struct cgroup_hierarchy *h;
char **subsystems;
+ bool is_lxcfs = false;
if (line[0] && line[strlen(line) - 1] == '\n')
line[strlen(line) - 1] = '\0';
@@ -471,10 +472,18 @@ static bool find_hierarchy_mountpts( struct cgroup_meta_data *meta_data, char **
continue;
/* not a cgroup filesystem */
- if (strcmp(tokens[j + 1], "cgroup") != 0)
- continue;
-
- subsystems = subsystems_from_mount_options(tokens[j + 3], kernel_subsystems);
+ if (strcmp(tokens[j + 1], "cgroup") != 0) {
+ if (strcmp(tokens[j + 1], "fuse.lxcfs") != 0)
+ continue;
+ if (strncmp(tokens[4], "/sys/fs/cgroup/", 15) != 0)
+ continue;
+ is_lxcfs = true;
+ char *curtok = tokens[4] + 15;
+ subsystems = subsystems_from_mount_options(curtok,
+ kernel_subsystems);
+ } else
+ subsystems = subsystems_from_mount_options(tokens[j + 3],
+ kernel_subsystems);
if (!subsystems)
goto out;
@@ -503,8 +512,11 @@ static bool find_hierarchy_mountpts( struct cgroup_meta_data *meta_data, char **
meta_data->mount_points[mount_point_count++] = mount_point;
mount_point->hierarchy = h;
+ if (is_lxcfs)
+ mount_point->mount_prefix = strdup("/");
+ else
+ mount_point->mount_prefix = strdup(tokens[3]);
mount_point->mount_point = strdup(tokens[4]);
- mount_point->mount_prefix = strdup(tokens[3]);
if (!mount_point->mount_point || !mount_point->mount_prefix)
goto out;
mount_point->read_only = !lxc_string_in_list("rw", tokens[5], ',');
@@ -1704,16 +1716,20 @@ static char **subsystems_from_mount_options(const char *mount_options,
* subsystems provided by the kernel OR if it starts
* with name= for named hierarchies
*/
- if (!strncmp(token, "name=", 5) || lxc_string_in_array(token, (const char **)kernel_list)) {
- r = lxc_grow_array((void ***)&result, &result_capacity, result_count + 1, 12);
- if (r < 0)
- goto out_free;
- result[result_count + 1] = NULL;
+ r = lxc_grow_array((void ***)&result, &result_capacity, result_count + 1, 12);
+ if (r < 0)
+ goto out_free;
+ result[result_count + 1] = NULL;
+ if (strncmp(token, "name=", 5) && !lxc_string_in_array(token, (const char **)kernel_list)) {
+ // this is eg 'systemd' but the mount will be 'name=systemd'
+ result[result_count] = malloc(strlen(token) + 6);
+ if (result[result_count])
+ sprintf(result[result_count], "name=%s", token);
+ } else
result[result_count] = strdup(token);
- if (!result[result_count])
- goto out_free;
- result_count++;
- }
+ if (!result[result_count])
+ goto out_free;
+ result_count++;
}
return result;
More information about the lxc-devel
mailing list