Cómo desmontar un dispositivo ocupado [cerrado]

Resuelto Max asked hace 13 años • 16 respuestas

Tengo algunas unidades Samba a las que acceden varios usuarios diariamente. Ya tengo un 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 mi tabla SQL (de hecho, la desconecto), ¿cómo, o incluso existe, 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 avatar Oct 24 '11 23:10 Max
Aceptado

!! Existe una manera de desconectar un dispositivo ocupado inmediatamente, incluso si está ocupado y no se puede desmontar a la fuerza. Puedes limpiar todo más tarde:

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

NOTA/PRECAUCIÓN

  1. Estos comandos pueden interrumpir un proceso en ejecución, provocar pérdida de datos O dañar archivos abiertos. Los programas que acceden a los archivos DISPOSITIVO/NFS de destino pueden generar errores O no funcionar correctamente después de forzar el desmontaje.
  2. No ejecute los comandos anteriores cuando seumount encuentre dentro de la ruta montada (Carpeta/Unidad/Dispositivo). Primero, puede usar pwdel comando para validar la ruta de su directorio actual (que no debería ser la ruta montada), luego usar cdel comando para salir de la ruta montada y desmontarla más tarde usando los comandos anteriores.
Amit Verma avatar Nov 14 '2013 04:11 Amit Verma

Si es posible, localicemos/identifiquemos el proceso ocupado, eliminemos ese proceso y luego unmountel recurso compartido/disco 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 avatar Oct 24 '2011 16:10 Frank Tudor

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

Luci avatar Apr 28 '2017 19:04 Luci

Evitarumount -l

Al momento de escribir este artículo, la respuesta más votada recomienda usar umount -l.

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

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

Solución alternativa/alternativa

El comportamiento útil de umount -les ocultar el acceso al sistema de archivos mediante nombres de ruta absolutos , minimizando así el uso adicional de puntos de salida.

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

Luego, cualquier nuevo acceso a los nombres de archivos debajo del punto de montaje llegará al directorio recién superpuesto sin permisos; de este modo se evitan nuevos bloqueadores para el desmontaje.

Primero intentaremount,ro

El principal logro de desmontaje que se 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 futuros intentos de escritura fallarán.
  3. Los datos están en un estado consistente, en caso de que necesite desconectar físicamente el dispositivo.

mount -o remount,ro /dev/device Se garantiza que fallará si hay archivos abiertos para escribir , así que inténtelo directamente. ¡Puede que te sientas afortunado, punk!

Si no tiene suerte, concéntrese únicamente en los procesos con archivos abiertos para escritura :

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

Luego debería poder volver a montar el dispositivo como de solo lectura y garantizar un estado consistente.

Si no puede volver a montar el modo de solo lectura en este momento, investigue algunas de las otras causas posibles que se enumeran aquí .

Desbloqueado el logro de volver a montar de solo lectura 🔓☑

Felicitaciones, sus datos en el punto de montaje ahora son consistentes y están protegidos contra escritura futura.

¿Por qué fuseres inferior alsof

¿Por qué no utilizarlo fuserantes? Bueno, podrías haberlo hecho, pero fuseropera en un directorio , no en un dispositivo , por lo que si quisieras eliminar el punto de montaje del espacio de nombres de archivos y aún usarlo fuser, necesitarías:

  1. Duplicar temporalmente el punto de montaje en mount -o bind /media/hdd /mntotra ubicación
  2. Oculte el punto de montaje original y bloquee 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 oculto (no se pudieron abrir más archivos, el problema no puede empeorar)
  2. Un directorio duplicado montado en enlace (a diferencia de un dispositivo) en el que ejecutar fuser.

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

fuser -vmMkiw <mountpoint>

que solicitará interactivamente finalizar los procesos con archivos abiertos para escritura. Por supuesto, puedes hacer esto sin ocultar el punto de montaje en absoluto, pero lo anterior imita umount -lsin ninguno de los peligros.

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

fuser -vmMk <mountpoint>

para eliminar todos los procesos restantes con archivos abiertos bajo el punto de montaje.

Con suerte, en este punto podrás desmontar el dispositivo. (Deberá ejecutar umounten el 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 restantes de solo lectura que bloquean el desmontaje.

¡Maldita sea, todavía lo entiendo target is busy!

Los archivos abiertos no son el único bloqueador de desmontaje. Consulte aquí y aquí para conocer otras causas y sus remedios.

Incluso si tienes algún gremlin al acecho que te impide desmontar completamente el dispositivo, al menos tienes tu sistema de archivos en un estado consistente.

Luego puede utilizar 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 avatar Sep 26 '2019 16:09 Tom Hale

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

La -ibandera hace fuserpreguntar antes de matar.

fuser -kim /address  # kill any processes accessing file
unmount /address
user3751769 avatar Jun 30 '2014 07:06 user3751769