Inicia um serviço systemd dentro do chroot

30

Com scripts de inicialização (ou com o openrc) eu sempre poderia executar serviços de uma raiz de instalação diferente.
mas quando eu corro chroot /somepath/to_root /usr/bin/systemctl start someservice eu tenho:

Running in chroot, ignoring request.

Existe uma maneira de forçar o systemd a executar o serviço?

Atualização:
Eu esqueci de dizer que meu sistema host executa scripts init ou openrc, mas nunca systemd, e que eu uso o chroot para sistemas Unix problemáticos que nem sequer podem lançar um shell mínimo.

    
por user2284570 15.12.2013 / 17:38

6 respostas

25

Um problema bem conhecido nas distribuições systemd (Arch Linux, OpenSUSE, Fedora).

O Systemd substitui o sysvinit e fornece uma grande vantagem sobre isso. No sysvinit, quando você solicita que um serviço seja iniciado, ele herda o contexto de execução da pessoa que está chamando o script, o que inclui variáveis de ambiente, ulimits e assim por diante. O Systemd melhora isso ao contrário, notificando um daemon, que iniciará o serviço em um ambiente constante, saudável e bem definido, onde é claro que os desempenhos dos serviços são muito mais fáceis de prever, já que o ambiente é sempre o mesmo.

Isso implica que, quando eu chamo systemctl de dentro do chroot, é irrelevante que eu esteja dentro do chroot, o ambiente que será herdado ainda é o do PID 1, não o meu atual. Mas fica pior do que isso: uma vez que sockets de comunicação são colocados dentro de / run / systemd, um processo em um chroot não será capaz de falar com o sistema init!

Então, como você faz o chroot'ing nas distribuições systemd?

  1. Se tudo o que você quer fazer é ter um contêiner Linux, esta página do Arch Wiki dirá você como configurar um container Linux em menos de 30 segundos, graças a systemd-nspawn .

  2. Se você realmente quiser um ambiente chroot, esta página linda e clara na Web fornecerá você com duas soluções de trabalho (a segunda é uma versão modificada da oferecida no ponto # 1).

por 15.12.2013 / 18:15
3

systemd apenas ignora "services", portanto, apenas executo os comandos do daemon manualmente.

Então, em vez de

service sshd start

eu uso

/usr/sbin/sshd -D &
    
por 06.12.2015 / 11:36
2

Não. Os serviços são executados pelo systemd (pid 1), não pelo systemctl diretamente (que envia apenas um pedido de início), e como o systemd é executado fora do chroot, o serviço também será executado.

Embora tecnicamente seja possível implementar isso (tornando o systemctl de alguma forma passar sua raiz para systemd), é pouco provável que aconteça já que já existe uma ferramenta para criar contêineres cheios ( systemd-nspawn /somepath/to_root ). Você pode sempre entrar em contato com a lista de discussão .

    
por 15.12.2013 / 18:00
1

Enfrentou esse problema uma vez que tentou ativar a rede no modo de recuperação usando a configuração de rede do chroot. Finalmente isso funciona para mim:

service --skip-redirect <service> restart

ou:

SYSTEMCTL_SKIP_REDIRECT=_ /etc/init.d/<service> restart
    
por 12.12.2017 / 15:01
0

Se você estiver iniciando um serviço no estilo inetd com ativação de soquete, considere a possibilidade de iniciar o stunnel com um arquivo de configuração que especifica um chroot e seu binário como um destino de inicialização no estilo inetd.

Note que você pode ter problemas com o SELINUX. Em um sistema Oracle Linux 7.1, eu tive que "chcon -v --type = stunnel_etc_t" em todos os arquivos que o stunnel precisava ler.

Você precisará usar a criptografia TLS no lado do cliente do soquete (ou seja, outro stunnel com "client = yes" na configuração). Deixe-me saber se você quiser mais detalhes sobre isso.

    
por 14.09.2015 / 19:11
-1

Você pode usar o comando nohup para iniciar serviços no chroot. Para iniciar httpd service por exemplo, eu faço assim.

nohup httpd /dev/null &

para pará-lo pkill httpd

    
por 27.02.2016 / 00:24