in

linux – Cómo desmontar un dispositivo ocupado

apple touch icon@2

Evitar umount -l

En el 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, solo 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

Trabajar alrededor / alternativa

El comportamiento útil de umount -l está ocultando el acceso al sistema de archivos por absoluto nombres de ruta, minimizando así el uso adicional de moutpoint.

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 archivo en el punto de montaje a continuación 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 remontaje de solo lectura. Cuando obtienes el remount,ro insignia, sabes que:

  1. Todos los datos pendientes se han escrito en el disco.
  2. Todos los intentos de escritura futuros 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éntalo directamente. ¡Puede que te sientas afortunado, punk!

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

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

A continuación, debería poder volver a montar el dispositivo en modo de solo lectura y garantizar un estado coherente.

Si no puede volver a montar el modo de solo lectura en este momento, investigue algunas de las otras posibles causas enumeradas 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 use 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 de nombre de archivo y aún usar fuser, necesitarías:

  1. Duplica temporalmente el punto de montaje con mount -o bind /media/hdd /mnt a otro lugar
  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 está oculto (no se pudieron abrir más archivos, el problema no puede empeorar)
  2. Un directorio montado en enlace duplicado (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á de forma interactiva matar los procesos con archivos abiertos para escritura. Por supuesto, puede hacer esto sin ocultar el punto de montaje en absoluto, pero lo anterior imita umount -l, sin ninguno de los peligros.

los -w cambiar se restringe a los procesos de escritura, y el -i es interactivo, por lo que después de un remontaje de solo lectura, si tiene prisa, puede usar:

fuser -vmMk <mountpoint>

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

Con suerte, en este punto, puede desmontar el dispositivo. (Necesitarás correr umount en el punto de montaje dos veces si has enlazado montado un modo 000 directorio en la parte superior.)

O usar:

fuser -vmMki <mountpoint>

para matar de forma interactiva los procesos de solo lectura restantes que bloquean el desmontaje.

Maldita sea, todavía tengo target is busy!

Los archivos abiertos no son el único bloqueador de desmontaje. Ver aquí y aquí por 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 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.


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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

JUnit – Prueba parametrizada

SSxGqf4z6xcW4iDNsnm2yZ 1200 80

15 consejos esenciales de Monster Hunter World que debes saber antes de jugar