A menudo tengo problemas para desmontar un directorio:
umount / mnt / dir umount: / mnt / dir: el dispositivo está ocupado
Hay muchas razones por las cuales el dispositivo está ocupado. A veces hay procesos en ejecución que tienen bloqueos abiertos, a veces hay otros directorios montados encima /mnt/dir
.
Mi pregunta:
¿Cuáles son los pasos para verificar por qué no se pudo desmontar un directorio?
Sé que hay muchas razones, pero está bien si explicas una solución específica.
[EDITAR]
[X] procesos en ejecución en volúmenes montados.
[X] otro volumen está montado encima de un volumen que queremos desmontar
[_] NFS bloquea el volumen que queremos desmontar
Respuestas:
La forma de verificar es
fuser -vm /mnt/dir
, que debe ejecutarse como root. Le dirá qué procesos están accediendo al punto de montaje.Una alternativa es
lsof /mnt/dir
, que mostrará cada archivo abierto en el montaje. Nuevamente, es mejor ejecutarlo como root.Puede ejecutar cualquiera de estos como no root, pero luego la salida se limitará a sus procesos; los de otros usuarios simplemente no se mostrarán en silencio, a pesar de que evitarán desmontar el sistema de archivos.
Ejemplo:
El campo "acceso" le dice cómo se está accediendo. En este caso, el núcleo lo tiene en uso como montaje (duh, pero desmontar estará bien solo con esto).
bash
lo tiene como el directorio de trabajo actual (tendrá que hacerlocd
en un directorio diferente antes de desmontar) y gvim tiene el directorio actual y tiene un archivo abierto (deberá cerrar ese gvim).En esta salida, puede ver los directorios actuales para bash y gvim (como tipo
DIR
). También puede ver qué archivo tiene abierto gvim para escribir.Cómo forzar el problema:
fuser
tiene una-k
opción que enviará una señal (por defecto:)SIGKILL
a cada proceso usando el montaje. Esta es una forma bastante contundente de evitar que la montura esté ocupada. (¡Y por supuesto, ten cuidado con lo que túSIGKILL
!)umount
tiene una-l
opción para realizar un desmontaje diferido. El montaje se eliminará del espacio de nombres del sistema de archivos (por lo que ya no lo verá debajo/mnt/Zia/src
, en el ejemplo), pero permanece montado, por lo que los programas que acceden a él pueden continuar haciéndolo. Cuando el último programa que accede a él salga, el desmontaje realmente ocurrirá.Hay una causa final reparable de falla de desmontaje, y es que un servidor NFS se está cayendo. Aquí puede usar
umount -f
, pero corre el riesgo de perder datos si lo hace. (Es posible que el cliente haya guardado en caché las escrituras que el servidor aún no ha confirmado, y esas escrituras se descartarán. Sin embargo, a las aplicaciones ya se les ha dicho que la escritura es exitosa).fuente
fuser -k
es extremadamente arriesgado, ya que lo hará como root y si no está muy seguro de qué procesos se eliminarán, puede hacer un daño realmente espectacular con un comando descuidado ...-k
opción, para que sepas qué procesos vas a matar. Pero agregaré una advertencia.fuser -vm
mostró "montaje del núcleo". tuvo que hacer ensystemctl stop opt.mount
lugar de manualumount
.umount -f
y NFS. Mi problema estaba relacionado con NFS, donde mis máquinas de desarrollo cambiaron las IP y no pude eliminar el recurso compartido.Deberías usar:
fuente
-l
es exactamente la opción para usar cuando incluso-f
no funciona.Otro volumen está montado encima de un volumen que queremos desmontar:
El
mount
comando le permite conocer todos los volúmenes montados si se invoca sin argumentos ni opciones (excepto-v
). Puede tener una lista de puntos de montaje activos agregando un poco de perl:Luego, simplemente pase el punto de moint desde el que desea desmontar y sabrá si hay sistemas de archivos montados sobre este.
Entonces tienes dos soluciones . Desmonte los sistemas de archivos o muévalos con
mount --move olddir newdir
(kernel> 2.5.1)fuente
Abrir archivos
Los procesos con archivos abiertos son los culpables habituales. Mostrarlos:
Hay una ventaja en el uso en
/dev/<device>
lugar de/mountpoint
: un punto de montaje desaparecerá después de unumount -l
, o puede estar oculto por un montaje superpuesto.fuser
También se puede utilizar, pero en mi opiniónlsof
tiene una salida más útil. Sin embargo,fuser
es útil cuando se trata de matar los procesos que causan tus dramas para que puedas seguir con tu vida.Listar archivos en
<mountpoint>
(ver advertencia arriba):Elimine interactivamente solo procesos con archivos abiertos para escritura:
Después de volver a montar solo lectura (
mount -o remount,ro <mountpoint>
), es seguro (r) eliminar todos los procesos restantes:Puntos de montaje
El culpable puede ser el núcleo mismo. Otro sistema de archivos montado en el sistema de archivos que está intentando
umount
causarle dolor. Verifícalo con:Para montajes de bucle invertido, verifique también la salida de:
Inodos anónimos (Linux)
Los inodos anónimos pueden ser creados por:
open
conO_TMPFILE
)Estos son el tipo de pokemon más difícil de alcanzar y aparecen en
lsof
laTYPE
columna dea_inode
( como no está documentado en lalsof
página del manual ).No aparecerán
lsof +f -- /dev/<device>
, por lo que deberá:Para ver los procesos de eliminación de inodos anónimos, consulte: Lista de relojes inotify actuales (nombre de ruta, PID) .
fuente
La pregunta de cómo verificar si NFS accede a un directorio que se va a desmontar aún no tiene respuesta.
Lo que tengo es solo esto:
Comprueba si nfsd se está ejecutando:
Mostrar directorios montados por clientes:
y
showmount
sin argumentos muestra solo hosts cliente incluso si están fuera de línea. Supongo que este es un comportamiento especial de NFS.fuente
Para mí, el problema era que había iniciado sesión más de una vez (a través de ssh) y en uno de los inicios de sesión estaba en el símbolo del sistema donde el pwd estaba dentro de una carpeta subordinada al punto de montaje.
fuente