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

6

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

Gostaria de aumentar a resiliência de inicialização do sistema. Idealmente, o sistema deve sempre inicializar, drivers ausentes, montagens, etc. não devem descartar o shell de emergência (apenas mostre o aviso), a menos que o erro fornecido torne o login do console absolutamente impossível. O que pode ser executado, que deve ser executado.

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

De certa forma, eu gostaria de recuperar o controle sobre a minha máquina e não deixar o systemd decidir qual problema é sério o suficiente para esmagar o processo de inicialização. É possível?

    
por goteguru 12.01.2018 / 19:14

2 respostas

3

são literalmente apenas falhas de montagem, isso é tudo o que você precisaria mudar.

Assim, a carta do seu pedido seria trivial para responder. Crie um arquivo drop-in /etc/systemd/system/local-fs.target.d/nofail.conf , que define OnFailure= (ou seja, redefine para nada) ...

Eu acredito que isso não irá adicionar nenhum novo problema, além daqueles que o linux sysvinit já sofreu ao permitir este cenário de falha parcial.

No entanto, você também apontou a questão de como long systemd deve esperar que os dispositivos de bloco especificados se tornem disponíveis. Não vejo como configurar isso, sem fornecer um substituto para o gerador fstab como um todo. link

Se você despejar uma grande quantidade de código menos usado aqui, parece improvável aumentar a resiliência do sistema. Acho que a solução mais próxima seria corrigir o gerador de fstab existente. Não é maciçamente complexo, eu suspeito que você poderia se safar / acompanhar quaisquer mudanças significativas.

Tecnicamente, se a sua distribuição tiver um script mountall sysvinit autocontido, você poderá tentar enganchar isso. Mas isso irá mudar significativamente o processo de inicialização - na verdade é mais de um fork. Eu não recomendaria essa abordagem.

link

If you search through the unit files, there are only a very few ways for the boot to fall back to emergency.target. It's usually when a .mount unit for a local filesystem fails, causing local-fs.target to fail. Or when your initramfs fails to mount the root filesystem, if your initramfs uses systemd.

local-fs.target has OnFailure=emergency.target. And it gets failed because units for local filesystems are automatically added to the Requires list of local-fs.target (unless they have DefaultDependencies=no).

$ systemctl show --property Requires local-fs.target
Requires=-.mount home.mount boot.mount boot-efi.mount
    
por 12.01.2018 / 19:57
-1

Desative a montagem automática de qualquer sistema de arquivos que não seja essencial para a operação de inicialização, adicionando a opção noauto mount à sua entrada /etc/fstab :

/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 se aplica a LUNs importados de um servidor de arquivos.

    
por 14.01.2018 / 18:33