Creo que he encontrado una mejor solución que las que se presentan actualmente aquí. En parte porque, por lo que puedo decir, cgmanager está muerto, en parte porque mi solución no parece una solución alternativa, sino principalmente porque esta discusión todavía aparece cuando busco una solución al problema. En realidad es bastante simple: use el modo de usuario systemd .
Por supuesto, si no usa systemd, esta solución no va a ayudar. En ese caso, le aconsejaría que averigüe si su sistema init tiene alguna forma de permitir que usuarios sin privilegios ejecuten servicios en el arranque y los usen como punto de partida.
Uso del modo de usuario systemd para iniciar automáticamente contenedores lxc sin privilegios
Supongo que tiene contenedores lxc sin privilegios que funcionan correctamente y que se ejecutan a lxc-autostart
medida que funciona el usuario del contenedor. Si es así, haga lo siguiente:
- Cree el archivo
~/.config/systemd/user/lxc-autostart.service
en el hogar de cualquier usuario que tenga los contenedores lxc:
[Unit]
Description="Lxc-autostart for lxc user"
[Service]
Type=oneshot
ExecStart=/usr/bin/lxc-autostart
ExecStop=/usr/bin/lxc-autostart -s
RemainAfterExit=1
[Install]
WantedBy=default.target
- Luego, mientras ese usuario ejecuta:
systemctl --user enable lxc-autostart
(Tenga en cuenta que la --user
opción le dice a systemctl que lo está usando en modo de usuario. Todas las cosas que normalmente hago con systemctl, start, stop, statuc, enable, etc., funcionan con --user).
- Luego ejecute lo siguiente, donde
$user
está el nombre del usuario que tiene los contenedores lxc:
sudo loginctl enable-linger $user
Esto es necesario para que systemd inicie una instancia de usuario systemd $user
en el arranque. De lo contrario, solo comenzaría uno en el momento $user
en que inicie sesión.
Para obtener más información, recomiendo la página archlinux wiki systemd / timer y las páginas man de systemd .
Acceder a la instancia de systemd de un usuario como root
En realidad, puede iniciar / detener / cualquier servicio systemd de un usuario como root, sin embargo, esto requiere que configure la XDG_RUNTIME_DIR
variable de entorno. Supongamos que $user
es el usuario a cuya instancia desea acceder y $uid
es uid, así es como iniciaría el servicio lxc-autostart.service definido anteriormente:
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart
Incluso puede usar systemd-run
para ejecutar comandos arbitrarios como ese usuario de una manera que no rompa lxc. Estoy usando los siguientes comandos para detener / iniciar mis contenedores antes / después de la copia de seguridad, donde $name
está el nombre del contenedor lxc que se está respaldando:
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --wait lxc-stop -n $name
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --scope lxc-start -n $name
(Tenga en cuenta que sin --wait
systemd-run no se bloquea hasta que se detiene el contenedor).