02 febrero 2009

Compilación de módulos de Linux como externos

Puede ocurrir que a nuestro Linux le falte algún módulo que si esté integrado con el núcleo a nivel de código fuente, pero que nuestra distribución no lo incluya compilado. Es el caso del Linux de Debian para la NSLU2; no incluye los módulos del subsistema de infrarrojos IrDA.

Una solución es compilar todo el núcleo a nuestro gusto. Pero también podemos compilar únicamente los módulos extras que necesitemos. En Debian y con el subsistema IrDA podríamos hacerlo de la siguiente manera:

Partimos del sistema con Debian instalado y los paquetes necesarios para realizar una compilación, como gcc, make y compañía. Utilizamos como shell bash. Entonces, lo 1º que hacemos es instalar las fuentes de linux, en este caso linux-source-2.6.18 y extraer su contenido a un directorio de trabajo:
$ su
# apt-get install linux-source-2.6.18
# exit
$ mkdir src
$ cd src
$ tar jxvf /usr/src/linux-source-2.6.18.tar.bz2
$ cd linux-source-2.6.18/

Al árbol de Linux recién extraído le damos la configuración de nuestro sistema y añadimos la de los módulos adicionales que queremos incluir, en este caso los de IrDA. Estos están dentro de la opción 'Networking'. Todo lo que necesitemos lo activamos dejándolo con la marca 'M' o '*' según proceda. También guardamos en la variable de entorno CONFIG_PATH el path del fichero de configuración resultante.
$ cp /boot/config-`uname -r` .config
$ make menuconfig
$ export CONFIG_PATH=$PWD

Creamos el siguiente Makefile y lo grabamos con nombre Makefile.alt:
include $(CONFIG_PATH)/.config
include ./Makefile
export

KVERSION = $(shell uname -r)

all:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules

install:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) \
    modules_install

clean:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
¡Ojo! el espaciado previo a cada make en ese fichero debe ser un tabulador, como en todo Makefile.

Entonces copiamos el Makefile.alt al directorio del módulo a compilar y lanzamos la compilación. Por último instalamos los módulos compilados. Solo se compilarán e instalarán los módulos que hayamos marcado con el make menuconfig:
$ cp Makefile.alt net/irda/
$ cd net/irda/
$ make -f Makefile.alt
$ su
# make -f Makefile.alt install
# exit

Y eso es todo. El último paso lo podemos repetir en tantos subdirectorios como sea necesario. Por ejemplo, para tener los drivers específicos de los dispositivos de infrarrojos deberíamos lanzar el make también en drivers/net/irda.

No he encontrado un método más ortodoxo para hacer esto. Al menos de esta manera se utilizan los Makefile y configuración propios de nuestro núcleo, con lo que nos aseguramos de que los resultados sean coherentes. También es un método bastante sencillo que no requiere tocar ningún fichero del los fuentes de Linux. Espero resulte útil.

09 enero 2009

El puerto de infrarrojos no funciona en Ubuntu 8.10

El puerto de infrarrojos ha dejado de funcionar en mi portátil Thinkpad Z60m desde que actualicé a Ubuntu 8.10 "Intrepid Ibex". Intenté configurarlo también en el X30, pero nada. Resulta que el problema es un 'bug' en el 'kernel' o núcleo de 'Intrepid': el 2.6.27. Si se arranca con los núcleos de la 8.04 (la serie 2.6.24), funciona bien. La siguiente versión del núcleo, la 2.6.28, también arregla el problema. De modo que la solución es instalarse ese nuevo núcleo, arrancar con las versiones anteriores o esperar que se aplique ese parche al núcleo de 'Intrepid Ibex'.

Una vez que se tiene ese problema solucionado, hacer funcionar el puerto de infrarrojos en un Thinkpad es solo cuestión de instalar el paquete 'irda-utils'. Si se quiere entrar un poco más en las tripas, estos dos enlaces son muy útiles:

07 enero 2009

Sincronización y copia de seguridad con Unison

Si se trabaja con dos ordenadores o más, el tema de 'que archivo está donde' es un verdadero lío. Para resolver este problema está muy bien la herramienta de sincronización Unison. Permite mantener dos copias de la misma colección de archivos y directorios y replicar entre las dos los cambios que se hagan en cualquiera de ellas.

Entonces, con dos ordenadores la idea es:
  1. Tener un tercer espacio de almacenamiento accesible para ambas máquinas. Un servidor de discos, tipo NFS o samba, o un simple disco USB, valen. Lo llamaremos unidad de sincronización.

  2. Instalar Unison en las dos máquinas con las que trabajamos.

  3. Configurar Unison en la primera de modo que se replique nuestro conjunto de ficheros de trabajo a la unidad de sincronización.

  4. Ejecutar Unison para que se realice la réplica. Si tenemos muchos datos, las primeras réplicas son largas. Pero las siguientes, por ser un proceso incremental, van mucho más rápidas.

  5. Configurar Unison en la segunda máquina. Lo normal es que en esta segunda máquina tengamos un entorno de trabajo muy parecido a la primera, y la misma forma de acceder a la unidad de sincronización; así que esta configuración será igual a la realizada en la primera máquina.

  6. Ejecutar Unison para sincronizar el conjunto de trabajo de la segunda máquina con lo replicado por la primera a la unidad de sincronización.

  7. Si la segunda máquina ha añadido modificaciones a la unidad de sincronización, habría que volver a sincronizar la primera máquina con dicha unidad.
Ya está, tenemos las dos máquinas con el mismo conjunto de archivos y directorios. A partir de este punto solo nos queda ser un poco disciplinados y lanzar Unison al principio y al final de cada sesión de trabajo. Así siempre tendremos lo mismo no importa que ordenador usemos.

Además, la replicación nos da mayor seguridad pues en realidad tenemos como resultado colateral tres copias de seguridad. Es cierto que el procedimiento descrito no crea un 'backup' incremental y con almacenamiento en lugares separados, como mandan los cánones. Pero si da un grado mayor de protección contra la pérdida de ficheros e información.

En mi caso, los 2 ordenadores con los que trabajo son dos portátiles Thinkpad, un Z60m y un X30. La unidad de sincronización la tengo en un pequeño servidor NSLU2 de LinkSys accesible por red Ethernet o WiFi. Se podría trabajar contra este servidor por NFS, pero a Unsion la afecta bastante la velocidad de acceso a disco. Es más eficaz tener Unsion instalado también en el servidor y que ambas instancias de Unison se comuniquen por ssh. De modo que en la NSLU2 tengo instalado GNU/Debian y los paquetes de unison y openssh-server. No hace falta instalar ni configurar nada más. Solo en los clientes hay que tener los ficheros de configuración de Unison; por ejemplo:

# Preferencias de Unison
auto = true
root = /home/usuario
root = ssh://usuario@nslu2//home/usuario

# Directorios a sincronizar
path = trabajo/codigo
path = trabajo/documentos
path = varios
path = .evolution
path = .bash_profile
path = .bashrc
path = .emacs
path = .emacs-places
path = .xemacs
path = .xemacs-options
path = .java
path = .java.policy

# A ignorar
ignore = Path .java/deployment/cache/*
ignore = Path .evolution/mail/imap/*
ignore = Name {_java*.O}
ignore = Name {.metadata}
ignore = Name {_obj}

# Log
logfile = /home/usuario/.unison/sync.log

Este fichero se guardaría en ~/.unison/nslu2.prf y para lanzar la réplica solo habría que ejecutar:

$ unison-gtk nslu2

Por supuesto, en el manual de Unison se puede encontrar más ayuda.

15 diciembre 2008

NSLU2 como Proxy ARP

Si se quiere compartir una conexión a internet, no hay nada mejor que hacerlo por WiFi. En mi caso, mi vecino tenía un D-Link modelo DI-624, así que lo más fácil era poner mi Linksys WRT54GS en modo cliente y configurarlo para conectarse al otro router. Problema: el WRT54GS y el DI-624 no se llevaban bien trabajando con WPA. Sin encriptación o con WEP la cosa funcionaba, pero con WAP nada. Así que opté por hacer el enlace con la NSLU2. Como se ve en mi anterior artículo en la NSLU2 funciona bien un D-Link DWL-G122. Así que la conexión entre la NSLU2 y el DI-624 fue bien a la primera. El siguiente problema era hacer que la NSLU2 encaminara el tráfico de mis PCs hacia el DI-624 y de ahí a Internet.

Tenía por un lado la red inalámbrica entre la NSLU2 y el DI-624, y por otro la red ethernet entre la NSLU2 y mi WRT54GS (y de este al resto de PCs). Podría haber hecho que las dos redes se comportaran como una sola por debajo del nivel IP (lo que hubiera sido hacer de la NSLU2 un 'bridge'), pero me parecía más natural que las dos redes, la cableada y la inalámbrica, estuvieran diferenciadas a nivel IP. Fácil entonces, solo tenía que segmentar las direcciones C del rango 192.168.0.0 en dos, usando la máscara 255.255.255.128 y asignando a cada interfaz de red de la NSLU2 una dirección de esos segmentos. Con activar el reenvío de paquetes IP (forwarding) ya estaría todo. Es decir, teniendo el DI-624 la dirección interna 192.168.0.1, la configuración de los otros dos elementos quedaba así:

En la NSLU2, fichero /etc/network/interfaces:
allow-hotplug eth0
iface eth0 inet static
  address 192.168.0.177
  netmask 255.255.255.128

allow-hotplug wlan0
iface wlan0 inet static
  pre-up ifconfig wlan0 up
  pre-up iwconfig wlan0 essid "********"
  pre-up iwconfig wlan0 mode Managed
  pre-up iwpriv wlan0 set AuthMode=WPAPSK
  pre-up iwpriv wlan0 set EncrypType=AES
  pre-up iwpriv wlan0 set WPAPSK="********"
  pre-up iwpriv wlan0 set SSID="********"
  address 192.168.0.77
  netmask 255.255.255.128
  gateway 192.168.0.1

En la NSLU2, fichero /etc/sysctl.conf:
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.conf.default.forwarding=1

En el WRT54GS:
IP Addrs: 192.168.0.129
Mascara: 255.255.255.128
GW: 192.168.0.177
DNS: 192.168.0.1
DHCP: 192.169.0.200/250

Pero el DI-624 no admitía rutas estáticas; o al menos yo no ví como hacerle el equivalente a un 'route add', para que así reenviara a la NSLU2 los paquetes correspondientes al segmento ethernet. Solución: hacer que la NSLU2 fuera un Proxy ARP. De esta manera el DI-624 ve a la NSLU2 como destinataria de los paquetes correspondientes a la red ethernet y la NSLU2 los reenvía a sus destinatarios finales. Más información aquí.

La forma de activar la NSLU2 como Proxy ARP es también modificando el /etc/sysctl.conf:
# Proxy arp
net.ipv4.conf.default.proxy_arp=1

09 diciembre 2008

Saturación de un router con DD-WRT por P2P

Después de dar algo más de trabajo a mi NSLU2 con rtorrent, empecé a observar que la conexión a internet no iba bien. Si, los torrents más o menos se bajaban, pero la navegación web desde otros PCs era lentísima. Parecía que era una simple cuestión de ancho de banda, pero limitar las bajadas/subidas en rtorrent no cambiaba la situación.

El síntoma definitivo fue comprobar que el propio router, un WRT54GS con DD-WRT, quedaba muerto. Las conexiones al mismo con el navegador para administrarlo se eternizaban. Resetearlo lo dejaba como nuevo, pero tras unas horas de funcionamiento del rtorrent, todo volvía a languidecer. Así que el problema no venía del ISP ni estaba en la conexión a Internet. Estaba en el router. No cerraba las conexiones IP antiguas, no dejaba espacio para nuevas conexiones y entraba en agonía.

El problema y la solución se explican muy bien en las FAQ de µTorrent. Puesto que yo tengo instalada la versión DD-WRT v23 SP2, solo tuve que alterar un poco la configuración. En 'Web-Admin -> Administration -> Management -> IP Filter Settings' puse los valores recomendados:
Maximum Ports: 4096
TCP Timeout (s): 300
UDP Timeout (s): 300

Grabar, rearrancar el router, y a correr. Ahora va como la seda.

De todos modos, investigando este asunto he visto otros firmwares interesantes. Quizás pruebe un día de estos Tomato.

29 enero 2008

Una definición de inteligencia

Un problema en el campo de la inteligencia artificial es la dificultad de definir el propio termino inteligencia. Con este artículo quiero aportar mi granito de arena en clarificar este tema (u oscurecerlo, nunca se sabe):

Inteligencia: es la capacidad de generar nueva información coherente con información previamente asimilada o generada.

Los términos clave en esta definición son información, nueva y coherente:
  • Por información entendemos, no solo datos simples y puros, sino también reglas, normas y leyes que rigen dichos datos, que su vez pueden estar sometidas a principios o meta-reglas, y así sucesivamente.
  • Por nueva queremos decir desconocida para el sujeto (persona, entidad o sistema) capaz de actuar inteligentemente. Por ejemplo, cuando un maestro propone a sus alumnos un problema de matemáticas, la solución del mismo es nueva o desconocida para los estudiantes, pero no para el profesor.
  • Por último, para que haya inteligencia, la información generada tiene que ser coherente o consistente con la información base (formada por datos, reglas y meta-reglas). En realidad, se suele atribuir más o menos inteligencia al resultado del razonar humano según este criterio. Así una solución a un problema que en realidad no resuelva nada se considera una estupidez: no es coherente con el propio problema. Si la solución resuelve el problema, pero requiere mucho tiempo o energías, se considera poco inteligente. Si la solución es correcta y además eficaz y efectiva, consumiendo poco tiempo y recursos, entonces es una solución inteligente: es coherente con el problema y con la ley del mínimo esfuerzo, por ejemplo. A mayor coherencia con el campo de información base, mayor inteligencia se puede atribuir al proceso generador.
Y podemos ver que esta definición describe bien el elemento inteligente de la actividad humana en diferentes campos del saber.

En primer lugar tenemos los campos puramente creativos, como son los pertenecientes a las artes: música, pintura, escultura o literatura, entre otros. En todos ellos el artista conforma su obra a las leyes de la armonía, la estética y la belleza. Mención especial merece la literatura (para mi, creación en estado puro), donde el escritor crea su obra según las reglas presentes en las mentes de sus lectores para, con el lenguaje, hacerles llegar sensaciones, emociones, sentimientos y pensamientos. Y se considera al artista aun más genial si en su obra da lugar a nuevas normas estéticas (nuevos estilos o corrientes), que difieren de las anteriores, pero que sin duda son coherentes con metanormas de rango superior.

Los ingenieros, informáticos, matemáticos, arquitectos, etc. también crean conjuntos de nueva información, pero esta vez bajo las reglas de su ámbito de actuación, bien sean leyes físicas, oferta disponible de piezas y materia prima, funcionamiento de la máquina lógica subyacente o leyes matemáticas. Y normalmente lo hacen con el objetivo de resolver algún problema concreto o satisfacer cierta necesidad. El proceso de generación de información en estos casos se puede comparar a la construcción física de un edificio: se plantea un objetivo (el edificio terminado), y partiendo de un terreno vacío, se van añadiendo elementos que a su vez permiten la adicción de más elementos hasta tener el edificio terminado.

Lo mismo ocurre con investigadores de todo tipo, desde el científico en su laboratorio, hasta el policía que trata de resolver un crimen, pasando por el médico que trabaja para diagnosticar una enfermedad: deben relacionar los datos que recopilan con su conocimiento para así elaborar teorías (una vez más, nueva información) que expliquen el fenómeno investigado. Es interesante que en estos ámbitos se suele hablar de encontrar soluciones o realizar descubrimientos. Con estas expresiones se da a entender que aunque la información que se busca es desconocida o nueva para el sujeto que realiza la investigación, tiene que estar presente de forma explicita o implícita en el campo de información en el que se trabaja.

Llegados a este punto podemos comprender que en realidad no hay mucha diferencia en como se han ido construyendo las distintas áreas del saber. No difieren mucho en su trabajo un escritor y un matemático o un informático. Todos producen nueva información; varían las reglas y leyes que rigen dicha información.

Notamos también que en realidad el elemento inteligente, la generación de nueva información, está presente en casi cualquier actividad humana. Cuando aprendemos, bien sea en la escuela o por experiencia en la vida cotidiana, no estamos simplemente almacenando datos nuevos en la mente. Establecemos relaciones entre la información adquirida y la que ya conocíamos con anterioridad. Son esas relaciones lo que constituyen el entendimiento de un asunto, es decir, la capacidad para interiorizar la explicación de la información recién aprendida en base a lo ya conocido. Y son esas relaciones entre información adquirida e información preexistente lo que constituyen la nueva información que debe generar todo proceso inteligente. Igualmente, cuando realizamos cualquier tarea, por ejemplo, preparar un plato de cocina siguiendo una receta que conocemos bien, no actuamos sin pensar. Debemos adaptar lo que ya sabemos (la receta) a la realidad en la que nos vemos inmersos ("vaya, nos falta tal ingrediente"). Tenemos que establecer relaciones entre lo que conocemos y lo que nos vamos encontrando. Y una vez más, estas relaciones son nueva información que nos permite calificar de inteligente nuestra forma de actuar.

De modo que, según la definición enunciada y las explicaciones expuestas, la producción de información nueva coherente sería el elemento que nos permitiría identificar un proceso como inteligente. Es como la radiación a las reacciones nucleares. Hay radiación, entonces hay reacciones nucleares. Hay información nueva coherente, entonces hay inteligencia.

Pienso que la definición de inteligencia presentada en este artículo es buena por tres motivos:
  • Es muy sencilla y concreta. Me atrevería a decir que admite una formalización matemática.
  • Aisla el elemento inteligente, aquello que tienen en común los procesos calificados como tales.
  • Encaja con los comportamientos que el sentido común nos dice que son inteligentes.
Un ejercicio interesante para probar la veracidad de estas afirmaciones sería tratar de aplicar dicha definición a las conversaciones, actividades y tareas de la vida cotidiana de uno y de otros. A ver si realmente este artículo es coherente o inteligente ;)

24 diciembre 2007

NSLU2 + DWL-G122 = NAS con Wi-Fi

Partimos de una NSLU2 de Linksys con Debian GNU/Linux 4.0 (alias etch) y de un adaptador USB Wi-Fi DWL-G122 Ver. C1 de D-Link. Para que dicho adaptador funcione con la NSLU2, hay que compilar los drivers oportunos, pues el Linux de la Debian para este cacharro viene sin ellos. La versión C1 del DWL-G122 trae el 'chipset' rt73 de Ralink y los fuentes para los mismos se pueden encontrar en la página del proyecto rt2x00. Ahí proporcionan dos tipos de drivers: 'antiguos pero mejorados' y de 'nueva generación'. Puesto que los de nueva generación están muy ligados a las últimas versiones del núcleo, opté por utilizar los antiguos. Los pasos que dí para compilarlos fueron los que se pueden ver en este foro (primer comentario de Sinclair73). Es decir, desde el Linux de la NSLU2 (previamente hay que tener instalados los paquetes make, gcc & co.) ir ejecutando:

1) Bajar y descomprimir los fuentes del driver:
$ wget http://rt2x00.serialmonkey.com/rt73-cvs-daily.tar.gz
$ tar zxvf rt73-cvs-daily.tar.gz


2) Editar el fichero Module/rtmp_init.c para cambiar el cuerpo de la función RTMPMoveMemory a solo { memcpy(pDest, pSrc, Length); }
$ cd rt73-cvs-AAAAMMDDHH
$ vi Module/rtmp_init.c
// RTMPMoveMemory debe quedar así:
VOID RTMPMoveMemory(
 
OUT PVOID pDest,
  IN PVOID pSrc,
  IN ULONG Length
)
{
 
memcpy(pDest, pSrc, Length);
}

3) Compilar el driver:
$ cd Module
$ make arm

4) Copiar el modulo rt73.ko resultante a un punto adecuado en /lib:
$ su
# mkdir -p /lib/modules/`uname -r`/kernel\
/drivers/net/wireless/rt2x00-legacy/

# cp rt73.ko /lib/modules/`uname -r`/kernel\
/drivers/net/wireless/rt2x00-legacy/


5) Copiar el firmware rt73.bin a /lib/firmware:
# cp rt73.bin /lib/firmware

6) Actualizar las dependencias de módulos:
# depmod

7) Editar el /etc/network/interfaces y dejarlo a nuestro gusto según la red inalámbrica que tengamos, teniendo en cuenta que el alias para la interfaz de red de la DWL-G122 será wlan0. Así que para una red sin encriptación y con asignación de direcciones ip estáticas, la entrada correspondiente en dicho fichero podría ser:
allow-hotplug wlan0
iface wlan0 inet static
 
pre-up ifconfig wlan0 up
  pre-up iwconfig wlan0 mode Managed
  pre-up iwconfig wlan0 essid
"nombredelared"
 
address 192.168.0.188
 
netmask 255.255.255.0
 
gateway 192.168.0.1

Con esto ya podemos poner nuestra NSLU2 en cualquier sitio de la casa. Hay opciones más inmediatas para tener una NAS con conexión inalámbrica, como la Asus WL-HDD 2.5, pero la instalación en estas de cualquier otra versión de GNU/Linux que no sea la de fábrica no está tan 'trabajada' como la de la NSLU2. Y si ya tenemos una NSLU2, pues viene bien esta 'ampliación'.

Notas: en algunas ocasiones he tenido un comportamiento algo inestable, de modo que al arrancar la NSLU2 el enlace no estaba disponible o este sufría caídas intermitentes. La solución siempre era o tirar y levantar el enlace con:
# ifdown wlan0
# ifup wlan0

o, desconectar y volver a conectar físicamente el DWL-G122, si no disponía de una sesión telnet/ssh contra la NSLU2. Puesto que últimamente no he sufrido casi estos inconvenientes, me inclino a pensar que son causados por factores ambientales (¿interferencias de algún tipo?). Seguiré investigando, y si encuentro algo, añadiré comentarios.

Actualización: Aquí se puede encontrar mucha más información sobre como conectar adaptadores WiFi a nuestra NSLU2.