Uma solução melhor e mais segura é instalar cgmanager
e executá-lo com systemctl start cgmanager
(em uma distribuição systemd
-based). Você pode ter seu usuário root
ou, se tiver sudo
direitos no host, criar cgroups
para seu usuário não privilegiado em todos os controladores com:
sudo cgm create all $USER
sudo cgm chown all $USER $(id -u $USER) $(id -g $USER)
Uma vez que eles foram criados para o seu usuário não privilegiado, ele pode mover processos aos quais ele tem acesso em seu cgroup
para cada controlador usando:
cgm movepid all $USER $PPID
Mais seguro, mais rápido e mais confiável do que o script de shell que postei.
Solução manual:
Para responder 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
Eu ignorava o que estava acontecendo exatamente quando escrevi esse script, mas li este e experimentar um pouco me ajudou a entender o que está acontecendo. O que eu estou basicamente fazendo neste script é criar uma nova sessão cgroup
para o atual user
, que é o que eu já disse acima. Quando executo esses comandos no shell
atual ou os executo em um script e o faço para que ele seja avaliado no atual shell
e não em um subshell
(via . script
O .
é importante para isso funciona!) é que eu não apenas abro uma nova sessão para user
, mas adiciono o shell atual como um processo que é executado neste novo cgroup. Posso obter o mesmo efeito executando o script em um subshell e, em seguida, descendo até a cgroup
hierarchy no chb
subcgroup
e use echo $$ > tasks
para adicionar o shell atual a todos os membros do chb cgroup hierarchy
.
Portanto, quando eu executar lxc
no shell atual, meu contêiner também se tornará membro de todos os chb
subcgroup
s dos quais o shell
atual é membro. Isso significa que meu container
herda o status cgroup
do meu shell
. Isso também explica por que ele não funciona em nenhum outro shell que não faça parte do atual chb
subcgroup
s.
Eu ainda passo em 2.
. Provavelmente precisaremos esperar por um systemd
update ou mais Kernel
desenvolvimentos para fazer com que systemd
adote um comportamento consistente, mas prefiro a configuração manual de qualquer maneira, pois isso obriga a entender o que você está fazendo.