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?
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.
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:
/foo
Si /foo/bar
es un punto de montaje./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.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
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>
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 pueden ser creados por:
open
con O_TMPFILE
)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 variablei_count
Y hacen quev_os_hold value
Permanezca elevado hasta que el observador inotify libere la retención.
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
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.
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
.