Iniciar um serviço systemd dentro do chroot

38

Com scripts init (ou com 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 someserviceeu 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 solucionar problemas de sistemas Unix que nem conseguem iniciar um shell mínimo.

user2284570
fonte
11
Eu também preciso executar serviços em um chroot, ele sempre funcionou antes do openrc2, parece impossível agora; (
neofutur
Você está tentando resolver o problema errado. Se você possui o OpenRC, precisa converter o serviço systemd em um serviço OpenRC. Realmente não há maneira de contornar isso.
Daniel B
@DanielB: NÃO! Você já ouviu falar de systemrescuecd?
user2284570
Não. Também não vejo como isso se relaciona com sua pergunta.
227 Daniel B

Respostas:

29

Um problema bem conhecido nas distros do systemd (Arch Linux, OpenSUSE, Fedora).

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

Isso implica que, quando 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 atual. Mas fica pior do que isso: como os soquetes de comunicação são colocados dentro de / run / systemd, um processo em um chroot nem consegue falar com o sistema init!

Então, como você faz chroot em distribuições systemd?

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

  2. Se você realmente deseja um ambiente chroot, esta página da Web bonita e cristalina fornecerá duas soluções funcionais (a segunda é uma versão modificada da oferecida no ponto 1).

MariusMatutiae
fonte
Eu procurei, systemd-nspawnmas não posso executá-lo. E Não, isso não é para um contêiner, pois o serviço precisa ser usado pelo host e pela arquitetura de destino.
user2284570
2
Que eu nunca uso systemd na raiz do sistema host. No meu caso, não posso misturar systemd com openrc.
user2284570
11
@TwoD Isso não vai funcionar. A execução systemd-nspawnfalha com "Não está sendo executado em um sistema systemd". a menos que o host esteja usando o systemd também.
Hvd
11
@TwoD E eu respondi porque não me parece nada disso. :) "Não consigo executá-lo" é uma coisa estranha para dizer se você está tendo problemas para encontrar o executável, e é por isso que suspeito que o problema seja o que eu coloquei no meu comentário: a execução dá essa mensagem de erro e não faça qualquer coisa útil. Mas mesmo que o problema realmente estivesse onde encontrar systemd-nspawn, apontar para a nova raiz não ajudaria. O host já o possui (porque está executando o systemd); nesse caso, a versão do host pode ser usada ou o host não a possui, mas a nova versão da raiz não funciona.
Hd
11
systemdse recusará a ser executado emchroot
Erkin Alp Güney
4

systemd ignora apenas "serviços", então apenas executo os comandos daemon manualmente.

Então, ao invés de

service sshd start

eu uso

/usr/sbin/sshd -D &
johnP
fonte
Isso não funciona para todos os serviços. Alguns precisam ser iniciados como parte do iniciador de serviços do sistema, como o Xorg.
user2284570
startxvai trabalhar para Xorg.
Erkin Alp Güney
@ ErkinAlpGüney: não no chroot ... Por causa do Dbus.
usar o seguinte comando
4

Vários anos depois, devo admitir que há apenas uma solução para a maioria dos problemas práticos do Systemd. Como o erro é o próprio Systemd

Estou realmente farto do Systemd, pois tive problemas que nunca enfrentei em coisas como Upstart ou Openrc:

  • A imposição de um kernel que requer suporte a cgroups (em vez de ser opcional, mas ativado por padrão em um arquivo de configuração), mesmo para sistemas embarcados com apenas 24Mb de ram e sem armazenamento gravável.
  • Apesar da alegação de ser modular, em tempo de execução, o inferno das dependências o torna um forte objeto divino: deseja inicializar em um único rootfs reiser4? Não é possível porque muitos programas exigem o systemd-udevdque requer systemd-inito systemd-bootpacote que não pode ser instalado ao mesmo tempo e que grub2não pode ler imagens do kernel de uma partição reiser4.
  • Deseja conectar-se à Internet através de discagem Bluetooth? Se não funcionar com o seu telefone samsung java me, você não poderá executar os scripts e o software de linha de comando que anteriormente funcionavam manualmente por causa disso networkd.
  • Embora reconheça que o maior problema é se você está construindo e mantendo sua própria distribuição Linux: o próprio módulo systemd init tem tantas dependências que você não pode propor a escolha de outro sistema init por meio de diferentes pacotes de instalação.
  • Boa sorte para visualizar logs se você não pode executar o chroot no sistema ou se atualizou da libdb4.8 (enquanto, pelo menos, na pior das hipóteses, a Microsoft possui seus arquivos de log no formato xml) .

A única solução :

Systemd é um complexo desnecessário para resolver problemas: como alsa em vez de ossv4. Portanto, se você tem algo que usa o systemd, limpe todos os dados:

dd if=/dev/urandom of=/dev/dm−0 bs=1M

e instale algo que não o use de maneira alguma enquanto soluciona problemas do SysV Init como o Gentoo com o Openrc.
Com relação à minha pergunta, o systemd cria coisas como o registro do Windows®: se uma parte dele é estragada, tudo acaba.

usuário2284570
fonte
3
Por favor, reconheça que o design de algo pode realmente impedir a obtenção de uma resposta, para que a resposta seja mudar para algo que funcione . E que esta é uma resposta real.
user2284570
11
Eu tinha a mesma opinião, agora estou com uma visão um pouco mais equilibrada. O Systemd tem a grande vantagem de realmente matar o que deve ser morto . É porque rastreia todos os subprocessos bifurcados com o recurso cgroup do kernel. Nenhuma das ferramentas mais antigas pode fazer isso. Além disso, você se lembra da porcaria dos scripts em /etc/init/*.sh?I também, mas hoje é apenas uma memória ruim para mim. Os arquivos de serviço systemd são limpos e têm configurações de cerca de 10 linhas . Não há scripts de 200 linhas . Essas enormes vantagens têm o sistema, eu concordo que todas as outras características são desvantagens.
peterh diz restabelecer Monica
Aliás, votei sua resposta porque, além de suas vantagens, exatamente esse tipo de crítica, exatamente nesse tom é o que o desenvolvimento do sistema exige para melhorar. Por exemplo, eu apenas tentei iniciar um postgresql em um chroot e tive que cagar meu sistema raiz para fazer isso. Muitos, muitos coisa de baixa qualidade ainda está lá, certo.
peterh diz restabelecer Monica
@ Peterh: infelizmente, nem todos compartilham, quero dizer, a ponto de excluir a postagem. Não se trata do init do SysV no Systemd, mas de coisas como o Openrc ou o Upstart (que permite scripts de inicialização curtos, bem como o início do serviço paralelo). Pelo menos eu aprendi uma coisa: Darwin é principalmente o Apple do Apple ™ Windows é o ᴏꜱ do design da Microsoft e Linux é executado principalmente pela red hat. Embora o SysV init seja lento, não o restringe ao que você pode fazer em tempo de execução.
user2284570 26/03
Os scripts do @peterh Services também são muito claros quando você usa o Openrc. O problema com o cgroup no Systemd é que essa não é uma opção que impede o Systemd de executar coisas como Darwin ou NetBSD.
user2284570
3

Não. Os serviços são executados pelo systemd (pid 1), não pelo systemctl diretamente (que envia apenas uma solicitação 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 o systemd), é pouco provável que isso aconteça, já que já existe uma ferramenta para criar contêineres cheios ( systemd-nspawn /somepath/to_root). Você sempre pode entrar em contato com a lista de discussão .

gravidade
fonte
11
Bom, mas preciso usar systemctl, pois meu sistema host usa oepnrc. Eu quero solução independente completa
user2284570
3
Vou enlamear as águas ainda mais dizendo: Psiu! Mencione RootDirectory=também, já que você está tão perigosamente sem votos positivos. (-:
JdeBP
@JdeBP: Qual é a diferença (em termos de resultados) entre a variável RootDirectorye o chrootcomando?
user2284570
@rawity: Então, o que acrescenta se o pid 1init é?
usar o seguinte comando
1

Diante deste problema, uma vez tentou abrir 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
ponto vermelho
fonte
Agradável. Mas ele funciona apenas com serviços compatíveis com o Init herdados (não funcionará para redes no couro cru do Fedora) . Como eu disse na minha resposta, a solução real é estragar tudo que use o systemd.
user2284570
0

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

Observe que você pode ter problemas com o SELINUX. Em um sistema Oracle Linux 7.1, 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.

chas
fonte
não, é sobre coisas como d-bus. Eu faço isso para diagnosticar problemas no chroot de destino.
user2284570
-1

Você pode usar o nohupcomando para iniciar serviços no chroot. Para iniciar o httpdserviço, por exemplo, eu faço assim.

nohup httpd /dev/null &

para parar pkill httpd

ellooku
fonte
E serviços como o Dbus, que só podem ser iniciados pelo script systemd binário instalado?
precisa saber é o seguinte
Você pode iniciar esses serviços a partir do diretório com o comando start.
precisa saber é
Qual é um link simbólico contra systemctl. Então não funciona.
user2284570
Eu faço isso o tempo todo no Fedora rodando no meu Android. Pode ser que eu não sei qual é o seu problema.
precisa saber é
A consequência é esta mensagem: Running in chroot, ignoring request.. Eu não acho que você faz isso o tempo todo, apesar de chroot. De fato, o script de inicialização requer systemd.
user2284570