Si es posible, ubiquemos/identifiquemos el proceso ocupado, finalice ese proceso y luego unmount
el recurso compartido/unidad 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)
Evitar umount -l
Al momento de escribir, 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 en archivos abiertos pueden continuar.
- Puede causar daños en el sistema de archivos btrfs
Solución temporal/alternativa
El comportamiento útil de umount -l
está ocultando el sistema de archivos del acceso por parte de absolute nombres de rutas, lo que minimiza el uso adicional de puntos de salida.
Este mismo comportamiento se puede lograr montando un directorio vacío con permisos 000
sobre el directorio a desmontar.
Luego, cualquier nuevo acceso a los nombres de archivo debajo del punto de montaje llegará al directorio recién superpuesto con cero permisos; por lo tanto, se evitan nuevos bloqueadores para el desmontaje.
Primero intenta remount,ro
El principal logro de desmontaje que se desbloqueará es el de solo lectura. Cuando obtienes el 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
está garantizado que fallará si hay archivos abiertos para escritura, así que pruébelo directamente. ¡Puede que te sientas afortunado, punk!
Si no tiene suerte, concéntrese solo en procesos con archivos abiertos para escribir:
lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'
A continuación, debería poder volver a montar el dispositivo de solo lectura y garantizar un estado coherente.
Si no puede volver a montar el modo de solo lectura en este punto, investigue algunas de las otras causas posibles que se enumeran aquí.
Logro de montaje de solo lectura desbloqueado ð☑
Felicitaciones, sus datos en el punto de montaje ahora son consistentes y están protegidos contra escritura futura.
Por qué fuser
es inferior a lsof
¿Por qué no usar fuser
? ¿más temprano? Bueno, podrías haberlo hecho, pero fuser
opera sobre un directorio , no un dispositivo , por lo que si desea eliminar el punto de montaje del espacio del nombre del archivo y seguir usando fuser
, necesitarías:
- Duplica temporalmente el punto de montaje con
mount -o bind /media/hdd /mnt
a otra ubicación - Oculte el punto de montaje original y bloquee el espacio de nombres:
Así es como:
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 está oculto (no se pudieron abrir más archivos, el problema no puede empeorar)
- Un directorio montado en enlace duplicado (a diferencia de un dispositivo) en el que ejecutar
fuser
.
Esto es más complicado, pero te permite usar:
fuser -vmMkiw <mountpoint>
que solicitará de forma interactiva que elimine los procesos con archivos abiertos para escritura. Por supuesto, podría hacer esto sin ocultar el punto de montaje, pero lo anterior imita umount -l
, sin ninguno de los peligros.
El -w
switch se restringe a los procesos de escritura, y el -i
es 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 bajo el punto de montaje.
Con suerte, en este punto, puede desmontar el dispositivo. (Deberá ejecutar umount
en el punto de montaje dos veces si ha montado un enlace en modo 000
directorio en la parte superior.)
O usa:
fuser -vmMki <mountpoint>
para eliminar de forma interactiva los procesos restantes de solo lectura que bloquean el desmontaje.
Maldita sea, todavía obtengo target is busy
!
Los archivos abiertos no son el único bloqueador de desmontaje. Ver aquí y aquí para otras causas y sus remedios.
Incluso si tiene algún gremlin al acecho que le impide desmontar completamente el dispositivo, al menos tiene su sistema de archivos en un estado consistente.
A continuación, 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.
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 la pérdida de datos O dañar archivos abiertos. Los programas que acceden a los archivos DEVICE/NFS de destino pueden arrojar errores O no funcionar correctamente después de forzar el desmontaje.
- Hacer no ejecutar arriba
umount
comandos cuando está dentro de la ruta montada (Carpeta/Unidad/Dispositivo) en sí. Primero, puede usarpwd
comando para validar su ruta de directorio actual (que no debe ser la ruta montada), luego usecd
comando para salir de la ruta montada - para desmontarlo más tarde usando los comandos anteriores.
Asegúrese de no estar todavía en el dispositivo montado cuando intente desmontarlo.