[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: