Eu uso lxc
contê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, systemd
não joga bem com lxc
atualmente. Especialmente, a configuração cgroups
para um usuário não root parece não estar funcionando bem ou eu não estou familiarizado com isso. lxc
só 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 lxc
porque systemd
monta a root
hierarquia 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 cgroup
diretórios correspondentes na cgroup
hierarquia 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 lxc
contê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
cgroups
com uma versão atual desystemd
(>= 217
)?