Cómo desmontar un dispositivo ocupado [cerrado]
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 umount
no funciona.
Ignorando la posibilidad de destruir datos: ¿es posible desmontar un dispositivo que se está leyendo actualmente?
SÍ !! 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
- 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.
- No ejecute los comandos anteriores cuando se
umount
encuentre dentro de la ruta montada (Carpeta/Unidad/Dispositivo). Primero, puede usarpwd
el comando para validar la ruta de su directorio actual (que no debería ser la ruta montada), luego usarcd
el comando para salir de la ruta montada y desmontarla más tarde usando los comandos anteriores.
Si es posible, localicemos/identifiquemos el proceso ocupado, eliminemos ese proceso y luego unmount
el 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)
Asegúrese de no estar todavía en el dispositivo montado cuando intente desmontarlo.
Evitarumount -l
Al momento de escribir este artículo, la respuesta más votada recomienda usar umount -l
.
umount -l
es 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 -l
es 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 000
sobre 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,ro
insignia, sabes que:
- Todos los datos pendientes se han escrito en el disco.
- Todos los futuros intentos de escritura fallarán.
- 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é fuser
es inferior alsof
¿Por qué no utilizarlo fuser
antes? Bueno, podrías haberlo hecho, pero fuser
opera 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:
- Duplicar temporalmente el punto de montaje en
mount -o bind /media/hdd /mnt
otra ubicación - 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:
- El espacio de nombres original oculto (no se pudieron abrir más archivos, el problema no puede empeorar)
- 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 -l
sin ninguno de los peligros.
El -w
interruptor se restringe a los procesos de escritura y -i
es 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 umount
en el punto de montaje dos veces si ha montado un 000
directorio 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/device
para 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-point
que tenga implicaciones . Básicamente, si el punto de montaje está montado bajo el /
sistema de archivos, querrás evitar esto.
Pruebe lo siguiente, pero antes de ejecutarlo tenga en cuenta que la -k
bandera eliminará cualquier proceso en ejecución que mantenga el dispositivo ocupado.
La -i
bandera hace fuser
preguntar antes de matar.
fuser -kim /address # kill any processes accessing file
unmount /address