Yo uso lxc
contenedores sin privilegios en Arch Linux
. Aquí están las informaciones básicas del 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
Es un kernel personalizado / compilado con 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
Lamentablemente, systemd
no juega bien con la lxc
actualidad. cgroups
Parece que la configuración especial para un usuario no root no funciona bien o no estoy familiarizado con cómo hacerlo. lxc
solo iniciará un contenedor en modo no privilegiado cuando pueda crear los grupos c necesarios /sys/fs/cgroup/XXX/*
. Sin embargo, esto no es posible lxc
porque systemd
monta la root
jerarquía de cgroup en /sys/fs/cgroup/*
. Una solución alternativa parece ser hacer lo siguiente:
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
Este código crea los cgroup
directorios correspondientes en la cgroup
jerarquía para un usuario sin privilegios. Sin embargo, sucede algo que no entiendo. Antes de ejecutar lo anterior veré esto:
[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
Después de ejecutar el código antes mencionado que veo en el shell, lo ejecuté:
[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
Pero en cualquier otro caparazón todavía veo:
[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
Por lo tanto, puedo iniciar mi lxc
contenedor sin privilegios en el shell. Ejecuté el código mencionado anteriormente pero no en ningún otro.
¿Alguien puede explicar este comportamiento?
¿Alguien ha encontrado una mejor manera de configurar lo requerido
cgroups
con una versión actual desystemd
(>= 217
)?