Yo uso lxccontenedores 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, systemdno juega bien con la lxcactualidad. cgroupsParece que la configuración especial para un usuario no root no funciona bien o no estoy familiarizado con cómo hacerlo. lxcsolo iniciará un contenedor en modo no privilegiado cuando pueda crear los grupos c necesarios /sys/fs/cgroup/XXX/*. Sin embargo, esto no es posible lxcporque systemdmonta la rootjerarquí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 cgroupdirectorios correspondientes en la cgroupjerarquí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 lxccontenedor 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
cgroupscon 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
rootadministrador para crear ychownusted en todos loscgroupcontroladores. Esto está perfectamente bien y seguro.movepidse puede hacer sinrootderechos y, por lo tanto, sin privacidad. El usuario no necesita ningúnsudoderecho. (Por cierto,libcgroupse 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
cgmanagerporque 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