Eu uso lxccontêineres sem privilégios no Arch Linux. Aqui estão as informações básicas do sistema:
[chb@conventiont ~]$ uname -a
Linux conventiont 3.17.4-Chb #1 SMP PREEMPT Fri Nov 28 12:39:54 UTC 2014 x86_64 GNU/Linux
É um kernel personalizado / compilado com user namespace enabled:
[chb@conventiont ~]$ lxc-checkconfig
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
[chb@conventiont ~]$ systemctl --version
systemd 217
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID -ELFUTILS +KMOD +IDN
Infelizmente, systemdnão joga bem com lxcatualmente. Especialmente, a configuração cgroupspara um usuário não root parece não estar funcionando bem ou eu não estou familiarizado com isso. lxcsó iniciará um contêiner no modo não privilegiado quando ele puder criar os cgroups necessários /sys/fs/cgroup/XXX/*. No entanto, isso não é possível lxcporque systemdmonta a roothierarquia do cgroup /sys/fs/cgroup/*. Uma solução alternativa parece ser a seguinte:
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
Esse código cria os cgroupdiretórios correspondentes na cgrouphierarquia para um usuário não privilegiado. No entanto, algo que eu não entendo acontece. Antes de executar o mencionado acima, verei o seguinte:
[chb@conventiont ~]$ cat /proc/self/cgroup
8:blkio:/
7:net_cls:/
6:freezer:/
5:devices:/
4:memory:/
3:cpu,cpuacct:/
2:cpuset:/
1:name=systemd:/user.slice/user-1000.slice/session-c1.scope
Depois de executar o código mencionado acima, vejo no shell que o executei:
[chb@conventiont ~]$ cat /proc/self/cgroup
8:blkio:/chb
7:net_cls:/chb
6:freezer:/chb
5:devices:/chb
4:memory:/chb
3:cpu,cpuacct:/chb
2:cpuset:/chb
1:name=systemd:/chb
Mas em qualquer outro shell ainda vejo:
[chb@conventiont ~]$ cat /proc/self/cgroup
8:blkio:/
7:net_cls:/
6:freezer:/
5:devices:/
4:memory:/
3:cpu,cpuacct:/
2:cpuset:/
1:name=systemd:/user.slice/user-1000.slice/session-c1.scope
Portanto, posso iniciar meu lxccontêiner sem privilégios no shell, executei o código mencionado acima, mas não em nenhum outro.
Alguém pode explicar esse comportamento?
Alguém encontrou uma maneira melhor de configurar o necessário
cgroupscom uma versão atual desystemd(>= 217)?