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.)
/etc/init/lxc.conf
por ponteiros. É o trabalho inicial que inicia os contêineres privilegiados. Não deve ser muito difícil copiá-lo e modificá-lo para encerrar contêineres não privilegiados também./proc/self/cgroup
que ele contém seqüências como em/user/0.user/1.session
vez de/user/1000.user/1.session
Caso alguém se depare com essas perguntas e respostas, como resposta à inicialização automática de contêineres LXC sem privilégios (eu certamente volto aqui), aqui está uma solução que funciona bem e que eu segui para que funcionasse no meu servidor:
http://blog.lifebloodnetworks.com/?p=2118 de Nicholas J Ingrassellino.
Em poucas palavras, envolve a criação de dois scripts e eles trabalham juntos na inicialização para permitir que o LXC inicie os contêineres sem privilégios de cada usuário listado, sem precisar efetivamente fazer login na conta do usuário; em outras palavras, executar o comando como o usuário com toda a magia do CGroups intacta. De acordo com as melhores práticas do SO, citarei aqui os ossos, mas vale a pena ler o artigo original.
Gostaria apenas de enfatizar que ele parece funcionar com segurança, corretamente e não requer a raiz do SSH nas outras contas de usuário.
Também há mais sobre o assunto (tocando em dicas relacionadas) aqui: https://gist.github.com/julianlam/4e2bd91d8dedee21ca6f, que pode ser útil para entender por que é assim.
fonte
Escrevi um pequeno script para solucionar o problema, basta seguir as instruções comentadas.
fonte
DESCULPE: respondeu muito cedo. Não funcionou, embora lxc-ls mostre "AUTOSTART" como "YES".
Aqui está um link com informações muito mais úteis, e talvez alguém possa usá-las: http://www.geeklee.co.uk/unprivileged-privileged-containers-ubuntu-14-04-lxc/
Cheguei nesta página porque tive o mesmo problema. Depois de ler este tópico, percebi que o lxc-create não pode gravar no diretório "/ var / lib / lxc /" usual se não for executado com o sudo.
Eu olhei em volta e localizei os rootfs para meu contêiner sem privilégios em "~ / .local / share / lxc" e coloquei as duas linhas da pergunta na configuração nesse diretório.
Eu olhei para o modelo que usei "lxc-download" para obter uma pista, mas acho que esse caminho foi passado quando "lxc-download" é chamado. Não observei como o sistema procura contêineres sem privilégios durante a inicialização.
fonte
Estou executando cada contêiner não privilegiado com um mesmo usuário nomeado para melhor isolamento e é assim que eu faço:
fonte
Supondo (que é a mãe de todas as maneiras de estragar tudo), você está efetuando login como o usuário que "possui" o contêiner lxc sem privilégios, o seguinte comando deve abordar o que você está procurando ...
Isso simplesmente executará o comando acima quando você efetuar login via bash. Isso também pressupõe que o bash é o shell de logon. Substitua o nome:
LXC-CONTAINER-NAME
pelo nome do seu contêiner LXC que você deseja iniciar.fonte
Eu usei uma abordagem diferente e está funcionando
1º Adicione as seguintes entradas no arquivo de configuração do contêiner
CONFIGURAÇÃO DE INÍCIO AUTOMÁTICO
lxc.start.auto = 1 lxc.start.delay = 5
2º Criar uma relação de confiança entre o usuário do contêiner e ele próprio no mesmo servidor
userlxc @ GEST-4: ~ $ ssh-keygen -t rsa Gerando pares de chaves rsa públicas / privadas. Digite o arquivo no qual salvar a chave (/home/userlxc/.ssh/id_rsa): Digite a senha (vazia para nenhuma senha): Digite a mesma senha novamente: sua identificação foi salva em /home/userlxc/.ssh/id_rsa. Sua chave pública foi salva em /home/userlxc/.ssh/id_rsa.pub. A impressão digital da chave é: c9: b4: e1: f3: bf: a3: 25: cc: f8: bc: be: b6: 80: 39: 59: 98 userlxc @ GEST-AMENCIA-4 A imagem randomart da chave é: + - [RSA 2048] ---- + | | | | | o | | * + | | ES | = * | | = o =. | | . +. +. | | oO = oo | + ----------------- +
userlxc @ GEST-4: ~ $ cat .ssh / id_rsa.pub >> .ssh / allowed_keys userlxc @ GEST-4: ~ $ ls -lrt .ssh / allowed_keys -rw-rw-r-- 1 userlxc userlxc 404 Nov 19 17:23 .ssh / allowed_keys
Verifique a conexão ssh, você deve poder usá-la sem a senha userlxc @ GEST-4: ~ $ ssh userlxc @ localhost "lxc-ls --fancy"
NOME ESTADO IPV4 IPV6 AUTOSTART
EXTLXCCONT01 PARADO - - SIM
UBUSER1404USERCONT01-test PARADO - - NÃO
UBUSER1404USERLXCCONT01 PARADO - - NÃO
3º Criar uma entrada crontab no proprietário do contêiner
@reboot ssh userlxc @ localhost "lxc-autostart"
fonte