martes, mayo 24, 2005

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:
# fuser /dev/sda1
Nada, 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 USB
famd 1657 ****** 100r DIR 8,1 16384 14 /mnt/USBDrive/Sonic Youth EP
Los ****** son el nombre usuario que he ocultado.
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.

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.
Vaya, no me lo podían haber dejado más claro. Me cargo del servicio del apmd mediante:
# /etc/init.d/fam stop
Stopping file alteration monitor: FAM.
Ahora 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.

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 USB
kdeinit 2522 **** 145r DIR 8,1 16384 23 /mnt/USBDrive/barry adamson - the king of nothing hill (deleted)
Vaya, 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.

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).

sábado, mayo 21, 2005

D-Link DWL-G122, red wireless USB y ndisWrapper II

Compilado mi nuevo y flamante kernel, estoy en disposición de seguir adelante con mi red inalámbrica.

Ejecuto make distclean, make y make install sobre las fuentes de ndiswrapper y esta vez compila sin problemas.

El siguiente paso es instalar el controlador para Windows de mi tarjeta de red inalámbrica.
# ndiswrapper -i netrtusb.inf
Puede comprobarse que controladores hay instalados y que hardware está presente mediante el comando:
# ndiswrapper -l
Installed ndis drivers:
netrtusb driver present, hardware present
En mi caso figura el controlador como presente por que lo tengo instalado.

Veamos que redes están a disponibles:
# iwlist wlan0 scan
Warning: Driver for device wlan0 recommend version 18 of Wireless Extension,
but has been compiled with version 16, therefore some driver features
may not be available...

wlan0 Scan completed :
Cell 01 - Address: 00:A0:C5:C2:11:52
ESSID:"Wireless"
Protocol:IEEE 802.11b
Mode:Managed
Frequency:2.412 GHz (Channel 1)
Quality:0/100 Signal level:-63 dBm Noise level:-256 dBm
Encryption key:off
Bit Rate:1 Mb/s
Bit Rate:2 Mb/s
Bit Rate:5.5 Mb/s
Bit Rate:11 Mb/s
Bit Rate:6 Mb/s
Bit Rate:9 Mb/s
Bit Rate:12 Mb/s
Bit Rate:18 Mb/s
Bit Rate:24 Mb/s
Bit Rate:36 Mb/s
Bit Rate:48 Mb/s
Bit Rate:54 Mb/s
Extra:bcn_int=200
Extra:atim=0
Cell 02 - Address: 00:0F:3D:B2:3F:54
ESSID:"G604T_WIRELESS"
Protocol:IEEE 802.11b
Mode:Managed
Frequency:2.437 GHz (Channel 6)
Quality:0/100 Signal level:-39 dBm Noise level:-256 dBm
Encryption key:off
Bit Rate:1 Mb/s
Bit Rate:2 Mb/s
Bit Rate:5.5 Mb/s
Bit Rate:11 Mb/s
Bit Rate:6 Mb/s
Bit Rate:9 Mb/s
Bit Rate:12 Mb/s
Bit Rate:18 Mb/s
Bit Rate:24 Mb/s
Bit Rate:36 Mb/s
Bit Rate:48 Mb/s
Bit Rate:54 Mb/s
Extra:bcn_int=200
Extra:atim=0
Mmm... dos redes a tiro. La G604T_WIRELESS es la mía por que es mi modelo de router, la otra es la red del vecino que también me vino para algunas cosillas mientras me traian mi ADSL.

Nos conectamos a mi red:
# iwconfig wlan0 essid "G604T_WIRELESS"
Ahora se necesita una dirección IP. EL router viene configurado con DCHP, así que por el momento lo voy a dejar así. Para ello uso dhclient, que si bienno me lo he estudiado si sé que me servirá para obtener una dirección IP.
# dhclient
Internet Software Consortium DHCP Client 2.0pl5
Copyright 1995, 1996, 1997, 1998, 1999 The Internet Software Consortium.
All rights reserved.

Please contribute if you find this software useful.
For info, please visit http://www.isc.org/dhcp-contrib.html

sit0: unknown hardware address type 776
sit0: unknown hardware address type 776
Listening on LPF/wlan0/00:11:95:d0:38:ec
Sending on LPF/wlan0/00:11:95:d0:38:ec
Listening on LPF/sit0/
Sending on LPF/sit0/
Listening on LPF/dummy0/1a:60:19:07:1a:f0
Sending on LPF/dummy0/1a:60:19:07:1a:f0
Listening on LPF/lo/
Sending on LPF/lo/
Listening on LPF/eth0/00:0d:61:36:fb:25
Sending on LPF/eth0/00:0d:61:36:fb:25
Sending on Socket/fallback/fallback-net
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 4
DHCPDISCOVER on sit0 to 255.255.255.255 port 67 interval 6
DHCPDISCOVER on dummy0 to 255.255.255.255 port 67 interval 4
DHCPDISCOVER on lo to 255.255.255.255 port 67 interval 6
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4
receive_packet failed on wlan0: Network is down
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 8
DHCPDISCOVER on dummy0 to 255.255.255.255 port 67 interval 10
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 11
DHCPDISCOVER on sit0 to 255.255.255.255 port 67 interval 10
DHCPDISCOVER on lo to 255.255.255.255 port 67 interval 13
DHCPOFFER from 192.168.1.1
DHCPOFFER from 192.168.1.1
DHCPOFFER already seen.
DHCPREQUEST on wlan0 to 255.255.255.255 port 67
DHCPACK from 192.168.1.1
/usr/sbin/postconf: fatal: open /etc/postfix/main.cf: No such file or directory
cp: `/etc/resolv.conf' and `/etc/resolv.conf' are the same file
run-parts: /etc/resolvconf/update-libc.d/postfix exited with return code 1
run-parts: /etc/resolvconf/update.d/libc exited with return code 1
bound to 192.168.1.3 -- renewal in 1800 seconds.

Es probable que haya una manera más sencilla, más que nada que no busque en todos los interfaces de red sino sólo en el wlan0. Mirando la ayuda de dhclient.conf no parece tan sencillo, y además comenta que muchas veces bastará con crear un dhclient.conf vacío y punto. Vale, pues punto pelota, así se queda.

También veo que postfix se queja. Bueno, en realidad sus restos por que postfix lo desintalé hace tiempo, así que se ha debido de quedar algo pillado. Una cosa para revisar.

Haciendo ping a Google el amigo de los niños veo que tengo red....¡olé!. Bien, no ha sido difícil. Más adelante a ver si miro el asunto de la protección de la red, por el momento la dejo abierta, además, puede ser de lo más divertido si algún vecino incauto se me conecta... :-P

MiKernel.v 5 a MiKernel.v6 (Soporte Wireless)

He creado dos nuevos kernels, el v6 y v6b. El primero con pilas de 4K y el segundo con pilas de 8K.
El primero me dió problemas, tantos que lo deseché y usé el v6b. Sospecho que qizá fue culpa mía, ya que intenté compilar el módulo de nVidia sin haber instalado las fuentes del correspondiente kernel. Pensaba que al no haber cambiado la versión del kernel (aunque si la configuración del mismo) no hacía falta instalar las fuentes pero éstas deben de cambiar en función dela configuración. Imagino que será debido a las variables de compilación y código condicional, pero el caso es que parece ser necesario instalar tanto la imagen y las cabeceras del kernel como las fuentes, aunque sea la misma versión del kernel.

Por el momento tiraré con las pilas de 8K, más adelante quizá vuelva a probar con las pilas de 4K, si es que mi controlador de windows de la tarjeta inalámbrica lo soporta.

lunes, mayo 16, 2005

Traducción al estilo Babylon

Siempre me gustó el Babylon: rápido, sencillo, muy muy cómodo, y aparentemente con bastante calidad. Pero en mi renovada condición de linuxero de pro no hay cabida para programas propietarios de pago, ni por supuesto para versiones crackedas.

La solución en el mundo el software libre es wordtrans. Es un interfaz para varios diccionarios, servidores dict y diccionarios Babylon. Dispone de versiones para X (QT), KDE y consulta mediante navegador web.

Para usarlo lo primero es instalar wordtrans:
apt-get install wordtrans kde-wordtrans
kde-wordtrans es el paquete con la versión específica para KDE, por lo que apt instalará el resto de paquetes base requeridos para que funcione wordtrans.

Ahora se necesitan los diccionarios. Una opción es usar servidores dict. Estos servidores dan un servicio de diccionario; dada una palabra responden con una definición, o, en su caso, con una traducción. sin embargo, he sido incapaz de hallar un servidor dict inglés-español, aunque si un diccionario de definiciones en inglés que parece que etá bastante bien. Para acceder los diccionarios dict es necesario el paquete dict que contiene el programa cliente:
apt-get install dict
¿Fácil, no?.

Sin embargo, seguimos sin tener traducción de español a inglés. Podemos usar i2e, paquete que contiene un diccionario inglés-español (y viceversa) y consultarlo mediante kwordtrans. Para ello basta con instalar elpaquete i2e, abrir kwordtrans, pulsar en Dictionaries > New y seleccionar 'plain text'. En la siguiente ventana se configura el diccionario. En mi caso kwordtrans es bastante listo y ha puesto la configuración básica de i2e, que no es más indicar ':' como separador y apuntar al fichero de texto que contiene el diciconario, que en mi Debian está en /usr/share/i2e/i2e.dict. El cuadro de texto llamado 'Personal' es el archivo dónde se guardarán palabras extras añadidas por el usuario.

Otra opción es usar los archivo de diccionario de Babylon. La manera es muiy similar. Primero se obtiene el archivo diccionaro que queramos (.dic). Temo no estar seguro de como obtuve el mío, pero si no recuerdo mal lo descargué de la web de Babylon. Después se indica a kwordtrans, de la manera anterior, que disponemos de un nuevo diccinario, especificando que es de tipo Babylon. En la ventana de configruación del diccionario se le indica el archivo .dic obtenido y listo.

Por cierto, para pasar el archivo de Babylon a otra persona, es necesario enviarle 3 archivos: english2.dic, english.dic y EngtoSpa.dic.

Una vez ejecutandose, kwordtrans puede espiar el portapapeles y traducir cualquier palabra (o primera palabra de un texto) que llegue al portapapeles. Se puede observar su funcionamiento en la siguiente imagen:


Image Hosted by  ImageShack.us


La pega, y no es baladí, es que si dejas activo el espionaje del portapapeles la ventana amarilla del kwordtrans salta siempre que copies texto al portapapeles, lo cuál puede ser algo incómodo. Se se deja desactivado, hay que activarlo cuándo se esté uno documentando y quiera la traducción a mano, o abrir directamente la ventanana del programa e introducir la palabra a consultar. Pero se pierde la ultracomodidad del Babylon de seleccionar una palabra, pulsar un rápida combinación de teclas y obtener el resutlado, todo en menos de un segundo.

Dado que kwordtrans soporta dcop intenté currarme, mediante las teclas globales de acceso rápido de KDE (KHotKeys) la funcionalidad que buscaba. Desgraciadamente el servicio dcop deja de responder cuando se usa kwordtrans. Decidido a seguir adelante me puse en contacto con su autor y él me respondió que el soporte para dcop fue programado para KDE 2, razón por la cuál no funciona, y que ahora está falto de documentación para KDE 3, por lo que por el momento la cosa está un poco difícil.

Bueno, lo usaré acitvando el espionaje del portapapeles cuando vaya a usarlo intensivamente y más adelanta, si arrgeglan el problema con dcop, intentaré configurar las KHotKeys para que funcione a golpe de ratón ( y tecla).

Aunque si le echase valentía y horas podría echar un vistazo a eso de programar interaces dcop...

Por cierto, la mayor parte de la información está obtenida del artículo de Bulma 'Wordtrans: un Babylon para Linux'.

viernes, mayo 13, 2005

Ficheros .Desktop en KDE - Menús contextuales y demás

Cuando ya pensaba que iba a tener que aprender a usar los ficheros .desktop por ciencia infusa e iluminación binaria, acabé por descubrir éste bonito tutorial para crear Service Menus en Konqueror (pues ese es el nombre que reciben estas cosas, Service Menus).

Básicamente es como había comentado anterioremente. Los directorios dónde guiardarlos pueden ser:
/opt/kde3/share/apps/konqueror/servicemenus/
/usr/share/apps/konqueror/servicemenus/
/home/aaron/.kde3/share/apps/konqueror/servicemenus/
Respecto a los mymetypes, se comenta lo siguiente:
Para crear service menus para directorios usar inode/directory.
Para crear service menus para todos los ficheros usar all/all.
Para crear service menus para todos los ficheros pero no para directorios usar all/allfiles.
Para crear service menus para toda una categoria, por ejemplo imágenes, usar image/* (Apartir de KDE 3.2).
Por último, para crear submenús, se usa X-KDE-Submenu. Éste es el ejemplo que del tutorial (service menu para poner una imagen como fondo de pantalla):
[Desktop Entry]
ServiceTypes=image/*
Actions=setAsWallpaper;tileAsWallpaper
X-KDE-Submenu=Use As Wallpaper

[Desktop Action setAsWallpaper]
Name=Scaled
Icon=background
Exec=dcop kdesktop KBackgroundIface setWallpaper %U 6

[Desktop Action tileAsWallpaper]
Name=Tiled
Icon=background
Exec=dcop kdesktop KBackgroundIface setWallpaper %U 2
Como puede verse, es sencillito, basta con usar dicha claúsula dandole el nombre del submenú.

Lo que es muy intersante es la línea de ejecución de éste service menu, ya usa dcop. Dcop es un sistema de KDE para que los programas interaccionen entre sí, también accesible por el usuario. Basicamente los porgramas exportan una interfaz que es accesible tanto desde otros programas como desde la línea de comandos.

Dcop merce un envío a parte.

viernes, mayo 06, 2005

D-Link DWL-G122, red wireless USB y ndisWrapper

Nueva sorpresa, el router inalámbrico D-Link G604T viene con un adaptador de red wireless USB (D-Link DWL-G122). Vemos a ver si funciona con Linux.

En Debian.org comentan la existencia de NdisWrapper. La descripción del programa es la siguiente:
User space tools for ndiswrapper. Some wireless network cards don't have native Linux drivers. NdisWrapper allows you to use such cards by loading Windows drivers and emulating NDIS (Windows network driver) API.
Es decir, que aprovecha los controladores escritos para Windows, emulando la interfaz NDIS (interfaz de programación de dispositvos de red) que ese sistema operativo implementa. Lamentablemente, como comentan en su página de preguntas frecuentas, mediante este sistema sólo se puede ofrecer una funcionalidad limitada, sin incluir, por ejemplo, los modos monitor o promiscuo. Es debido a que muchas de estas funciones las realiza el controlador sin usar NDIS mediante comandos propios no documentados.

Como eso último no me ha gustado, investigo algo más. Como comenta un maquero en Macuario.com, mi modelo de adaptador lleva en su interior un chip de Ralink del cúal existe un controlador (entre otras cosas gracias a Ralink). Esa página enlaza con el proyecto de código abierto los chipset 2400 y 2500 de Ralink. Desafortunadamente pone bien claro en la página de descargas que no se soportan los dispositivos USB.

Se comenta por el foro que estaría bien que soportase USB, pero parece que la cosa va a tardar, están rescriendo el código y centrados en otras cosas. Dado que no estoy yo muy puesto en programación de controladores para linux y ni en el manejo del USB, no me veo haciendolo yo.

Volvemos a NdisWrapper; apt-get install ndiswrapper me descarga e instala la versión 1.1.4. Extraigo el tar.bz en /usr/src/modules para compilarlo. Siguiendo las instrucciones del wiki de instalación hago un make distclean, make y... ¡mierda!
*** WARNING: Kernel is compiled with 4K stack size option (CONFIG_4KSTACKS); many Windows drivers will notwork with this option enabled. Disable CONFIG_4KSTACKS option, recompile and install kernel
Recuerdo esa jodida opción. ¿Por qué puñetas la puse? Se comenta por los foros que puede funcionar con pilas de 4K. Pues yo me la juego.

Pues eso no es todo. compilando también obtengo el siguiente aviso:
*** Warning: "wireless_send_event" [/usr/src/modules/ndiswrapper/ndiswrapper.ko] undefined!
No hay suerte hoy. Consultada la página de preguntas frecuentes, se comenta que se debe a que no tengo activada la opción de Wireless LAN en el kernel. ¡Agghhh! ¿No querías ir construyendo tu kernel poco a poco? Pues toma, dos tazas.

¿Lo compilo con pilas de 4 u 8 kilobyes?

Ya se verá, por el momento a dormir, que ya toca.