Cómo desmontar un dispositivo ocupado

244

Tengo algunas unidades de samba a las que acceden varios usuarios a diario. Ya tengo código para reconocer unidades compartidas (de una tabla SQL) y montarlas en un directorio especial donde todos los usuarios puedan acceder a ellas.

Quiero saber, si elimino una unidad de disco de mi tabla SQL (efectivamente desconectada) ¿cómo, o incluso, hay una manera de desmontar un dispositivo ocupado? Hasta ahora he descubierto que cualquier forma de umountno funciona.

Ignorando la posibilidad de destruir datos, ¿es posible desmontar un dispositivo que se está leyendo actualmente?

Max
fuente
3
Una respuesta más general que aborda más causas para fallar umount se encuentra aquí oletange.blogspot.dk/2012/04/umount-device-is-busy-why.html
Ole Tange
2
Hola, probablemente cdmontaste el directorio, luego te convertiste en root o iniciaste sesión nuevamente y luego el otro shell está atrapado. Hacer exiten todas las conchas.
Smeterlink

Respuestas:

456

¡¡SI!! Hay una manera de desconectar un dispositivo ocupado de inmediato (incluso si está ocupado y no se puede desmontar con fuerza). Puede limpiar todo más tarde:

umount -l /PATH/OF/BUSY-DEVICE
umount -f /PATH/OF/BUSY-NFS(NETWORK-FILE-SYSTEM)

NOTA:

  1. Estos comandos pueden interrumpir un proceso en ejecución, causar pérdida de datos O dañar archivos abiertos. Los programas que acceden a los archivos de DISPOSITIVO / NFS de destino pueden arrojar errores O podrían no funcionar correctamente después del desmontaje forzado.
  2. Intente ejecutar estos comandos cuando NO esté dentro de la Carpeta / Unidad / Dispositivo montado.
Amit Verma
fuente
22
Nota: -laquí hay una minúscula L(para "desmontaje diferido"). (Vea esta respuesta relacionada .)
ジ ョ ー ジ
44
Trabajó. Un matiz, si ha iniciado sesión a través del cliente FTP, debe cerrar sesión para desmontar correctamente la carpeta.
Alexander Kim
Ellos no trabajan Ambos simplemente cuelgan para siempre. (Debian 8, cifs-utils 2: 6.4-1)
Hubro
1
-l/ --lazyno corromperá los archivos abiertos, pero en Linux parece que no puede saber cuándo el dispositivo está realmente desmontado y se puede quitar
Tom Hale
1
Asusta un poco. Desmonté perezosamente y luego volví a montar mientras algunos otros procesos todavía estaban accediendo a él. ¿Entonces supongo que lo monté dos veces al final en la misma ubicación? No estoy seguro de lo que hizo eso.
sudo
120

Si es posible, ubiquemos / identifiquemos el proceso ocupado, eliminemos el proceso y luego desmontemos el recurso compartido de samba para minimizar el daño.

  • lsof | grep '<mountpoint of /dev/sda1>' (o cualquiera que sea el dispositivo montado)

  • pkill target_process(mata el proceso ocupado por nombre | kill PID| killall target_process)

  • umount /dev/sda1 (o cualquiera que sea el dispositivo montado)

Frank Tudor
fuente
66
Eso no devuelve nada. Supongo que es porque es una unidad de red y no puedo ver los procesos de otras computadoras que acceden a la unidad. El mismo trato con los comandos del "fusor".
Max
oh diablos ... necesitas los comandos de samba ... / usr / bin / smbclient service <contraseña>: mira
Frank Tudor
2
Los comandos smb en realidad han quedado en desuso y reemplazados por "umount.cifs" ... que tampoco funciona. Parece que estoy atascado con no poder desmontar mientras está ocupado.
Max
Si está utilizando Asuswrt-Merlin, debe instalar lsof:# opkg install lsof
Tonatio
1
necesita sudo lsof para obtener algunos resultados
aheigins
78

Asegúrese de no estar todavía en el dispositivo montado cuando intente desmontar.

Luci
fuente
44
Exactamente, simplemente tener la carpeta actual (ubicada en el dispositivo de destino) abierta en su terminal (a través de, por ejemplo, el comando cd) es suficiente para detener el proceso de notificación :)
jave.web
2
Sí, tenía un shell ejecutándose en un directorio en el dispositivo. Cerró la ventana de la terminal y listo
sh78
Además, asegúrese de que no haya otros puntos de montaje dentro del que está intentando umount.
victe
@victe Gracias; Estaba enrutando una carpeta usando pfexec mount -F vboxfs carpetacompartida ~ / Documents on Solaris 11; pero Documentos tenía subcarpetas y ese era el problema.
Dani Aya
44

Intente lo siguiente, pero antes de ejecutarlo, tenga en cuenta que la -kbandera matará cualquier proceso en ejecución manteniendo el dispositivo ocupado.

La -ibandera hace fuserpreguntar antes de matar.

fuser -kim /address  # kill any processes accessing file
unmount /address
usuario3751769
fuente
55
lsof | grep '/dev/<my-device>no devolvió nada, ¡pero esto funciona muy bien! Es posible que también desee sugerir fuser -m /dev/<my-device>en caso de que desee conocer el proceso antes de matarlo.
modulitos
3
Ejecutar el comando del fusor me desconectó inmediatamente del VPS.
giorgio79
21

Evitar umount -l

Al momento de escribir, la respuesta mejor votada recomienda usar umount -l.

umount -les peligroso o, en el mejor de los casos, inseguro . En resumen:

  • En realidad, no desmonta el dispositivo, solo elimina el sistema de archivos del espacio de nombres. Las escrituras para abrir archivos pueden continuar.
  • Puede causar la corrupción del sistema de archivos btrfs

Trabajar alrededor / alternativa

El comportamiento útil de umount -les ocultar el sistema de archivos del acceso por rutas de acceso absolutas , minimizando así el uso adicional de moutpoint.

Este mismo comportamiento se puede lograr montando un directorio vacío con permisos 000sobre el directorio que se va a desmontar.

Entonces, cualquier acceso nuevo a los nombres de archivo en el punto de montaje debajo del punto de montaje golpeará el directorio recién superpuesto con cero permisos; por lo tanto, se evitan nuevos bloqueadores para el desmontaje.

Primero intenta remount,ro

El mayor logro de desmontaje para desbloquear es el remontaje de solo lectura. Cuando obtienes la remount,roinsignia, sabes que:

  1. Todos los datos pendientes se han escrito en el disco.
  2. Todos los intentos futuros de escritura fallarán
  3. Los datos están en un estado coherente, en caso de que necesite desconectar físicamente el dispositivo.

mount -o remount,ro /dev/device está garantizado que fallará si hay archivos abiertos para escribir , así que intente eso directamente. ¡Puede que te sientas afortunado, punk!

Si no tiene suerte, concéntrese solo en los procesos con archivos abiertos para escribir :

lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'

Debería poder volver a montar el dispositivo de solo lectura y garantizar un estado coherente.

Si no puede volver a montar solo lectura en este momento, investigue algunas de las otras posibles causas enumeradas aquí .

Logro de remontaje de solo lectura desbloqueado 🔓☑

Felicitaciones, sus datos en el punto de montaje ahora son consistentes y están protegidos de futuras escrituras.

¿Por qué fuseres inferior alsof

¿Por qué no usar el uso fuserantes? Bueno, podría haberlo hecho, pero fuseropera en un directorio , no en un dispositivo , por lo que si desea eliminar el punto de montaje del espacio de nombre de archivo y aún usarlo fuser, necesitaría:

  1. Duplique temporalmente el punto de montaje con mount -o bind /media/hdd /mntotra ubicación
  2. Oculta el punto de montaje original y bloquea el espacio de nombres:

Así es cómo:

null_dir=$(sudo mktemp --directory --tmpdir empty.XXXXX")
sudo chmod 000 "$null_dir"

# A request to remount,ro will fail on a `-o bind,ro` duplicate if there are
# still files open for writing on the original as each mounted instance is
# checked.  https://unix.stackexchange.com/a/386570/143394
# So, avoid remount, and bind mount instead:
sudo mount -o bind,ro "$original" "$original_duplicate"

# Don't propagate/mirror the empty directory just about hide the original
sudo mount --make-private "$original_duplicate"

# Hide the original mountpoint
sudo mount -o bind,ro "$null_dir" "$original"

Entonces tendrías:

  1. El espacio de nombres original está oculto (no se pueden abrir más archivos, el problema no puede empeorar)
  2. Un directorio montado de enlace duplicado (a diferencia de un dispositivo) en el que ejecutar fuser.

Esto es más complicado [1] , pero le permite usar:

fuser -vmMkiw <mountpoint>

que solicitará interactivamente matar los procesos con archivos abiertos para escritura. Por supuesto, puede hacer esto sin ocultar el punto de montaje, pero lo anterior imita umount -l, sin ninguno de los peligros.

El -winterruptor se restringe a los procesos de escritura, y -ies interactivo, por lo que después de un montaje de solo lectura, si tiene prisa, puede usar:

fuser -vmMk <mountpoint>

para eliminar todos los procesos restantes con archivos abiertos debajo del punto de montaje.

Con suerte, en este punto, puede desmontar el dispositivo. (Deberá ejecutar umountel punto de montaje dos veces si ha montado un 000directorio de modo en la parte superior).

O usar:

fuser -vmMki <mountpoint>

para eliminar interactivamente los procesos de solo lectura restantes que bloquean el desmontaje.

Maldita sea, todavía me sale target is busy!

Los archivos abiertos no son el único bloqueador desmontado. Vea aquí y aquí otras causas y sus remedios.

Incluso si tiene un gremlin al acecho que le impide desmontar completamente el dispositivo, al menos tiene su sistema de archivos en un estado coherente.

Luego puede usar lsof +f -- /dev/devicepara enumerar todos los procesos con archivos abiertos en el dispositivo que contiene el sistema de archivos y luego eliminarlos.


[1] Es menos complicado de usar mount --move, pero eso requiere mount --make-private /parent-mount-pointque tenga implicaciones . Básicamente, si el punto de montaje está montado bajo el /sistema de archivos, querrás evitar esto.

Tom Hale
fuente
1
Si --lazyes tan peligroso, ¿por qué no hay una advertencia en la umountpágina del manual? Todo lo que dice es " Desmontaje diferido. Separe el sistema de archivos de la jerarquía de archivos ahora, y limpie todas las referencias a este sistema de archivos tan pronto como ya no esté ocupado "
bitinerante
7

Verifique los sistemas de archivos NFS exportados con exportfs -v. Si se encuentra, elimine con exportfs -d share: / directorio. Estos no aparecen en la lista de fusor / lsof y pueden evitar que umount tenga éxito.

numberer6
fuente
1
Gracias por este consejo Tuve que usar exportfs -ua para eliminar el bloqueo.
FuePi
6

Echa un vistazo a umount2:

Linux 2.1.116 agregó la llamada al sistema umount2 (), que, como umount (), desmonta un objetivo, pero permite indicadores adicionales que controlan el comportamiento de la operación:

MNT_FORCE (desde Linux 2.1.116) Forzar el desmontaje incluso si está ocupado. (Solo para montajes NFS). MNT_DETACH (desde Linux 2.4.11) Realice un desmontaje diferido: haga que el punto de montaje no esté disponible para nuevos accesos y realice el desmontaje cuando el punto de montaje deje de estar ocupado. MNT_EXPIRE (desde Linux 2.6.8) Marque el punto de montaje como caducado. Si un punto de montaje no está actualmente en uso, entonces una llamada inicial a umount2 () con este indicador falla con el error EAGAIN, pero marca el punto de montaje como vencido. El punto de montaje permanece vencido mientras ningún proceso acceda a él. Una segunda llamada umount2 () que especifica MNT_EXPIRE desmonta un punto de montaje caducado. Este indicador no se puede especificar con MNT_FORCE o MNT_DETACH. Valor de retorno

En caso de éxito, se devuelve cero. En caso de error, se devuelve -1 y se establece errno de manera adecuada.

chown
fuente
Desafortunadamente, estos no son montajes NFS, sino CIFS. Sin embargo, intentaré el MNT_DETACH. Sin embargo, si umount -l no funcionó, no puedo imaginar que esto sea muy diferente. Gracias sin embargo!
Max
2

Alguien ha mencionado que si está utilizando la terminal y su directorio actual está dentro de la ruta que desea desmontar, obtendrá el error.
Como complemento, en este caso, lsof | grep path-to-be-unmounteddebe tener el siguiente resultado:

bash ... path-to-be-unmounted
Eugene
fuente
1

Otra alternativa cuando algo funciona es editar /etc/fstab, agregar noautomarcas y reiniciar la máquina. El dispositivo no se montará, y cuando termine de hacer lo que sea, quite la bandera y reinicie nuevamente.

jesjimher
fuente
0

Respuesta de nicho:

Si tiene un grupo zfs en ese dispositivo, al menos cuando se trata de un grupo basado en archivos, lsofno mostrará el uso. Pero puedes simplemente correr

sudo zpool export mypoo

y luego desmontar.

lucidbrot
fuente