![Desmontaje de dispositivos desmontables (eSATA, almacenamiento USB) en Linux](https://rvso.com/image/1288697/Desmontaje%20de%20dispositivos%20desmontables%20(eSATA%2C%20almacenamiento%20USB)%20en%20Linux.png)
Un dispositivo desmontable como eSATA, una unidad USB se puede quitar abruptamente (simplemente tirando del enchufe).
Si hay identificadores de archivos abiertos en una partición, entonces estas particiones no se desmontarán, es decir, el umount
comando de Linux fallará, incluso DESPUÉS de que la unidad se desconecte físicamente.
Si el desmontaje falla, al volver a conectar el dispositivo, mount
también fallará. Por lo tanto, debe averiguar qué procesos están utilizando la unidad y eliminarlos o cerrar todos los identificadores. Si no puede hacer ninguna de las dos cosas, tendrá que reiniciar la caja para montar la unidad. Y definitivamente no puedo matar el proceso usándolo.
No veo ninguna opción de "forzar desmontaje", hay una -f
opción, pero es sólo para NFS.
Esto suena muy extraño, ¿no se adapta Linux a este escenario en el que un usuario simplemente arranca un disco? ¿Alguien sabe cómo manejar este escenario con elegancia en Linux?
¿Hay alguna forma de saber qué identificadores de archivos están abiertos en una partición/dispositivo en particular o de vaciar y cerrar selectivamente todos los identificadores de archivos solo para un dispositivo en particular?
Nota: El lsof
comando no está disponible en el Linux integrado que estoy usando (busybox).
"fuser" no está disponible en mi Linux integrado.
Probé el método diferido umount -l. Sin embargo, no parece funcionar de manera consistente. Digamos, por ejemplo, que mantengo un identificador de archivo abierto (con "tail -f" en algún archivo del dispositivo). Luego desconecto una unidad y luego hago "umount -l" y se desmonta. Y luego vuelvo a colocar la unidad e intento montarla nuevamente en el mismo punto de montaje, mientras la cola aún está en funcionamiento. No funciona consistentemente. A veces lo consigue y otras no. Esto me hace sentir incómodo al usar la opción diferida y si deja el sistema de archivos en un estado inconsistente. Y tampoco estoy seguro de si esta opción perezosa estaba destinada a usarse en tales escenarios.
No puedo finalizar el proceso que tiene identificadores de archivos abiertos.
Parece que si he montado el dispositivo en, por ejemplo, /mnt/abc y si desconecto la unidad y luego la vuelvo a conectar, Linux parece volver a conectar el sistema de archivos del dispositivo al mismo punto de montaje "/mnt/abc", sin que nosotros hagamos nada. desmontar o montar. Y luego, los mismos antiguos identificadores de archivos abiertos parecen comenzar a funcionar después de volver a adjuntarlos (al menos para la operación de lectura de archivos). Esta es mi observación. No estoy seguro de si este es el comportamiento esperado. Sin embargo, esto tampoco parece funcionar de manera consistente.
Tenía un identificador de archivo abierto para lectura ("tail -f") que dejé abierto, luego lo desconecté y lo volví a conectar y luego modifiqué el archivo que estaba siendo seguido y vi que la salida "tail -f" se actualizaba con los cambios. Sin embargo, si intento modificar un archivo después de que el dispositivo desapareció (da el error esperado) y luego lo vuelvo a conectar, el sistema de archivos del dispositivo no se vuelve a conectar correctamente al mismo punto de montaje. En caso de escritura de un archivo (mientras el dispositivo no estaba allí), no parece estar funcionando.
¿Existe algún comportamiento estándar/consistente que siga Linux cuando se retira una unidad abruptamente sin cerrar todas las manijas y desmontar correctamente todas las particiones?
Respuesta1
Puede escribir un script bash para escanear todos los descriptores de archivos enumerados /proc
(supongamos que los tiene) y enumerar/eliminar los procesos.
/proc/$m/fd/$n
es el enésimo descriptor de archivo para PID m presentado como un enlace simbólico. busybox
tiene soporte readlink, por lo que deberías poder automatizarlo.
Editar: solo decir que esto es esencialmente una reimplementación lsof
, pero en realidad es bastante simple.
Respuesta2
Puede utilizar lsof
para enumerar los archivos abiertos en un determinado directorio utilizando lsof +D /path/to/mountpoint
.
Respuesta3
Has probado:
umount -l /path/to/mountpoint
fuser -km /path/to/mountpoint
Ok, entonces mis sugerencias anteriores no funcionaron. Sé que puede ser una estupidez, pero ¿has probado realmente?
umount -f /path/to/mountpoint
Según la documentación de Busybox, debería ser la opción forzar desmontaje (mostrando NFS como ejemplo).
Si eso no funciona, ¿has probado?
eject -s /dev/my-sata-or-usb-device
Respuesta4
Una solución rápida cuando le falte lsof
sería
find /proc/*/fd | xargs readlink | grep /mount_point
reemplazar mount_point con el punto de montaje real. Esto se basa en la respuesta anterior de billc.cn.