it-swarm-es.tech

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

A veces, me gustaría desmontar un dispositivo usb con umount /run/media/theDrive, pero obtengo un drive is busy error.

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

70
Stefan

Utilizar lsof | grep /media/whatever para averiguar qué está usando el montaje.

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

70
Peter Eisentraut

La mayoría de las veces, el mejor comando para usar es lsof (“ l i s t o bolígrafo f iles ").

lsof +f -- /media/usb0

dónde /media/usb0 es 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, de modo que lsof /media/usb0 tambié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 lsof tiene que ejecutarse como root).

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

  • puntos de montaje: no puedes desmontar /foo Si /foo/bar es un punto de montaje.
  • montar dispositivos: no puede desmontar /foo Si /foo/bar es 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

Abrir archivos

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

lsof +f -- <mountpoint or device>

Hay una ventaja de usar /dev/<device> En lugar de /mountpoint: Un punto de montaje desaparecerá después de un umount -l, O puede estar oculto por un montaje superpuesto.

fuser también se puede usar, pero en mi opinión lsof 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.

Lista de 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) matar 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 umount causará 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)

Inodos anónimos pueden ser creados por:

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

Estos son el tipo de pokemon más difícil de alcanzar, y aparecen en la columna lsof 's TYPE como a_inode (Que no está documentado en la página del manual lsof ).

No aparecerán en 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 de notificación actual (nombre de ruta, PID) .

inotify relojes (Linux)

Este comentario explica por qué inotify no debería evitar un desmontaje, pero esta nota describe las situaciones en las que :

un desmontaje puede colgarse en la llamada vx_softcnt_flush(). El bloqueo ocurre porque los relojes inotify incrementan la variable i_count Y hacen que v_os_hold value Permanezca elevado hasta que el observador inotify libere la retención.

9
Tom Hale

Puedes usar lsof como 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
8
pioto

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.

alt text

5
tshepang

Para (al menos) OpenBSD:

$ fstat /mnt/mountpoint

Por ejemplo (usando doas para ejecutar fstat como 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/ports hasta usuario _pbuild había terminado de ejecutar esos dos procesos make.

1
Kusalananda