Estoy usando Debian Stretch. Mi partición raíz está montada read-only
. Solo cuando instalo o actualizo paquetes, se /
vuelve a montar en read-write
(usando apt hook) y luego se vuelve a montar en ro
.
A veces, después de la actualización del paquete, no puedo /
volver a montarlo en solo lectura:
mount -o remount,ro /
mount: / is busy
En versiones anteriores de Debian (Wheezy), podría enumerar los archivos abiertos que se han desvinculado con lsof
:
lsof +L1
o, más específicamente, archivos que evitan que se vuelvan /
a montar en ro:
{ lsof +L1 ; lsof|sed -n '/SYSV/d; /DEL|(path /p;' ; } | grep -Ev '/(dev|home|tmp|var)'
Sin embargo, en Debian Stretch, lsof +L1
no enumera ningún archivo.
No veo ningún cambio +|-L
en man lsof
lo que explicaría por qué dejó de funcionar.
¿Por qué lsof + L1 ya no enumera los archivos abiertos que se han desvinculado?
¿Cómo puedo enumerar aquellos archivos que impiden / se vuelven a montar en solo lectura?
ACTUALIZAR
He detenido todos los procesos que se pueden detener, y solo tengo init
y getty
sigo ejecutándose, pero aún no puedo volver /
a montar ro
.
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 .root
?fuser -m /
dice lo que está usando root?Respuestas:
¿Cómo puedo enumerar aquellos archivos que impiden / se vuelven a montar en solo lectura?
A)
fuser
se puede encontrar en elpsmisc
paquete; Este es un caso de uso donde encuentrofuser
brillos y es más útil quelsof
.# 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. Sisystemd
esinit
asífuser
lo verá y hay otras consideraciones. Con lasystemd
ejecución, puede (re) iniciar procesos a sus espaldas, incluso si acaban de ser identificados y eliminadosfuser
.systemd
Es mucho más avanzado que el tradicionalsysvinit
.B) La ACTUALIZACIÓN en la descripción indica que el sistema solo tiene ...
init
ygetty
sigue ejecutándose ...Veo el comentario que dice que el sistema no está usando
systemd
, está usandoinit
. En estiramiento,systemd
esinit
. El comentario no decía explícitamentesysvinit
, por lo que supongo que el sistema en cuestión puede estar usando el estiramiento predeterminadosystemd
parainit
. O que otras personas que se topan con esta publicación, que están usando estiramientossystemd
, encuentran útil esta parte.Según el Wiki de Debian ,
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 parasystemd-journald.service
osystemd-udevd.service
(ambos tienen dependencias de socket). O, si seNetworkManager
está ejecutando, puede reaparecer, lodhclient
que escribe arriendos en / var / ... (& / var / no siempre es su propio dispositivo), etc.fuser
podría encontrar y matar,dhclient
pero loNetworkManager
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 conrescue.target
(yrunlevel1.target
es un enlace simbólico arescue.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
ymount -o remount,ro /
debe funcionar. Si no, verifique nuevamente confuser
.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). Aunquemount -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 ...
fuente
¿Te has
/proc
montado?Al parecer, siendo alguien que se encarga de
/
montar solo lectura la mayor parte del tiempo, me imagino que también podría optar por no montar procfs. Pero procfs es necesario paralsof
encontrar archivos abiertos.Los archivos abiertos por procesos son expuestos por el núcleo a través de enlaces simbólicos en procfs. Los directorios
/proc/<pid>/fd
contienen un enlace simbólico para cada archivo abierto. El nombre de los enlaces simbólicos son los números de los descriptores de archivo, y la ruta a la que hace referencia el enlace simbólico es la ruta del archivo.Los enlaces simbólicos colgantes aún permanecen en
/proc
los archivos abiertos que ya están eliminados. Y la ruta referenciada del archivo se renombra para terminar con "(eliminado)".Lo que
lsof +L1
hace esencialmente no es diferente de una línea rápida como:Por lo tanto, puede usar una línea similar para enumerar todos los archivos abiertos que pueden evitar que el sistema de archivos raíz se vuelva a montar (siempre que funcione
/proc
).Sin embargo, si lo hizo / lo hizo
/proc
, las únicas otras causas en las que puedo pensar son errores ... De todos modos, para su información, en mi actual sistema Debian Stretch.lsof +L1
Funciona como se esperaba.fuente
/proc
montado. No sigo tu razonamiento de por qué podría no haberlo hecho. De todos modos,stat -c%N /proc/[0-9]*/fd/* | grep deleted
no me muestra nada.Solo pude reproducir este problema una vez y lo resolví simplemente
mount
con la opción -n .Citando a man mount :
El
mount
programa en sí mismo abriendo archivos para escribir en el sistema de archivos raíz me pareció una explicación plausible. Después de todo,mount
escribe específicamente/etc/mtab
y, a/etc
menudo, forma parte del sistema de archivos raíz. Sin embargo, no pude reproducirlo nuevamente en la misma máquina después de hacerlo una vez ...¿Podría esto resolver tu problema?
fuente
-n
con montaje no hace ninguna diferencia.Sin visibilidad en su sistema, es muy difícil decirle exactamente cuál es el problema. Los comentarios y las respuestas anteriores son buenos comienzos.
Dicho esto, volvería a través de la wiki de Debian que describe los requisitos previos para el montaje / solo lectura.
El enlace a la documentación está aquí: https://wiki.debian.org/ReadonlyRoot
El grande te acompañaré por aquí:
1 - hay ubicaciones específicas debajo / que deben leerse y escribirse. Según la documentación, se parece a esto:
sus dispositivos de bloque probablemente serán diferentes, dependiendo de la configuración de su pila de almacenamiento (particiones, lvm sin particiones, etc.) pero la idea principal es que necesita esos 4 puntos de montaje para tener su subsiguiente sistema de archivos montado para tener la opción de montaje RW.
2: hay una serie de archivos especiales en / etc que necesita para crear un enlace simbólico o implementar algún otro cambio (específicamente detallado en el artículo vinculado). Estos pueden o no aplicarse según las aplicaciones que esté ejecutando su servidor Linux. Es posible que algunos archivos ni siquiera existan en su máquina, pero incluí todo en los documentos. Tenga en cuenta que le recomiendo hacer estos cambios INCLUSO SI ha eliminado el pid del proceso. Estas son las rutas directamente desde el wiki de Debian:
Una vez que haya verificado todo lo anterior y haya confirmado que se ajustan a las especificaciones de la wiki, lo siguiente que debe verificar es /etc/apt/apt.conf
según su error, lo último que puede verificar según la documentación proviene de lo siguiente:
"Después de una actualización de paquetes, es posible que se enfrente al problema de que Mount se niega a volver a montar el sistema de archivos que solo le dice" / está ocupado ". Esto se debe a que los archivos eliminados todavía los utiliza un proceso. Para averiguar qué procesos se utilizan eliminados los archivos usan la herramienta checkrestart (1) del paquete debian-goodies o usan el siguiente comando. A menudo se trata de demonios que usan bibliotecas actualizadas. Hay que reiniciarlos para que los archivos se publiquen ".
comando proporcionado en el documento:
Sin conocer la configuración exacta del sistema de archivos, la partición y la configuración del dispositivo de almacenamiento, es difícil darle mucho más para seguir. Comenzaría por regresar y volver a verificar sus requisitos previos en la documentación (y se describe anteriormente).
fuente