Dispositivo ocupado en Umount

41

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


fuente

Respuestas:

76

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:

Watt:~# fuser -vm /mnt/Zia/src
                     USER        PID ACCESS COMMAND
/mnt/Zia/src:        root     kernel mount /mnt/Zia/src
                     anthony   24909 ..c.. bash
                     anthony   25041 F.c.. gvim

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). bashlo tiene como el directorio de trabajo actual (tendrá que hacerlo cden un directorio diferente antes de desmontar) y gvim tiene el directorio actual y tiene un archivo abierto (deberá cerrar ese gvim).

Watt:~# lsof /mnt/Zia/src
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    24909 anthony  cwd    DIR   0,26    12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim    25041 anthony  cwd    DIR   0,26    12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim    25041 anthony    6u   REG   0,26    16384 3526219 /mnt/Zia/src/perl/.utf8.c.swp (zia.vpn.home:/home/anthony/src)

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:

fusertiene una -kopción que enviará una señal (por defecto:) SIGKILLa 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!)

umounttiene una -lopció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).

derobert
fuente
44
Tenga en cuenta que fuser -kes 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 ...
Shadur
1
@Shadur bien, espero que ya lo hayas ejecutado sin la -kopción, para que sepas qué procesos vas a matar. Pero agregaré una advertencia.
derobert
1
fuser -vmmostró "montaje del núcleo". tuvo que hacer en systemctl stop opt.mountlugar de manual umount.
lkraav
2
Por alguna razón, umount -f no funciona para mí, pero ejecutar umount -l funciona perfectamente.
Firze
Gracias por la nota sobre umount -fy NFS. Mi problema estaba relacionado con NFS, donde mis máquinas de desarrollo cambiaron las IP y no pude eliminar el recurso compartido.
Eric
19

Deberías usar:

sudo umount -l <path>
Felipe
fuente
77
⁺¹, no tengo idea de qué persona tonta podría rechazarlo. Esta -les exactamente la opción para usar cuando incluso -fno funciona.
Hola Ángel,
@ Hola-Angel ¿Porque esto no es lo que el OP está pidiendo?
xhienne
@xheinne stack exchange no se trata solo de responder una pregunta como un bot de estupefacción, esta respuesta es útil. mucha gente viene de la búsqueda de google también. Personalmente me pareció útil. El operador debe aceptar la respuesta que le parezca relevante, por eso el botón de aceptar está allí.
user1735921
6

Otro volumen está montado encima de un volumen que queremos desmontar:

El mountcomando 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:

mount | perl -pe 's/.*on (\S+) type.*/\1/'

Luego, simplemente pase el punto de moint desde el que desea desmontar y sabrá si hay sistemas de archivos montados sobre este.

mount | perl -pe 's/.*on (\S+) type.*/\1/' | grep '/mnt/dir/'

Entonces tienes dos soluciones . Desmonte los sistemas de archivos o muévalos con mount --move olddir newdir(kernel> 2.5.1)

mveroone
fuente
1
Si gracias. / etc / mtab y / proc / mounts también son posibles.
Ah, es cierto, siempre los olvidé. Digamos que escribir "mount" requiere menos caracteres (pero ¿más recursos para ejecutar?)
mveroone
1
Tengo un dispositivo de almacenamiento USB externo "permanentemente" montado en un determinado directorio de mi computadora portátil. A veces, el cable se desconecta por error. Fue un gran dolor volver a montar el dispositivo en el directorio (debido a "dispositivo ocupado") hasta que leí esta respuesta. Ahora sé que uso mount --move olddir newdir. Gracias.
Silvio Levy
3

Abrir archivos

Los procesos con archivos abiertos son los culpables habituales. Mostrarlos:

lsof +f -- <mountpoint or device>

Hay una ventaja en el uso en /dev/<device>lugar de /mountpoint: un punto de montaje desaparecerá después de un umount -l, o puede estar oculto por un montaje superpuesto.

fuserTambién se puede utilizar, pero en mi opinión lsoftiene una salida más útil. Sin embargo, fuseres ú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):

fuser -vmM <mountpoint>

Elimine interactivamente solo procesos con archivos abiertos para escritura:

fuser -vmMkiw <mountpoint>

Después de volver a montar solo lectura ( mount -o remount,ro <mountpoint>), es seguro (r) eliminar todos los procesos restantes:

fuser -vmMk <mountpoint>

Puntos de montaje

El culpable puede ser el núcleo mismo. Otro sistema de archivos montado en el sistema de archivos que está intentando umountcausarle dolor. Verifícalo con:

mount | grep <mountpoint>/

Para montajes de bucle invertido, verifique también la salida de:

losetup -la

Inodos anónimos (Linux)

Los inodos anónimos pueden ser creados por:

  • Archivos temporales ( opencon O_TMPFILE)
  • relojes inotify
  • [eventfd]
  • [eventpoll]
  • [timerfd]

Estos son el tipo de pokemon más difícil de alcanzar y aparecen en lsofla TYPEcolumna de a_inode( como no está documentado en la lsofpágina del manual ).

No aparecerán lsof +f -- /dev/<device>, por lo que deberá:

lsof | grep a_inode

Para ver los procesos de eliminación de inodos anónimos, consulte: Lista de relojes inotify actuales (nombre de ruta, PID) .

Tom Hale
fuente
1

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:

pidof nfsd

Mostrar directorios montados por clientes:

showmount -a

y showmountsin argumentos muestra solo hosts cliente incluso si están fuera de línea. Supongo que este es un comportamiento especial de NFS.


fuente
1

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.

Lonniebiz
fuente