How to create user cgroups with systemd
A better and safer solution is to install cgmanager
and run it with systemctl start cgmanager
(on a systemd
-based distro). You can than have your root
user, or if you have sudo
rights on the host create cgroups
for your unprivileged user in all controllers with:
sudo cgm create all $USER
sudo cgm chown all $USER $(id -u $USER) $(id -g $USER)
Once they have been created for your unprivileged user she/he can move processes he has access to into his cgroup
for every controller by using:
cgm movepid all $USER $PPID
Safer, faster, more reliable than the shell script I posted.
Manual solution:
To answer 1.
for d in /sys/fs/cgroup/*; do
f=$(basename $d)
echo "looking at $f"
if [ "$f" = "cpuset" ]; then
echo 1 | sudo tee -a $d/cgroup.clone_children;
elif [ "$f" = "memory" ]; then
echo 1 | sudo tee -a $d/memory.use_hierarchy;
fi
sudo mkdir -p $d/$USER
sudo chown -R $USER $d/$USER
echo $$ > $d/$USER/tasks
done
I was ignorant about what was going on exactly when I wrote that script but reading the cgroups documentation and experimenting a bit helped me to understand what is going on. What I am basically doing in this script is to create a new cgroup
session for the current user
which is what I already stated above. When I run these commands in the current shell
or run them in a script and make it so that it gets evaluated in the current shell
and not in a subshell
(via . script
The .
is important for this to work!) is that I not just open a new session for user
but add the current shell as a process that runs in this new cgroup. I can achieve the same effect by running the script in a subshell and then descend into the cgroup
hierarchy in the chb
subcgroup
and use echo $$ > tasks
to add the current shell to every member of the chb cgroup hierarchy
.
Hence, when I run lxc
in that current shell my container will also become a member of all the chb
subcgroup
s that the current shell
is a member of. That is to say my container
inherits the cgroup
status of my shell
. This also explains why it doesn't work in any other shell that is not part of the current chb
subcgroup
s.
I still pass at 2.
. We'll probably need to wait either for a systemd
update or further Kernel
developments to make systemd
adopt a consistent behaviour but I prefer the manual setup anyway as it forces you to understand what you're doing.