unit - unmount device linux
Linux: ¿Qué proceso está causando "dispositivo ocupado" cuando se desmonta? (12)
Linux: ¿Qué proceso está causando "dispositivo ocupado" cuando se desmonta?
Abrir archivos
Los procesos con archivos abiertos son los culpables habituales. Mostrarlos:
lsof +f -- <mountpoint or device>
Existe una ventaja al usar /dev/<device>
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 un resultado 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 la advertencia anterior):
fuser -vmM <mountpoint>
Mata interactivamente solo los procesos con archivos abiertos para escritura:
fuser -vmMkiw <mountpoint>
Después de volver a instalar 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 kernel mismo. Otro sistema de archivos montado en el sistema de archivos que está tratando de umount
causará dolor. Comprobar con:
mount | grep <mountpoint>/
Para montajes de loopback, también verifique la salida de:
losetup -la
Inodos anónimos (Linux)
Los inodes anónimos pueden ser creados por:
- Archivos temporales (
open
conO_TMPFILE
) - inotify relojes
- [eventfd]
- [eventpoll]
- [timerfd]
Estos son los tipos de Pokémon más escurridizos y aparecen en la columna TYPE
lsof
como a_inode
(que no está documentado en la página man de lsof
).
No aparecerán en lsof +f -- /dev/<device>
, por lo que deberá:
lsof | grep a_inode
Para matar procesos que contienen inodos anónimos, ver: Lista de relojes inotify actuales (ruta de acceso, PID) .
Compruebe si hay dispositivos de bucle abierto asignados a un archivo en el sistema de archivos con "losetup -a". No aparecerán con lsof o fuser.
De hecho, lsof y fuser son dos formas de encontrar el proceso que mantiene abierto un determinado archivo. Si lo que desea es desmontar, debe investigar sus opciones -f y -l.
Deberías usar el comando fuser
.
P.ej. fuser /dev/cdrom
devolverá los pid (s) del proceso usando /dev/cdrom
.
Si está intentando desmontar, puede eliminar el proceso con el -k
(consulte el man fuser
).
Es exactamente por eso que existe el "fuser -m / mount / point".
Por cierto, no creo que "fuser" o "lsof" indiquen cuándo un recurso está retenido por el módulo kernel, aunque normalmente no tengo ese problema.
Los sistemas de archivos montados en el sistema de archivos que está tratando de desmontar pueden causar que el target is busy
además de los archivos que están en uso. (Por ejemplo, cuando mount -o bind /dev /mnt/yourmount/dev
para usar chroot
allí).
Para encontrar qué sistemas de archivos están montados en el sistema de archivos, ejecute lo siguiente:
mount | grep ''/mnt/yourmount''
Para encontrar qué archivos están en uso, el consejo ya sugerido por otros aquí:
lsof | grep ''/mnt/yourmount''
Mire el comando lsof (enumere los archivos abiertos): le puede decir qué procesos contienen qué elementos abiertos. A veces es complicado, pero a menudo algo tan simple como sudo lsof | grep (your device name here)
sudo lsof | grep (your device name here)
podría hacerlo por ti.
Por si acaso ... a veces sucede que llamas a umount desde la terminal, y tu directorio actual pertenece al sistema de archivos montado.
Si aún no puede desmontar o volver a montar su dispositivo después de detener todos los servicios y procesos con archivos abiertos, entonces puede haber un archivo de intercambio o una partición de intercambio manteniendo ocupado su dispositivo. Esto no aparecerá con fuser
o lsof
. Desactivar el intercambio con:
sudo swapoff -a
Puede verificar de antemano y mostrar un resumen de cualquier partición de intercambio o intercambio de archivos con:
swapon -s
o:
cat /proc/swaps
Como alternativa al uso del comando sudo swapoff -a
, también podría deshabilitar el intercambio al detener un servicio o una unidad systemd . Por ejemplo:
sudo systemctl stop dphys-swapfile
o:
sudo systemctl stop var-swap.swap
En mi caso, era necesario desactivar el intercambio, además de detener cualquier servicio y proceso con archivos abiertos para escribir, de modo que pudiera volver a montar mi partición raíz como de solo lectura para ejecutar fsck
en mi partición raíz sin reiniciar. Esto fue necesario en una Raspberry Pi con Raspbian Jessie.
Verifique también /etc/exports
. Si está exportando rutas dentro del punto de montaje a través de NFS, dará este error cuando intente desmontar y no aparecerá nada en fuser
o lsof
.
lsof y fuser tampoco me dieron nada.
Después de un proceso de cambiar el nombre de todos los directorios posibles a .old y reiniciar el sistema cada vez que hice cambios, encontré un directorio en particular (relacionado con postfix) que era responsable.
Resultó que una vez hice un enlace simbólico de / var / spool / postfix a / disk2 / pers / mail / postfix / varspool para minimizar las escrituras de disco en un sistema de archivos raíz basado en SDCARD (Sheeva Plug).
Con este enlace simbólico, incluso después de detener los servicios postfix y dovecot (tanto ps aux como netstat -tuanp no mostraban nada relacionado) no pude desmontar / disk2 / pers.
Cuando eliminé el enlace simbólico y actualicé los archivos de configuración de postfix y dovecot para apuntar directamente a los nuevos directorios en / disk2 / pers / pude detener los servicios y desmontar el directorio.
La próxima vez veré más de cerca el resultado de:
ls -lR /var | grep ^l | grep disk2
El comando anterior enumerará recursivamente todos los enlaces simbólicos en un árbol de directorios (aquí comienza en / var) y filtrará los nombres que apuntan a un punto de montaje de destino específico (aquí disk2).
lsof +f -- /mountpoint
(como una lista de los procesos que usan archivos en el soporte montado en / mountpoint. Particularmente útil para encontrar qué proceso (s) está (n) utilizando un dispositivo USB montado o CD / DVD.