Eu acho que encontrei uma solução melhor do que as atualmente apresentadas aqui. Em parte porque, até onde eu sei, o cgmanager está morto, em parte porque minha solução não parece uma solução alternativa, mas principalmente porque essa discussão ainda aparece ao procurar uma solução para o problema. Na verdade, é bem simples: use o modo de usuário systemd .
Concedido se você não usar o systemd, esta solução não ajudará. Nesse caso, aconselho que você descubra se o seu sistema init tem alguma maneira de permitir que usuários sem privilégios executem serviços na inicialização e os use como ponto de partida.
Usando o modo de usuário systemd para iniciar automaticamente contêineres lxc não privilegiados
Suponho que você tenha contêineres lxc sem privilégios funcionando corretamente e que funcionem lxc-autostart
conforme o usuário do contêiner funciona. Nesse caso, faça o seguinte:
- Crie o arquivo
~/.config/systemd/user/lxc-autostart.service
na casa de qualquer usuário que tenha os contêineres 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
- Então, como esse usuário é executado:
systemctl --user enable lxc-autostart
(Observe, a --user
opção diz ao systemctl que você o está usando no modo de usuário. Todas as coisas que normalmente faço com systemctl, inicio, parada, status, ativação, etc, funcionam com --user.)
- Em seguida, execute o seguinte, onde
$user
está o nome do usuário que possui os contêineres lxc:
sudo loginctl enable-linger $user
Isso é necessário para o systemd iniciar uma instância do usuário do systemd $user
na inicialização. Caso contrário, ele iniciaria apenas um no momento $user
em que efetuar login.
Para obter mais informações, recomendo a página systemd / timer do archlinux wiki e as páginas de manual systemd .
Acessando a instância systemd de um usuário como root
Você pode realmente iniciar / parar / qualquer serviço de sistema do usuário como root, no entanto, isso exige que você defina a XDG_RUNTIME_DIR
variável de ambiente. Suponha que $user
seja o usuário cuja instância você deseja acessar e $uid
seja uid, é assim que você iniciaria o lxc-autostart.service definido acima:
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart
Você pode até usar systemd-run
para executar comandos arbitrários como esse usuário de uma maneira que não quebre o lxc. Estou usando os seguintes comandos para parar / iniciar meus contêineres antes / depois do backup, onde $name
está o nome do contêiner lxc que está sendo copiado:
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
(Observe que sem --wait
systemd-run não bloqueia até que o contêiner seja parado.)