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
)?
sudo systemctl start cgmanager && sudo cgm create all $USER && sudo cgm chown all $USER $(id -u) $(id -g) && sudo cgm movepid all $USER $PPID
. O último comando precisa ser executado no shell atual para adicioná-lo ao novo cgroup for$USER
.Na verdade, no archlinux, isso não funcionará, por exemplo, com um usuário sem privilégios (recomendado ao usar contêineres sem lxc). ou seja, esse usuário não tem sudo :)
Em vez disso, defina o grupo no /etc/cgconfig.conf, ative o cgconfig, o cgrules (libcgroup no AUR), adicione também o cgrules, pronto. O usuário também terá os mesmos direitos.
No systemd 218 (não sei quando, mas parece que é preciso adicionar mais duas condições, pois elas não são definidas quando criadas da maneira cgconfig):
Supondo que o espaço para nome seja compilado no kernel.
Este é um modelo, o cpus pode estar de acordo com quantos núcleos você possui, mem pode ser definido com algum valor real, etc.
EDIÇÃO 2: Finalmente, no systemd, se você deseja usar o início automático com um usuário tão privilegiado, pode:
cp /usr/lib/systemd/system/lxc{,admin}\@.service e adicione User = lxcadmin
e habilite-o para o contêiner do lxcadmin chamado lolz systemctl enable lxcadmin @ lolz.
fonte
root
administrador criar echown
você em todos oscgroup
controladores. Isso é perfeitamente fino e seguro.movepid
pode ser feito semroot
direitos e, portanto, sem privações. O usuário não precisa de nenhumsudo
direito. (Btw,libcgroup
não é suposto ser mais utilizado RHEL e outros têm depreciado-lo..)Por isso, tive o mesmo problema ao tentar fazer com que contêineres sem privilégios LXC funcionassem no CentOS 7. Não queria usar
cgmanager
porque não gosto de introduzir nenhum serviço adicional, se não for absolutamente necessário. O que acabei fazendo foi corrigir o systemd usando alguns patches do pacote ubuntu e um patch personalizado para expandir a lista de controladores cgroup. Eu tenho as fontes necessárias para criar um RPM na minha conta do GitHub em https://github.com/CtrlC-Root/rpmdist . Também tenho versões corrigidas do shadow-utils (para subuids e subgids) e pam (para loginuid). Depois de instalar esses RPMs e configurar um usuário para executar contêineres sem privilégios (atribuir subuids e subgids, alocar pares veth no lxc-usernet, criar .config / lxc / default.conf, etc), posso executar contêineres sem privilégios LXC.EDIT: Outra razão pela qual eu não queria usar o cgmanager é porque eu não queria que meus usuários comuns tivessem que usar o sudo. Usuários regulares devem poder fazer login e tudo deve "funcionar" imediatamente.
fonte