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
)?
sudo systemctl start cgmanager && sudo cgm create all $USER && sudo cgm chown all $USER $(id -u) $(id -g) && sudo cgm movepid all $USER $PPID
. El último comando debe ejecutarse en el shell actual para agregarlo al nuevo cgroup para$USER
.En realidad, en archlinux, esto no funcionará, por ejemplo, con un usuario sin privilegios (recomendado cuando se usan contenedores no privados .xxc). es decir, ese usuario no tiene sudo :)
En su lugar, defina el grupo en /etc/cgconfig.conf, active cgconfig, cgrules (libcgroup en AUR), agregue cgrules también, listo ... sin privilegios. El usuario también tendrá los mismos derechos.
En systemd 218 (no sé cuándo, pero parece que uno tiene que agregar dos condiciones más, ya que no se establecen cuando se crean de la manera cgconfig):
Suponiendo que el espacio de nombres se compila en el núcleo.
Esta es una plantilla, cpus puede estar de acuerdo con la cantidad de núcleos que tenga, mem puede establecerse en algún valor real, etc.
EDITAR 2: Finalmente, en systemd, si desea utilizar el inicio automático con un usuario sin privilegios, puede hacer lo siguiente:
cp /usr/lib/systemd/system/lxc{,admin}\@.service, luego agregue User = lxcadmin
y habilítelo para el contenedor de lxcadmin llamado lolz systemctl enable lxcadmin @ lolz.
fuente
root
administrador para crear ychown
usted en todos loscgroup
controladores. Esto está perfectamente bien y seguro.movepid
se puede hacer sinroot
derechos y, por lo tanto, sin privacidad. El usuario no necesita ningúnsudo
derecho. (Por cierto,libcgroup
se supone que ya no se debe usar. RHEL y otros lo han desaprobado.)Así que me encontré con el mismo problema al intentar hacer que los contenedores no privilegiados de LXC funcionaran en CentOS 7. No quería usarlo
cgmanager
porque no me gusta introducir ningún servicio adicional si no es absolutamente necesario. Lo que terminé haciendo es parchear systemd usando algunos parches del paquete ubuntu y un parche personalizado para expandir la lista de controladores de cgroup. Tengo las fuentes necesarias para crear un RPM en mi cuenta de GitHub en https://github.com/CtrlC-Root/rpmdist . También tengo versiones parcheadas de shadow-utils (para subuids y subgids) y pam (para loginuid). Después de instalar estos RPM y configurar un usuario para ejecutar contenedores no privilegiados (asignar subuids y subgids, asignar veth pares en lxc-usernet, crear .config / lxc / default.conf, etc.) puedo ejecutar LXC contenedores no privilegiados muy bien.EDITAR: Otra razón por la que no quería usar cgmanager es porque no quería que mis usuarios habituales tuvieran que usar sudo en absoluto. Los usuarios habituales deberían poder iniciar sesión y todo debería "funcionar" de inmediato.
fuente