Come disabilitare il comportamento aggressivo della shell di emergenza di systemd?


10

Di default systemd passa a una shell di emergenza al minimo errore. Ad esempio, se uno dei montaggi su fstab fallisce per qualche motivo, il sistema diventa immediatamente non avviabile. Gestisco dozzine di diversi sistemi di produzione e ho trovato questo comportamento molto dannoso. (In realtà penso che sia un grave fallimento del design, ma è un'opinione personale).

Vorrei aumentare la resilienza all'avvio del sistema. Il sistema dovrebbe sempre avviarsi in modo ottimale, i driver mancanti, i montaggi, ecc. Non dovrebbero rilasciare la shell di emergenza (mostra solo l'avvertenza) a meno che l'errore dato non renda assolutamente impossibile l'accesso alla console. Cosa può essere eseguito, che dovrebbe essere eseguito.

So che systemd genera automaticamente * .mount file da / etc / fstab e potrei usare l'opzione nofail con un piccolo timeout x-systemd.device (o definire personalmente i file .mount pertinenti). Tuttavia non risolverebbe il mio problema, voglio rendere il sistema più resiliente, "rattoppare" ogni volta che non è molto conveniente e non sono sicuro di quanti altri possibili "problemi" esistano che renderebbero il mio sistema non avviabile solo perché qualche sviluppatore da qualche parte ha pensato che fosse abbastanza importante.

In un certo senso, vorrei riprendere il controllo sulla mia macchina e non lasciare che systemd decida quale problema è abbastanza grave da interrompere il processo di avvio. È possibile?


qual è il vero problema tra l'altro? ne sono a conoscenza di due: non essere in grado di accedere tramite ssh e il prompt di sulogin consente solo agli utenti root, non sudo, di accedere in modalità di emergenza. quelli coprono i danni che hai subito?
FonteJedi

In realtà il sistema sarebbe molto più accessibile se questi due servizi fossero avviati, sì. Il sistema dovrebbe avviare in modo ottimale tutto ciò che può essere avviato proprio come nei vecchi tempi di SysV (registrazione degli errori anziché morte dolorosa per shell di emergenza) e avviare la shell solo in caso di errore fatale.
goteguru,

Risposte:


7

Sono letteralmente solo errori di montaggio, questo è tutto ciò di cui avresti bisogno per cambiare.

Quindi la lettera della tua richiesta sarebbe banale a cui rispondere. Crea un file drop-in:

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

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

Credo che questo non aggiungerà alcun nuovo problema, oltre a quelli che sysvinit di Linux ha già sofferto consentendo questo scenario di fallimento parziale.


Tuttavia, hai anche sottolineato la questione di quanto tempo systemd dovrebbe attendere la disponibilità dei dispositivi a blocchi specificati. Non vedo alcun modo per configurarlo, senza fornire un sostituto per il generatore di fstab nel suo insieme. https://www.freedesktop.org/software/systemd/man/systemd.generator.html

Se scarichi una grande quantità di codice meno utilizzato qui, sembra improbabile che aumenti la resilienza del sistema. Penso che la soluzione più vicina sarebbe quella di patchare il generatore di fstab esistente. Non è enormemente complesso, sospetto che potresti cavartela / tenere il passo con eventuali cambiamenti significativi.

Tecnicamente, se la tua distribuzione avesse uno mountallscript sysvinit autonomo, potresti provare ad agganciarlo. Ma questo cambierà significativamente il processo di avvio - in realtà è più di un fork. Non consiglierei questo approccio.


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

Se si esegue una ricerca tra i file di unità, ci sono solo pochi modi in cui ricorrere all'avvio emergency.target. Di solito è quando .mountun'unità per un filesystem locale fallisce, causando il local-fs.target fallimento. O quando initramfs non riesce a montare il filesystem di root, se initramfs usa systemd.

local-fs.targetha OnFailure=emergency.target. E fallisce perché le unità per i filesystem locali vengono automaticamente aggiunte all'elenco Richiede local-fs.target (a meno che non lo abbiano DefaultDependencies=no).

$ systemctl show --property Requires local-fs.target
Requires=-.mount home.mount boot.mount boot-efi.mount

2
Suppongo che dovrei inserire [Unit]\nOnFailure= nel mio nofail.conf. Sembra essere possibile configurare il tempo di attesa in /etc/systemd/system.conf (tramite l'opzione DefaultTimeoutStartSec generica). I miei sistemi di solito sono abbastanza veloci, gli anni '90 sembrano comunque eccessivi. Questa soluzione sembra essere promettente.
goteguru,

Nel mio caso ho impostato OnFailure=nel /lib/systemd/system/local-fs.targetposto di /etc/systemd(Ubuntu 16.04 su AWS)
ThiagoAlves

@ThiagoAlves non dovresti farlo, verrà sovrascritto su aggiornamenti di sistema. Segui le istruzioni nella risposta o chiedi chiarimenti :-).
sourcejedi

@sourcejedi Ho provato la risposta ma non ha funzionato per me
ThiagoAlves il

1
@ThiagoAlves Grazie per il tuo feedback. Ho reso la risposta meno ambigua, quindi possiamo essere più chiari sul fatto che fosse questo il problema o meno. Cioè, mi chiedo se ti sei assicurato di includere [Unit]prima OnFailure=.
sourcejedi,

0

Disattiva il montaggio automatico di qualsiasi filesystem che non è essenziale per l'operazione di avvio aggiungendo noautoun'opzione di montaggio alla sua /etc/fstabvoce:

/dev/sdxy /u01 nfs defaults 0 0

per:

/dev/sdyx /u01 nfs noauto 0 0

e quindi montare il filesystem dopo l'avvio usando una linea in /etc/rc.local:

mount /u01

Questo esempio utilizza NFS ma si applica anche ai LUN importati da un file server.


1
Sì, conosco noauto, ma se cambiassi fstab ogni volta, nofail sarebbe una scelta molto migliore. Grazie comunque.
goteguru,

0

Prova questo forse?

systemctl mask emergency.service
systemctl mask emergency.target

4
Hai provato questo? Cosa succede quando systemd rileva un errore durante l'avvio, con la destinazione di emergenza mascherata?
Stephen Kitt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.