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 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 solucionar problemas de sistemas Unix que nem conseguem iniciar um shell mínimo.
Respostas:
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?
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
.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).
fonte
systemd-nspawn
mas 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.systemd-nspawn
falha com "Não está sendo executado em um sistema systemd". a menos que o host esteja usando o systemd também.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.systemd
se recusará a ser executado emchroot
systemd
ignora apenas "serviços", então apenas executo os comandos daemon manualmente.Então, ao invés de
eu uso
fonte
startx
vai trabalhar paraXorg
.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:
systemd-udevd
que requersystemd-init
osystemd-boot
pacote que não pode ser instalado ao mesmo tempo e quegrub2
não pode ler imagens do kernel de uma partição reiser4.networkd
.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:
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.
fonte
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 .fonte
RootDirectory=
também, já que você está tão perigosamente sem votos positivos. (-:RootDirectory
e ochroot
comando?pid 1
init é?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:
ou:
fonte
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.
fonte
Você pode usar o
nohup
comando para iniciar serviços no chroot. Para iniciar ohttpd
serviço, por exemplo, eu faço assim.para parar
pkill httpd
fonte
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.