¿Cómo deshabilitar el comportamiento de shell de emergencia agresivo systemd?


10

Por defecto, systemd cae a un shell de emergencia ante el más mínimo error. Por ejemplo, si uno de los montajes en fstab falla por alguna razón, el sistema no se puede iniciar de inmediato. Administro docenas de diversos sistemas de producción y este comportamiento me ha parecido muy perjudicial. (En realidad, creo que es un gran fallo de diseño, pero esa es una opinión personal).

Me gustaría aumentar la resistencia de arranque del sistema. Óptimamente, el sistema siempre debe arrancar, los controladores faltantes, los montajes, etc. no deben soltar el shell de emergencia (solo muestre una advertencia) a menos que el error dado haga que el inicio de sesión de la consola sea absolutamente imposible. Lo que se puede ejecutar, se debe ejecutar.

Sé que systemd genera automáticamente archivos * .mount desde / etc / fstab y podría usar la opción nofail con un pequeño tiempo de espera de x-systemd.device (o definir los archivos .mount relevantes yo mismo). Sin embargo, no resolvería mi problema, quiero hacer que el sistema sea más resistente, "parchear" fstab cada vez no es muy conveniente y no estoy seguro de cuántos otros "problemas" posibles existen que harían que mi sistema no se pueda arrancar solo porque algún desarrollador en algún lugar pensó que era lo suficientemente importante.

En cierto modo, me gustaría recuperar el control sobre mi máquina y no dejar que systemd decida qué problema es lo suficientemente grave como para aplastar el proceso de arranque. ¿Es posible?


¿Cuál es el problema real por cierto? Soy consciente de dos: no poder iniciar sesión a través de ssh, y el mensaje de sulogin solo permite a los usuarios root, no sudo, obtener acceso en modo de emergencia. ¿Cubren los daños que ha sufrido?
sourcejedi

En realidad, el sistema sería mucho más accesible si se iniciaran esos dos servicios, sí. Óptimamente, el sistema debe iniciar todo lo que se puede iniciar como en los viejos tiempos de SysV (registro de error en lugar de muerte dolorosa por shell de emergencia), y comenzar el shell solo en caso de error fatal.
goteguru

Respuestas:


7

Literalmente es solo fallas de montaje, eso es todo lo que necesitaría cambiar.

Por lo tanto, la carta de su solicitud sería trivial de responder. Crea un archivo desplegable:

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

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

Creo que esto no agregará ningún problema nuevo, más allá de los que Linux sysvinit ya sufrió al permitir este escenario de falla parcial.


Sin embargo, también señaló la pregunta de cuánto tiempo debería esperar systemd a que los dispositivos de bloque especificados estén disponibles. No veo forma de configurar esto, sin proporcionar un reemplazo para el generador fstab en su conjunto. https://www.freedesktop.org/software/systemd/man/systemd.generator.html

Si volca una gran cantidad de código menos utilizado aquí, parece poco probable que aumente la resistencia del sistema. Creo que la solución más cercana sería parchear el generador fstab existente. No es enormemente complejo, sospecho que podría salirse con la suya / mantenerse al día con cualquier cambio significativo.

Técnicamente, si su distribución tenía un mountallscript sysvinit autónomo , podría intentar conectarlo. Pero eso cambiará significativamente el proceso de arranque, en realidad es más una bifurcación. No recomendaría ese enfoque.


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

Si busca a través de los archivos de la unidad, solo hay unas pocas formas de recurrir al arranque emergency.target. Por lo general, ocurre cuando .mountfalla una unidad para un sistema de archivos local, lo local-fs.target que hace que falle. O cuando su initramfs no puede montar el sistema de archivos raíz, si su initramfs usa systemd.

local-fs.targettiene OnFailure=emergency.target. Y falla porque las unidades para los sistemas de archivos locales se agregan automáticamente a la lista Requiere de local-fs.target (a menos que lo hayan hecho DefaultDependencies=no).

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

2
Supongo que debería poner [Unit]\nOnFailure= en mi nofail.conf. Parece posible configurar el tiempo de espera en /etc/systemd/system.conf (a través de la opción genérica DefaultTimeoutStartSec). Mis sistemas suelen ser lo suficientemente rápidos, los 90 parecen ser una exageración de todos modos. Esta solución parece ser prometedora.
goteguru

En mi caso, configuré OnFailure=en /lib/systemd/system/local-fs.targetlugar de /etc/systemd(Ubuntu 16.04 en AWS)
ThiagoAlves

@ThiagoAlves no debes hacer eso, se sobrescribirá en las actualizaciones del sistema. Siga las instrucciones en la respuesta, o solicite una aclaración :-).
sourcejedi

@sourcejedi Intenté la respuesta pero no funcionó para mí
ThiagoAlves

1
@ThiagoAlves Gracias por tus comentarios. He hecho la respuesta menos ambigua, por lo que podemos ser más claros acerca de si ese era el problema o no. Es decir, me pregunto si te aseguraste de incluir [Unit]antes OnFailure=.
sourcejedi

0

Apague el montaje automático de cualquier sistema de archivos que no sea esencial para la operación de arranque agregando una noautoopción de montaje a su /etc/fstabentrada:

/dev/sdxy /u01 nfs defaults 0 0

a:

/dev/sdyx /u01 nfs noauto 0 0

y luego monte el sistema de archivos después del arranque usando una línea en /etc/rc.local:

mount /u01

Este ejemplo usa NFS pero también es aplicable a los LUN importados de un servidor de archivos.


1
Sí, lo sé noauto, pero si cambiara el fstab cada vez, nofail sería una mejor opción. Gracias de todos modos.
goteguru

0

Prueba esto tal vez?

systemctl mask emergency.service
systemctl mask emergency.target

44
¿Has probado esto? ¿Qué sucede cuando systemd encuentra un error durante el arranque, con el objetivo de emergencia enmascarado?
Stephen Kitt
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.