Como desativar o comportamento agressivo do shell de emergência do systemd?

10

Por padrão, o systemd cai para um shell de emergência com o menor erro. Por exemplo, se uma das montagens no fstab falhar por algum motivo, o sistema se tornará não inicializável imediatamente. Eu gerencio dezenas de diversos sistemas de produção e achei esse comportamento muito prejudicial. (Na verdade, acho que é uma falha grave no design, mas é uma opinião pessoal).

Eu gostaria de aumentar a resiliência de inicialização do sistema. De maneira ideal, o sistema sempre deve inicializar, faltando drivers, montagens etc. não deve interromper o shell de emergência (apenas mostrar aviso), a menos que o erro especificado torne o login do console absolutamente impossível. O que pode ser executado, isso deve ser executado.

Eu sei que o systemd gera automaticamente arquivos * .mount a partir do / etc / fstab e eu poderia usar a opção nofail com um pequeno tempo limite do x-systemd.device (ou definir eu mesmo os arquivos .mount relevantes). No entanto, isso não resolveria o meu problema, quero tornar o sistema mais resiliente, "corrigir" o fstab toda vez não é muito conveniente e não tenho certeza de quantos outros "problemas" possíveis existem que tornariam meu sistema impossível de inicializar apenas porque algum desenvolvedor em algum lugar achou importante o suficiente.

De certa forma, gostaria de recuperar o controle sobre minha máquina e não deixar o sistema decidir qual problema é grave o suficiente para interromper o processo de inicialização. É possível?

goteguru
fonte
qual é o problema real btw? Estou ciente de que dois - não conseguem fazer login através do ssh, e o prompt sulogin permite apenas que usuários root, e não usuários do sudo, obtenham acesso no modo de emergência. aqueles cobrem os danos que você sofreu?
sourcejedi
Na verdade, o sistema seria muito mais acessível se esses dois serviços fossem iniciados, sim. De maneira ideal, o sistema deve iniciar tudo o que pode ser iniciado, como nos velhos tempos do SysV (registro de erro 'em vez de morte dolorosa pelo shell de emergência) e iniciar o shell apenas em caso de erro fatal.
goteguru

Respostas:

7

É literalmente apenas falhas de montagem, é tudo que você precisa mudar.

Portanto, a carta do seu pedido seria trivial para responder. Crie um arquivo drop-in:

# /etc/systemd/system/local-fs.target.d/nofail.conf

# Clear OnFailure= (set it to nothing)
[Unit]
OnFailure=

Acredito que isso não trará novos problemas, além daqueles que o linux sysvinit já sofreu ao permitir esse cenário de falha parcial.


No entanto, você também apontou a questão de quanto tempo o systemd deve esperar que os dispositivos de bloco especificados estejam disponíveis. Não vejo como configurá-lo, sem fornecer um substituto para o gerador fstab como um todo. https://www.freedesktop.org/software/systemd/man/systemd.generator.html

Se você despejar uma grande quantidade de código menos utilizado aqui, parece improvável aumentar a resiliência do sistema. Eu acho que a solução mais próxima seria consertar o gerador fstab existente. Não é muito complexo, eu suspeito que você possa se safar / acompanhar as mudanças significativas.

Tecnicamente, se sua distribuição tiver um mountallscript sysvinit independente , você pode tentar conectar isso. Mas isso mudará significativamente o processo de inicialização - na verdade, é mais um garfo. Eu não recomendaria essa abordagem.


https://unix.stackexchange.com/a/393711/29483

Se você pesquisar os arquivos da unidade, existem apenas algumas maneiras pelas quais a inicialização volta emergency.target. Geralmente é quando uma .mountunidade de um sistema de arquivos local falha, causando local-fs.target falha. Ou quando o initramfs falhar ao montar o sistema de arquivos raiz, se o initramfs usar systemd.

local-fs.targettem OnFailure=emergency.target. E ocorre uma falha porque as unidades dos sistemas de arquivos locais são automaticamente adicionadas à lista Requer local-fs.target (a menos que tenham DefaultDependencies=no).

$ systemctl show --property Requires local-fs.target
Requires=-.mount home.mount boot.mount boot-efi.mount
sourcejedi
fonte
2
Suponho que devo colocar [Unit]\nOnFailure= no meu nofail.conf. Parece ser possível configurar o tempo de espera no /etc/systemd/system.conf (através da opção genérica DefaultTimeoutStartSec). Meus sistemas geralmente são rápidos o suficiente, os anos 90 parecem ser um exagero de qualquer maneira. Esta solução parece ser promissora.
precisa saber é
No meu caso eu definir OnFailure=em /lib/systemd/system/local-fs.targetvez de /etc/systemd(Ubuntu 16.04 no AWS)
ThiagoAlves
@ThiagoAlves você não deve fazer isso, ele será sobrescrito nas atualizações do sistema. Siga as instruções na resposta ou peça esclarecimentos :-).
sourcejedi
@sourcejedi Tentei a resposta, mas não funcionou para mim
ThiagoAlves
1
@ThiagoAlves Obrigado pelo seu feedback. Tornei a resposta menos ambígua, para que possamos ser mais claros sobre se esse foi o problema ou não. Ou seja, eu me pergunto se você fez questão de incluir [Unit]antes OnFailure=.
sourcejedi
0

Desative a montagem automática de qualquer sistema de arquivos que não seja essencial para a operação de inicialização adicionando uma noautoopção de montagem à sua /etc/fstabentrada:

/dev/sdxy /u01 nfs defaults 0 0

para:

/dev/sdyx /u01 nfs noauto 0 0

e monte o sistema de arquivos após a inicialização usando uma linha em /etc/rc.local:

mount /u01

Este exemplo usa o NFS, mas também é aplicável aos LUNs importados de um servidor de arquivos.

Mais antigo software cara
fonte
1
Sim, eu não sei automático, mas se eu mudasse o fstab toda vez, o nofail seria uma escolha muito melhor. Thx de qualquer maneira.
precisa saber é o seguinte
0

Tente isso, talvez?

systemctl mask emergency.service
systemctl mask emergency.target
Pierre
fonte
4
Você já tentou isso? O que acontece quando o systemd encontra um erro durante a inicialização, com o destino de emergência mascarado?
Stephen Kitt