O Systemd está trabalhando com serviços e destinos . Os destinos são o equivalente de runlevels , os serviços equivalem a scripts de inicialização .
A maioria das configurações do systemd está localizada em /usr/lib/systemd
, enquanto o init padrão está em /etc/{init.d,rc*.d,inittab}
.
Quando um problema entra em ação durante o processo de inicialização (o padrão é getty.target ou graphical.target , você pode obtê-lo com systemctl get-default
) systemd está alternando para emergency.target .
Esse alvo de "emergência", por sua vez, carregará o arquivo emergency.service
. Este serviço contém várias linhas e entre elas:
...
[Service]
Environment=HOME=/root
WorkingDirectory=/root
ExecStartPre=-/bin/plymouth quit
ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\nsystem logs, "systemctl reboot" to reboot, "systemctl default" to try again\nto boot into default mode.'
ExecStart=-/bin/sh -c "/sbin/sulogin; /usr/bin/systemctl --fail --no-block default"
...
Precisamos apenas substituir a chamada para /sbin/sulogin
:
ExecStart=-/bin/sh -c "/sbin/sushell; /usr/bin/systemctl --fail --no-block default"
E nós seremos descartados diretamente em um shell, em vez de sermos solicitados pela senha via sulogin. (Podemos usar /bin/sh
, mas /sbin/sushell
está alinhado com as respostas para o CentOS6 / RHEL6. De fato, sushell
simplesmente executa $SUSHELL
, cujo padrão é /bin/bash
.)
Para tornar essa alteração "permanente", ou seja, imune a yum
updates, faça a alteração em uma cópia desse arquivo e coloque-o em /etc/systemd/system/
. Além disso, para que o "modo de recuperação" funcione da mesma maneira, substitua a mesma linha em rescue.service
. Aqui está um script shell / sed para simplificar o processo:
for SERVICE in rescue emergency ; do
sed '/^ExecStart=/ s%"/sbin/sulogin;%"/sbin/sushell;%' /usr/lib/systemd/system/$SERVICE.service > /etc/systemd/system/$SERVICE.service
done
Para testar isso, verifique se o sistema não está em uso e informe systemd
para alternar para o rescue
target:
systemctl rescue
Isso fechará as conexões de rede e abrirá um shell no console. Você pode testar com a meta emergency
, mas isso não funciona tão bem (por algum motivo) e pode exigir uma reinicialização completa para sair.
Você também pode testá-los no menu de inicialização (grub). Para testar o modo de emergência, é fácil. Inicialize e, quando chegar ao menu, clique em "e" para editar e use o D-pad para navegar até a linha que começa com linux16
e acrescentar (pressione CTRL-A
para chegar ao final da linha) emergency
:
linux16 ... emergency
Para testar o modo de recuperação, são os mesmos passos acima, mas você deve ser mais explícito:
linux16 ... systemd.unit=rescue.target