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 +L1no enumera ningún archivo.
No veo ningún cambio +|-Len man lsoflo 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 inity gettysigo ejecutándose, pero aún no puedo volver /a montar ro.

wouen laFDcolumna de lalsofsalida, oFen 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)
fuserse puede encontrar en elpsmiscpaquete; Este es un caso de uso donde encuentrofuserbrillos 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; doneEso está por encima de los
systemdcomentarios con una advertencia. Sisystemdesinitasífuserlo verá y hay otras consideraciones. Con lasystemdejecución, puede (re) iniciar procesos a sus espaldas, incluso si acaban de ser identificados y eliminadosfuser.systemdEs mucho más avanzado que el tradicionalsysvinit.B) La ACTUALIZACIÓN en la descripción indica que el sistema solo tiene ...
initygettysigue ejecutándose ...Veo el comentario que dice que el sistema no está usando
systemd, está usandoinit. En estiramiento,systemdesinit. El comentario no decía explícitamentesysvinit, por lo que supongo que el sistema en cuestión puede estar usando el estiramiento predeterminadosystemdparainit. 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
systemdejecución, hay algunos pasos adicionales que se deben tomar para liberar / para que se pueda volver a montar sin problemas.Es probable
system.sliceque tenga archivos abiertos parasystemd-journald.serviceosystemd-udevd.service(ambos tienen dependencias de socket). O, si seNetworkManagerestá ejecutando, puede reaparecer, lodhclientque escribe arriendos en / var / ... (& / var / no siempre es su propio dispositivo), etc.fuserpodría encontrar y matar,dhclientpero loNetworkManagerinicia 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
systemdequivalente del nivel de ejecución 1 se corresponde conrescue.target(yrunlevel1.targetes un enlace simbólico arescue.target).1) Comience aislando el sistema para
rescue.target# systemctl isolate rescue.targetDeberí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.slice3) En este punto, el remontaje no debe informar
mount: / is busyymount -o remount,ro /debe funcionar. Si no, verifique nuevamente confuser.4) FWIW; También he visto momentos en que
umountfalla 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.lsblkPuede 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
/procmontado?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 paralsofencontrar 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>/fdcontienen 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
/proclos archivos abiertos que ya están eliminados. Y la ruta referenciada del archivo se renombra para terminar con "(eliminado)".Lo que
lsof +L1hace 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 +L1Funciona como se esperaba.fuente
/procmontado. No sigo tu razonamiento de por qué podría no haberlo hecho. De todos modos,stat -c%N /proc/[0-9]*/fd/* | grep deletedno me muestra nada.Solo pude reproducir este problema una vez y lo resolví simplemente
mountcon la opción -n .Citando a man mount :
El
mountprograma en sí mismo abriendo archivos para escribir en el sistema de archivos raíz me pareció una explicación plausible. Después de todo,mountescribe específicamente/etc/mtaby, a/etcmenudo, 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
-ncon 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