El USB se niega a desmontarse
A veces tengo problemas para desmontar dispositivos, especialmente mi bonito reproductor de MP3 portatil MUVO que funciona como USB Mass Storage. No me deja desontarlo, y me ponga como me ponga se niega a desmontarse alegando que está ocupado. No tengo ningún programa que tenga abierto algún archivo o directorio del USB.
Forzando el desmontaje sólo he conseguido que se me corrompa el sistema de archivos, por que el reproductor se vuelve loco: se apaga a mitad de la reproducción, o directamente no se enciende.
Hoy vamos a solucionarlo. Tengo el USB metido y se niega a desmontarse. Muy bien, vamos a ver.
Empezamos por lo típico, fuser, que identifica procesos que están usando ficheros y sockets. El USB está montado en /dev/sda1:
Buscando un poco por la web encuentro una referencia al comando lsof. Parece ser que lista los ficheros abiertos, con un conveniente grep se pueden localizar los ficheros abiertos de mi USB. Probemos:
Joder, ¿eso de famd que puñetas es? Pues parece responder al nombre de File Alteration Monitor, y la d es daemon, claro. Así que debe ser un proceso que monitoriza cambios en los ficheros, y se ha debido de empeñar en monitorizar la unidad que quiero desmontar. Muy bien, pues quizá deba pensar en eliminar es proceso... antes habrá que informarse de a quién quiero eliminar, no sea que sea imprescindible o muy necesario. A golpe de Google, encuentro un artículo en el Wiki del LUGFI sobre problemas con mount en el que se comenta:
Bien a gusto me he quedado después de arreglar uno de esos comportamientos que no se entienden, que parecen aleatorios y que sólo dan mala imagen, recordando lejánamente a los absurdos comportamientos que tiene Windows, sólo que en éste caso el problema es identificable y solucionable.
Actualización: Días después he tenido el mismo problema, borré un directorio de mi unidad USB y se negaba a desmontar. Tirando de lsof encuentro:
Comentando el asunto en los servidores Debian de IRC en el canal #debian-es me apuntan que mi problema tiene un bug oficial abierto:
Debian Bug report logs - #252571 konqueror doesn't end process, so CD won't unmount
Ahí se explica el problema y se proponen algunas soluciones, que básicamente se reducen a limitar el número de instancias de Konqueror precargadas a cero (con lo cuál se incrementa bastante el tiempo de carga de Konqueror) o localizar la instancia oculta de Konqueror y matarla. En el canal #debian un tipo me comentaba que él había hecho un script que localizaba y mataba los procesos que tenían ficheros abiertos en su unidad USB y lo llamaba mediante una opción del menu contextual del icono de su unidad USB. Ésta solución, aunque es un parche mientras se arregla el bug, parece buena y además es limpia en el sentido de que no hay que tirar de consola, no da mala imagen (no queda nada bonito tener que soltar unos comandos para poder sacar la unidad USB, aquellos que lo vean pensarán que Linux es un infierno de comandos para todo) y lo pueden usar hasta los usuarios más desconocedores del sistema (puesto que se realiza a golpe de clic).
Forzando el desmontaje sólo he conseguido que se me corrompa el sistema de archivos, por que el reproductor se vuelve loco: se apaga a mitad de la reproducción, o directamente no se enciende.
Hoy vamos a solucionarlo. Tengo el USB metido y se niega a desmontarse. Muy bien, vamos a ver.
Empezamos por lo típico, fuser, que identifica procesos que están usando ficheros y sockets. El USB está montado en /dev/sda1:
# fuser /dev/sda1Nada, no responde nada.
Buscando un poco por la web encuentro una referencia al comando lsof. Parece ser que lista los ficheros abiertos, con un conveniente grep se pueden localizar los ficheros abiertos de mi USB. Probemos:
# lsof | grep USBLos ****** son el nombre usuario que he ocultado.
famd 1657 ****** 100r DIR 8,1 16384 14 /mnt/USBDrive/Sonic Youth EP
Joder, ¿eso de famd que puñetas es? Pues parece responder al nombre de File Alteration Monitor, y la d es daemon, claro. Así que debe ser un proceso que monitoriza cambios en los ficheros, y se ha debido de empeñar en monitorizar la unidad que quiero desmontar. Muy bien, pues quizá deba pensar en eliminar es proceso... antes habrá que informarse de a quién quiero eliminar, no sea que sea imprescindible o muy necesario. A golpe de Google, encuentro un artículo en el Wiki del LUGFI sobre problemas con mount en el que se comenta:
Problema: el Nautilus no me desmonta los dispositivos, y tengo que cerrar el X y desmontar desde consola.Vaya, no me lo podían haber dejado más claro. Me cargo del servicio del apmd mediante:
Solución: desde Gnome 2.4 y continúa en 2.6 se agregó un daemon llamado FAM (File Alteration Monitor) que básicamente lo que hace es avisar a cualquier aplicación que se lo requiera de cuando ocurre un cambio en el sistema de archivos para que la aplicación pueda mostrar el cambio al instante. Una forma de probarlo en abrir el Nautilus en un directorio y desde una consola crear o borrar un archivo, verás como al instante el cambio se refleja en el Nautilus por arte de magia.
El problema (y es un bug documentado y sin solución hasta el momento) es que cuando montás un dispositivo, el FAM se queda leyendo el directorio todo el tiempo (/mnt/cdrom en el caso del CD) entonces cuando lo querés desmontar el kernel no te deja porque alguien (el FAM) está utilizando el dispositivo.
Lo que podés hacer es matar el demonio y todo se soluciona. Si borrás el script de /etc/rc2.d mejor aún, así no arranca más.
# /etc/init.d/fam stopAhora desmonta mi USB perfectamente. Asunto arreglado. Tendré que ocuparme de los scripts de inicio para que no se lance de nuevo el apmd al arrancar el sistema. Aunque... ¿si uso KDE que hace ese demonio de Gnome ejecutandose? ¿Será por tener ambos instalados? Lo suyo sería que cada uno arrancase sus servicios cuando se inicien, para así no tener servicios inncesearios (y jodones como en éste caso), ¿no?. Esto habría que revisarlo.
Stopping file alteration monitor: FAM.
Bien a gusto me he quedado después de arreglar uno de esos comportamientos que no se entienden, que parecen aleatorios y que sólo dan mala imagen, recordando lejánamente a los absurdos comportamientos que tiene Windows, sólo que en éste caso el problema es identificable y solucionable.
Actualización: Días después he tenido el mismo problema, borré un directorio de mi unidad USB y se negaba a desmontar. Tirando de lsof encuentro:
$ lsof | grep USBVaya, kdeinit, suena mal, ¿voy a tener que matar todo el KDE? Mirando el árbol de procesos veo que el PID (segunda columna) corresponde a Konqueror. Sin embargo no tengo ninguna ventana de Konqueror abierta. Pensando pensando, llego a la conclusión de que KDE precarga Konqueror, de manera que figura como lanzado por kdeinit y permanece en memoria aunque se cierren todas las ventanas. Como debe de tener alguna funcionalidad de monitorización de archivos, queda abierta la unidad USB, de manera que no me deja desmontarla. Muerto el perro, se acabó la rabia, así que elimino el proceso Konqueror y ya puedo desmontar con tranquilidad.
kdeinit 2522 **** 145r DIR 8,1 16384 23 /mnt/USBDrive/barry adamson - the king of nothing hill (deleted)
Comentando el asunto en los servidores Debian de IRC en el canal #debian-es me apuntan que mi problema tiene un bug oficial abierto:
Debian Bug report logs - #252571 konqueror doesn't end process, so CD won't unmount
Ahí se explica el problema y se proponen algunas soluciones, que básicamente se reducen a limitar el número de instancias de Konqueror precargadas a cero (con lo cuál se incrementa bastante el tiempo de carga de Konqueror) o localizar la instancia oculta de Konqueror y matarla. En el canal #debian un tipo me comentaba que él había hecho un script que localizaba y mataba los procesos que tenían ficheros abiertos en su unidad USB y lo llamaba mediante una opción del menu contextual del icono de su unidad USB. Ésta solución, aunque es un parche mientras se arregla el bug, parece buena y además es limpia en el sentido de que no hay que tirar de consola, no da mala imagen (no queda nada bonito tener que soltar unos comandos para poder sacar la unidad USB, aquellos que lo vean pensarán que Linux es un infierno de comandos para todo) y lo pueden usar hasta los usuarios más desconocedores del sistema (puesto que se realiza a golpe de clic).