¿Cómo puedo enumerar aquellos archivos que impiden / se vuelven a montar en solo lectura?
A) fuser
se puede encontrar en el psmisc
paquete; Este es un caso de uso donde encuentro fuser
brillos y es más útil que lsof
.
# fuser -v -m / 2>&1 | grep '[Ff]r.e'
Eso mostrará todos los procesos que tienen archivos abiertos en / para lectura (f) y escritura (F). Los archivos que evitarían / volver a ser montados en solo lectura son aquellos que están abiertos para escritura (F).
Elimine los procesos que son un ejecutable que se ejecuta con archivos de directorio raíz abiertos para escritura .
# for fupid in $(fuser -v -m / 2>&1 | grep Fr.e | awk '{print $2}'); do kill $fupid; done
Eso está por encima de los systemd
comentarios con una advertencia. Si systemd
es init
así fuser
lo verá y hay otras consideraciones. Con la systemd
ejecución, puede (re) iniciar procesos a sus espaldas, incluso si acaban de ser identificados y eliminados fuser
. systemd
Es mucho más avanzado que el tradicional sysvinit
.
B) La ACTUALIZACIÓN en la descripción indica que el sistema solo tiene ... init
y getty
sigue ejecutándose ...
Veo el comentario que dice que el sistema no está usando systemd
, está usando init
. En estiramiento, systemd
es init
. El comentario no decía explícitamente sysvinit
, por lo que supongo que el sistema en cuestión puede estar usando el estiramiento predeterminado systemd
para init
. O que otras personas que se topan con esta publicación, que están usando estiramientos systemd
, encuentran útil esta parte.
Según el Wiki de Debian ,
El proceso de inicialización del sistema es manejado por el demonio init. En squeeze y versiones anteriores, ese demonio es proporcionado por el paquete sysvinit, y no se admiten alternativas. En wheezy , el demonio init predeterminado sigue siendosysvinit
, pero hay disponible una "vista previa de tecnología" de systemd. En jessie y stretch , el sistema de inicio predeterminado essystemd
, pero se admite el cambio a sysvinit.
Desde jessie, solo systemd es totalmente compatible; sysvinit es principalmente compatible, pero los paquetes Debian no son necesarios para proporcionar scripts de inicio sysvinit. runit también está empaquetado, pero no ha recibido el mismo nivel de prueba y soporte que los demás, y actualmente no es compatible como PID 1.
Con la systemd
ejecución, hay algunos pasos adicionales que se deben tomar para liberar / para que se pueda volver a montar sin problemas.
Es probable system.slice
que tenga archivos abiertos para systemd-journald.service
o systemd-udevd.service
(ambos tienen dependencias de socket). O, si se NetworkManager
está ejecutando, puede reaparecer, lo dhclient
que escribe arriendos en / var / ... (& / var / no siempre es su propio dispositivo), etc. fuser
podría encontrar y matar, dhclient
pero lo NetworkManager
inicia de nuevo.
La moraleja es que muchas cosas están automatizadas que podrían 'querer' / (y aún más con systemd
).
Sin duda, si es factible, el systemd
equivalente del nivel de ejecución 1 se corresponde con rescue.target
(y runlevel1.target
es un enlace simbólico a rescue.target
).
1) Comience aislando el sistema para rescue.target
# systemctl isolate rescue.target
Debería solicitarle que ingrese la contraseña de root; siga las instrucciones en pantalla.
2) En el caparazón de rescate, averigua qué quiere /.
# systemctl show -p Wants /
Por lo general, es system.slice
; para todo lo que quiera /. p.ej
# systemctl stop system.slice
3) En este punto, el remontaje no debe informar mount: / is busy
y mount -o remount,ro /
debe funcionar. Si no, verifique nuevamente con fuser
.
4) FWIW; También he visto momentos en que umount
falla cuando / si otro dispositivo está montado en un subdirectorio de otro montaje, es decir, montajes anidados. Por ejemplo, umount /
fallaría si / var / o / boot / está en otro dispositivo (y montado). Aunque mount -o remount,ro /
aún debería funcionar en este caso.
lsblk
Puede ser útil para visualizar monturas anidadas.
¿Por qué lsof + L1 ya no enumera los archivos abiertos que se han desvinculado?
Debido a que no están disponibles (sockets o la mayoría de los FIFOs y tuberías), ya no son archivos abiertos (el proceso padre cerró el descriptor de archivo) o (todavía) tienen un recuento de enlaces mayor que 1.
hombre lsof (8) detalles ...
+ | -L [l]
Esta opción habilita ('+') o deshabilita ('-') la lista de recuentos de enlaces de archivos, donde están disponibles, por ejemplo, no están disponibles para sockets, o la mayoría de FIFOs y tuberías.
Cuando se especifica + L sin un número siguiente, se enumerarán todos los recuentos de enlaces. Cuando se especifica -L (el valor predeterminado), no se enumerarán los recuentos de enlaces.
Cuando + L va seguido de un número, solo se enumerarán los archivos que tengan un enlace menor que ese número . (No puede seguir ningún número -L.) Una especificación del formulario '' + L1 '' seleccionará los archivos abiertos que se han desvinculado. Una especificación del formulario +aL1 <file_system>
seleccionará archivos abiertos no vinculados en el sistema de archivos especificado.
w
ou
en laFD
columna de lalsof
salida, oF
en la salida defuser -vm /
, por ejemplo. Sin embargo, no puedo darte una lista exhaustiva. También puede instalar el paquete needrestart .