cgroup y lxc
Un saludo a la lista.
He estado este fin de semana curioseando lxc sobre jessie; y he llegado
al problema de los contenedores de usuario (los unprivileged
containers, vamos).
Después de dar vueltas y vueltas por internet acabé por pergeñar una
solución, pero no me acaba de funcionar, no sé muy bien por qué. La idea
es usar /etc/cgconfig.conf y /etc/cgrules.conf, de manera que al
arrancar se cree un cgroup de usuario llamado "lxc" en el que pueden
escribir los usuarios que pertenecen al grupo "lxc".
Para ello he creado este /etc/cgconfig.conf:
#v+
group lxc {
perm {
admin {
uid = root;
gid = lxc;
dperm = 775;
fperm = 664;
}
task {
uid = root;
gid = lxc;
fperm = 664;
}
}
memory {
memory.limit_in_bytes = 512m;
}
cpu {}
blkio {}
freezer {}
cpuacct {}
cpuset {
cgroup.clone_children = 1;
cpuset.cpus = 0;
cpuset.mems = 0;
}
devices {}
net_cls {}
net_prio {}
perf_event {}
}
#v-
Y en /etc/cgrules.conf he puesto esto:
#v+
@lxc:lxc-start * lxc/%u
@lxc:sleep * lxc/%u
#v-
La segunda línea sólo está a efectos de prueba y, en realidad, sobraría.
O sea, cuando un usuario del grupo "lxc" arranca lxc-start el proceso va
al cgroup lxc/nombre_de_usuario. Este cgroup lo creo cuando el usuario
arranca una sesión de bash (he creado un
/etc/profile.d/create_user_lxc.sh para ello).
En teoría debería funcionar y dejarme crear sin problema los
contenedores ya que estos se crearían dentro de lxc/nombre_de_usuario en
donde no hay problemas de permisos. Pero sucede una cosa muy curiosa con
lxc-start.
Si uso "sleep", la cosa va bien:
#v+
$ sleep 30 &
[1] 1124
$ cat /sys/fs/cgroup/memory/lxc/perico/tasks
1124
$ sleep 20 &
[2] 1126
$ cat /sys/fs/cgroup/memory/lxc/perico/tasks
1124
1126
$ sleep 10 &
[3] 1128
$ cat /sys/fs/cgroup/memory/lxc/poerico/tasks
1124
1126
1128
#v-
O sea todos los procesos "sleep" van a "lxc/perico". Sin embargo, con
lxc-start ocurre que la primera vez funciona como espero:
#v+
$ lxc-start -n wheezy -d
$ cat /sys/fs/cgroup/memory/lxc/perico/tasks
1139
$ ps -C lxc-start
PID TTY TIME CMD
1139 ? 00:00:00 lxc-start
#v-
Pero a partir de ese momento, deja de funcionarme eso de que todos los
procesos "sleep" y "lxc-start" vayan al cgroup "lxc/perico":
#v+
$ sleep 20 &
[3] 2400
pantuflo@zipi:~$ cat /sys/fs/cgroup/memory/lxc/pantuflo/tasks
1139
$ grep 2400 /sys/fs/cgroup/memory/tasks
2400
#v-
O sea, el sleep va al cgroup raiz. Este y todos los que lance a partir
de ahora. Un lxc-start falla y si miro por qué, me dice que porque no
puede crear el cgroup para el contenedor. Imagino que le pasará lo mismo
que a sleep: que el proceso va al cgroup raiz y ahí el usuario no puedo
crear ningún cgroup hijo.
Si la regla en cgrules.conf hago que sea:
@lxc * lxc/%u
La cosa funciona, pero yo lo único que quiero en cgroup aparte son las
máquinas lxc, no el resto de procesos que pueda crear el usuario.
¿A alguien alcanza a saber qué pasa?
Muchas gracias.
--
La virtud, como el arte, hallarse suele
cerca de lo difícil [...]
--- Lope de Vega ---
Reply to: