¿Cómo averiguo qué procesos impiden el desmontaje de un dispositivo?

59

A veces, me gustaría desmontar un dispositivo USB con umount /run/media/theDrive, pero recibo un drive is busyerror.

¿Cómo averiguo qué procesos o programas están accediendo al dispositivo?

Stefan
fuente
1
más votos a favor para la misma pregunta / respuesta aquí: stackoverflow.com/questions/624154/…
Trevor Boyd Smith

Respuestas:

58

Úselo lsof | grep /media/whateverpara averiguar qué está usando el soporte.

Además, considere umount -l(uzyunt) para evitar que nuevos procesos usen la unidad mientras realiza la limpieza.

Peter Eisentraut
fuente
24
fuser -mv /path/to/mountpointpodría ser una alternativa más legible para descubrir procesos utilizando un punto de moint.
Riccardo Murri
@RiccardoMurri lsof | grepfunciona mejor para mí. fuser -mvparece volcar más de 80 procesos no relacionados. Estoy usando los directorios de Mount Binded.
Ricky Boyce
1
umount -les peligroso . mount -o bind un 000directorio vacío de modo en la parte superior y limpiar a través de lsof +f -- /dev/device.
Tom Hale
35

La mayoría de las veces, el mejor comando a utilizar es lsof ( “ l i s t o pluma f iles”).

lsof +f -- /media/usb0

¿Dónde /media/usb0está el punto de montaje de la unidad USB u otro sistema de archivos para desmontar? +f --le dice a lsof que trate el argumento posterior como un punto de montaje; por lo general, pero no siempre, se maneja solo, por lo que lsof /media/usb0también funciona. Esto encuentra archivos abiertos (incluso los que no están vinculados), archivos mapeados en memoria, directorios actuales y algunos usos más oscuros. Deberá ejecutar el comando como root para obtener información sobre los procesos de otros usuarios (y creo que hay unices donde lsofdebe ejecutarse como root).

Hay usos que lsof no encontrará; Estos son poco comunes en los medios extraíbles. Incluyen:

  • puntos de montaje: no puede desmontar /foosi /foo/bares un punto de montaje.
  • dispositivos de montaje: no puede desmontar /foosi /foo/bares un dispositivo de bloque montado o un archivo regular montado en bucle, o si es la fuente de un montaje de enlace de Linux.
  • Exportación NFS: lsof no detectará que un árbol sea exportado por un servidor NFS del núcleo.

Otro comando que puede servir en caso de necesidad es el fusor, que solo enumera los PID de los procesos con archivos abiertos en el dispositivo:

fuser -m /media/usb0
Gilles 'SO- deja de ser malvado'
fuente
8

Puedes usarlo lsofcomo dijo Peter, o si estás seguro de que solo quieres matar todas esas cosas y desmontarlo, probablemente puedas hacer algo como:

fuser -Mk /mnt/path
umount /mnt/path
pioto
fuente
1
Si vas a hacer esto, considera el uso -Mpor seguridad.
Tom Hale
@TomHale Es posible que desee aclarar a qué comando se -Mdebe aplicar.
HSchmale
1
fuser: -M, --ismountpoint Request will be fulfilled only if NAME specifies a mountpoint. This is an invaluable seatbelt which prevents you from killing the machine if NAME happens to not be a filesystem.
Tom Hale
6

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 ( gracias Stephen Kitt ), también verifique 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 como a_inode(que no está documentada 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) .

inotify relojes (Linux)

Este comentario explica por qué inotify no debe impedir que un desmontaje, pero esta nota se describen las situaciones en las que voluntad :

un desmontaje puede colgar en la vx_softcnt_flush()llamada. El bloqueo ocurre porque los relojes inotify incrementan la i_countvariable y hacen v_os_hold valueque permanezca elevada hasta que el observador inotify suelte la retención.

Tom Hale
fuente
Hay otro, montajes de bucle invertido: si monta un sistema de archivos, luego monta un archivo en ese sistema de archivos usando un montaje de bucle invertido, no podrá desmontar el primer sistema de archivos, pero no aparecerá nada lsof.
Stephen Kitt
Salud. Agregado a la Mountpointssección.
Tom Hale
5

Si usa GNOME, el desmontaje a través de Nautilus mostrará un mensaje que indica qué proceso todavía está usando la unidad y el archivo que está usando.

texto alternativo

tshepang
fuente
1

Para (al menos) OpenBSD:

$ fstat /mnt/mountpoint

Por ejemplo (usar doaspara ejecutar fstatcomo root ya que de lo contrario solo veríamos nuestros propios procesos):

$ doas fstat /usr/ports
USER     CMD          PID   FD MOUNT        INUM MODE         R/W    SZ|DV NAME
_pbuild  make       15172   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/
_pbuild  make       40034   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/

En este caso, no podría desmontar /usr/portshasta que el usuario _pbuildhaya terminado de ejecutar esos dos makeprocesos.

Kusalananda
fuente
-2

Este es un escollo común: debe recurrir a un usuario diferente (ya sea root o cualquier otro usuario), cambiar al directorio de un dispositivo montado y luego cerrar sesión como ese usuario. Cuando olvides que te fuiste en ese directorio, puedes intentar encontrarlo hasta que estés ciego. lsofmuestra al shell qué directorio actual está usando ese dispositivo. Es posible que desee su como ese usuario nuevamente para cambiar su directorio.

Hans Linkels
fuente
2
Esta respuesta es incompleta o incorrecta. No estoy seguro de cuál porque tampoco está claro.
hildred