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