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.