[CRIU] [PATCH 4/5] cgroups: add support for c/r of the devices cgroup
Tycho Andersen
tycho.andersen at canonical.com
Mon Jun 6 10:48:27 PDT 2016
On Mon, Jun 06, 2016 at 07:54:30PM +0300, Cyrill Gorcunov wrote:
> On Mon, Jun 06, 2016 at 03:20:16PM +0000, Tycho Andersen wrote:
> > This one is a little big ugly, see comments for details. At some point we
> > should invent a better way to do these special cases, since we have them
> > for freezer, cpuset, and now devices. Perhaps something like fstype, where
> > you can ask the cgroup how to restore itself.
> >
> > Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
> > CC: Cyrill Gorcunov <gorcunov at openvz.org>
> ...
> > @@ -1253,6 +1253,46 @@ static int prepare_cgroup_dir_properties(char *path, int off, CgroupDirEntry **e
> > if (special)
> > continue;
> >
> > + /* The devices cgroup must be restored in a
> > + * special way: only the contents of
> > + * devices.list can be read, and it is a
> > + * whitelist of all the devices the cgroup is
> > + * allowed to create. To re-creat this
> > + * whitelist, we first deny everything via
> > + * devices.deny, and then write the list back
> > + * into devices.allow.
> > + */
> > + if (!strcmp(e->properties[j]->name, "devices.list")) {
> > + CgroupPropEntry *pe = e->properties[j];
> > + char *old_val = pe->value, *old_name = pe->name;
> > + int ret;
> > +
> > + /* A bit of a fudge here. These are
> > + * write only by owner by default, but
> > + * the container engine could have
> > + * changed the perms. We should come up
> > + * with a better way to restore all of
> > + * this stuff.
> > + */
> > + pe->perms->mode = 0200;
> > +
> > + pe->name = "devices.deny";
> > + pe->value = "a";
> > + ret = restore_cgroup_prop(e->properties[j], path, off2);
> > + pe->name = old_name;
> > + pe->name = old_val;
>
> IIRC, choosing device.allow or device.deny depends
> on default stragegy. If it's "allow", then list
> represent those which are not permitted to use
> and reverse, no?
devices.list is always a whitelist, and adding something to
device.deny just removes it from devices.list (and from child cgroups'
whitelists as well):
root at smitten:/sys/fs/cgroup/devices/A# cat devices.list
root at smitten:/sys/fs/cgroup/devices/A# echo "c 195:1 rw" > devices.allow
root at smitten:/sys/fs/cgroup/devices/A# cat devices.list
c 195:1 rw
root at smitten:/sys/fs/cgroup/devices/A# echo "c 195:1 rw" > devices.deny
root at smitten:/sys/fs/cgroup/devices/A# cat devices.list
root at smitten:/sys/fs/cgroup/devices/A#
Tycho
More information about the CRIU
mailing list