MySQL e IPv6

Ahora que no se puede correr voy a aprovechar para hablar de otro de mis vicios, que no es otro que linux y para ello utilizo unas cuantas Raspberry Pi con sistema operativo Raspbian.

En su momento monté este blog utilizando dos raspberries. En una monté WordPress y en otra la BBDD MySQL. Se puede montar todo en una, pero lo hice para jugar un poco.

Una de las cosas que también me gusta es el tema de IPv6, esa gran revolución que iba a llegar y que se va posponiendo poco a poco. Las dos raspberry tienen dirección de IPv6 y además la dirección IPv6 se forma utilizando la dirección MAC. Estas direcciones IPv6 se llaman de enlace-local y tienen un alcance limitado, sería lo equivalente a las direcciones privadas de IPv4 del tipo 169.254.0.0/16. Son direcciones que se utilizan si no hay DHCP, pero son direcciones que se pueden utilizar.

Por ejemplo, una raspberry tiene la MAC dc:a6:32:1b:40:be y, por lo tanto, su dirección IPv6 es fe80::dea6:32ff:fe1b:40be/64. La otra rasp tiene la MAC b8:27:eb:35:25:f7 y, por lo tanto, la IPv6 es fe80::ba27:ebff:fe35:25f7/64. La gracia de este asunto es que independientemente de la IPv4 que le dé el DHCP ambas se pueden ver.

$ ping -c 4 fe80::ba27:ebff:fe35:25f7
 PING fe80::ba27:ebff:fe35:25f7(fe80::ba27:ebff:fe35:25f7) 56 data bytes
 64 bytes from fe80::ba27:ebff:fe35:25f7%eth0: icmp_seq=1 ttl=64 time=0.558 ms
 64 bytes from fe80::ba27:ebff:fe35:25f7%eth0: icmp_seq=2 ttl=64 time=0.502 ms
 64 bytes from fe80::ba27:ebff:fe35:25f7%eth0: icmp_seq=3 ttl=64 time=0.480 ms
 64 bytes from fe80::ba27:ebff:fe35:25f7%eth0: icmp_seq=4 ttl=64 time=0.478 ms
--- fe80::ba27:ebff:fe35:25f7 ping statistics ---
 4 packets transmitted, 4 received, 0% packet loss, time 94ms
 rtt min/avg/max/mdev = 0.478/0.504/0.558/0.039 ms

Desde la otra también hace ping

$ ping -c 4 fe80::dea6:32ff:fe1b:40be
 PING fe80::dea6:32ff:fe1b:40be(fe80::dea6:32ff:fe1b:40be) 56 data bytes
 64 bytes from fe80::dea6:32ff:fe1b:40be%eth0: icmp_seq=1 ttl=64 time=0.501 ms
 64 bytes from fe80::dea6:32ff:fe1b:40be%eth0: icmp_seq=2 ttl=64 time=0.474 ms
 64 bytes from fe80::dea6:32ff:fe1b:40be%eth0: icmp_seq=3 ttl=64 time=0.485 ms
 64 bytes from fe80::dea6:32ff:fe1b:40be%eth0: icmp_seq=4 ttl=64 time=0.447 ms 
--- fe80::dea6:32ff:fe1b:40be ping statistics ---
 4 packets transmitted, 4 received, 0% packet loss, time 115ms
 rtt min/avg/max/mdev = 0.447/0.476/0.501/0.033 ms

También se puede utilizar la dirección IPv6 para entrar por SSH

$ ssh usuario@fe80::ba27:ebff:fe35:25f7

Linux raspberri_bbdd 4.19.97-v7+ #1294 SMP Thu Jan 30 13:15:58 GMT 2020 armv7l
 The programs included with the Debian GNU/Linux system are free software;
 the exact distribution terms for each program are described in the
 individual files in /usr/share/doc/*/copyright.
 Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
 permitted by applicable law.
 Last login: Sun Mar 15 11:11:05 2020 from fe80::dea6:32ff:fe1b:40be%eth0

Pues bien, se puede hacer ping, se puede entrar por SSH, pero una de las cosas que me estaba fallando era utilizar el cliente MySQL para acceder a la base de datos. Configuré el servidor como dice la documentación y traté de entrar:

mysql -hfe80::ba27:ebff:feff:a84a -uusuario -pcontrasenia bbdd
 ERROR 2002 (HY000): Can't connect to MySQL server on 'fe80::ba27:ebff:feff:a84a' (22)

Comprobé si desde la propia máquina se podía entrar utilizando la dirección de loopback de IPv6 (::1) y vi que funcionaba:

$ mysql -h::1 -uusuario -pcontrasenia bbdd
 Reading table information for completion of table and column names
 You can turn off this feature to get a quicker startup with -A
 Welcome to the MariaDB monitor.  Commands end with ; or \g.
 Your MariaDB connection id is 10310
 Server version: 10.3.22-MariaDB-0+deb10u1 Raspbian 10
 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 MariaDB [bbdd]>

Lo más gracioso es que probando desde un «linux integrado» dentro de Windows 10 ¡sí funcionaba! Eso sí me descolocó del todo. Que funcione en un linux cutre y no funcione en uno de verdad, me chafó del todo. También probé desde la línea de comandos de un Mac y tampoco funcionó.

$ mysql -hfe80::ba27:ebff:fe35:25f7 -uusuario -pcontrasenia bbdd  Reading table information for completion of table and column names  You can turn off this feature to get a quicker startup with -A  Welcome to the MariaDB monitor.  Commands end with ; or \g.  Your MariaDB connection id is 10322  Server version: 10.3.22-MariaDB-0+deb10u1 Raspbian 10  Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.  Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.  
MariaDB [bbdd]>

La verdad es que estuve dando muchas vueltas y me he comido mucho la cabeza hasta que al final he conseguido dar con ello. Todo viene porque en IPv6 hay que especificar la interfaz por donde sale el tráfico para llegar al destino. En mi caso, la interfaz es eth0 y, por lo tanto, hay que añadir el sufijo %eth0 a la dirección IPv6. La cosa quedaría:

$ mysql -hfe80::ba27:ebff:feff:a84a%eth0 -uusuario -pcontrasenia bbdd
 Reading table information for completion of table and column names
 You can turn off this feature to get a quicker startup with -A
 Welcome to the MariaDB monitor.  Commands end with ; or \g.
 Your MariaDB connection id is 112
 Server version: 10.3.22-MariaDB-0+deb10u1 Raspbian 10
 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 MariaDB [bbdd]>

Normalmente este tipo de problemas suele ocurrir por no leer la documentación, pero en este caso no es así porque la documentación es incorrecta. En este enlace habla del asunto y no dice nada de la interfaz:

También se puede desde PHP conectar usando IPv6, que era el motivo principal por el que empecé con todo este asunto. En este caso además de añadir la interfaz hay que meterlo todo entre llaves cuadradas []. La cosa quedaría algo así:

<?php
# Se definen unas variables
define("DATABASE","bbdd");
define("PASSWD","contrasenia");
define("USER","usuario");
define("SERVER",'[fe80::ba27:ebff:fe35:25f7%eth0]');
$mysqli =  mysqli_connect(SERVER, USER, PASSWD, DATABASE);     
if ($mysqli->connect_error) {             
    die('Error de conexión: ' . $mysqli->connect_error);     
}     
echo "Conectado  satisfactoriamente\n";
?>

Me convence Ubuntu 9.10

Llevo ya un par de semanas trabajando con Ubuntu 9.10, alias Karmic Koala y he de reconocer que me gusta y mucho. Si en el mes de julio rajaba sobre al anterior versión de Ubuntu, esta vez es de recibo alabar la nueva versión. ¡Ojo! Que siempre hablo de mi experiencia personal como usuario, no entro a valorar otros puntos de vista.

He tenido algunos problemas con el Compiz, pero lo he desinstalado y todo perfecto. Tampoco es que Compiz aporte demasiado.

Una de las cosas que ha mejorado es el tema del sonido. En versiones anteriores, que si Alsa, que si PulseAudio, el caso es que no logré hacerlo funcionar fino del todo. Ahora va de lujo, incluso se puede controlar el volumen de las distintas aplicaciones que están emitiendo sonido. Yo que utilizo bastante telefonía sobre ip, he podido comprobar que ha mejorado mucho.

Otra cosa que también me ha dejado entusiasmado ha sido VirtualBox. El SW de virtualización de Sun me parece increíble. En este caso, no tiene que ver con Ubuntu 9.10, pero lo comento porque no es tan conocido como VMware y funciona de maravilla. Tengo que virtualizar una máquina windows por motivo de trabajo y funciona realmente bien. Incluso he instalado Spotify y se oye de vicio.

Lo poco que he visto y necesito para el trabajo, estupendo. Sobresaliente para la gente de Canonical.

El servidor no responde (2ª parte)

Cuando actualicé el kernel, el servidor dejó de responder. Eso era debido a que el módulo de la tarjeta wifi estaba construido a mano y, por lo tanto, compilado con el antiguo kernel. Y es que cada vez que se actualiza el kernel, hay que compilar el driver.

Mirando por internet, descubrí una wiki de debian donde hablaba de los módulos necesarios para esa tarjeta wifi, que no es otra que la D-Link System DWL-G122 802.11g Adapter.

Según esa página, existen tres drivers que se pueden utilizar:

  • rt73 (legacy driver)
  • rt73 (enhanced legacy driver)
  • rt73usb (next-generation driver)

Parecía que la cosa estaba clara, lo mejor parece utilizar el driver rt73usb, que es el recomendado. Para ello sólo hay que dar unos sencillos pasos que se detallan en http://wiki.debian.org/WiFi/rt73#rt73usb.

Eso fue lo que hice, pero de vez en cuando (aleatoriamente), la tarjeta wifi dejaba de responder. En el syslog aparecían mensajes del tipo:

wlan0: No ProbeResp from current AP – assume out of range
wlan0: RX deauthentication from (reason=2)
wlan0: deauthenticated

Viendo que dejaba de funcionar, probé la siguiente opción, el enhanced legacy driver. El proceso de instalación se puede ver también en la wiki.

Pues tampoco conseguí hacerlo funcionar, la interfaz de red wlan0 ¡¡¡desapareció!!!

Así que ya sólo queda el legacy driver. Lo cierto es que en este caso no he seguido las instrucciones de la wiki. El código fuente lo he bajado de SourceForge:

http://sourceforge.net/projects/rt2400/

Y la instalación es la típica:

1. Desempaquetar el código fuente e ir al directorio Module:

$ tar -xvzf rt73-cvs-daily.tar.gz
$ cd ./rt73-cvs-YYYYMMDDHH/Module

2. Compilar el código fuente:

$ make

3. Instalar el driver (como root):

# make install

4. Modificar algunos ficheros de la carga de módulos, para que no se carguen los que no deben y se cargue el que hemos compilado. En debian hay que tocar el fichero /etc/modprobe.d/blacklist hay que añadir las líneas:

blacklist rt73usb
blacklist rt2x00usb

Y crear (si es que no existe) el fichero /etc/modprobe.d/ralink con la línea:

alias wlan* rt73

Lo malo de este método es que el código fuente es un poco antiguo, ya que trata de Enero de 2009. La wiki indica que debe irse a la página web del fabricante y bajarse el código fuente de esa página. Luego hacer un proceso idéntico al comentado.

Este último método no lo he probado, pero parece más interesante, ya que el código fuente está más actualizado. De hecho, el último es de hace nueve días.

Y recordar de nuevo que hay que compilar el driver cada vez que se actualice el kernel.

He vuelto a ubuntu 8.04

Después de pegarme unos cuantos días con la versión 9.04, he vuelto a ubuntu 8.04 Hardy Heron. Confío en que la próxima versión LTS, la versión 10.04 sea tan fiable y estable como Hardy.

Por lo que he leído por ahí, Canonical va a hacer especial hincapié en reducir el tiempo de arranque del sistema operativo a 10 segundos. Por otro lado, parece que se podría retrasar su salida seis meses, o sea, que quizás sea la 10.10 la LTS.

¿Es ubuntu 9.04 una cagada?

Hace ya unos cuantos años que empecé en el mundo linux con una versión de Redhat muy, muy antigua. Sólo para jugar. Años después instalé debian 2.2 (también conocida como potato) en un ordenador que tenía algo antiguo porque no conseguía instalar otra cosa. Desde entonces, debian ha sido para mí, la DISTRIBUCIÓN por excelencia.

Sin embargo, el año pasado probé con ubuntu. Instalé la 8.04 y la verdad es que estoy encantado con esa distribución. Debe ser que al ser LTS (Soporte de larga duración) está más cuidada porque no me ha dado ningún problema. Sin embargo, se me ocurrió instalar la semana pasada la nueva versión, la 9.04 conocida como Ubuntu Hardy Heron Jaunty Jackalope y estoy teniendo algunos problemas. Ya he tenido que apagar el equipo de botonazo tres o cuatro veces y eso no me gusta nada de nada, aparte que he tenido problemas con el pulseaudio que tampoco me gusta nada. Como tenga que volver a apagar de botón, me vuelvo de nuevo a la 8.04 LTS que es más fiable y a esperar que salga la nueva LTS que imagino será la 10.04.

Respondiendo a la pregunta, de momento me parece que sí, que es una cagada.

El servidor no responde

Este fin de semana pasado, el servidor donde se hospeda la versión original de este modestísimo blog ha dejado de responder. Se trata de una máquina bastante antigua (AMD-K6 a 350 MHz) con Debian Lenny instalado. Aprovechando que necesitaba actualizar WordPress a la versión 2.8.1 (el gestor de este blog), he actualizado los paquetes del sistema operativo necesarios. Entre ellos estaba la imagen del kernel, que ha pasado de la 2.6.26-1 a la 2.6.26-2. El modificar la imagen del kernel supone rearrancar la máquina.

En el rearranque, el módulo de la tarjeta de red no se ha cargado, ya que tenía hecho un apaño para cargar otro módulo (rt73) en vez del que debía de ser (rt73usb). El apaño consistía en tener en la lista negra de módulos /etc/modprobe.d/blacklist las líneas:

blacklist rt73usb
blacklist rt2x00usb

Que he tenido que borrar.

Se supone que ahora al detectar la tarjeta en el arranque cargará el módulo por motu propio, ya que en el directorio /etc/modprob.d existe un fiichero (da igual el nombre) que contiene la siguiente línea:

alias wlan* rt73usb

AL FINAL ESTE MÉTODO NO HA FUNCIONADO. La solución por la que he optado se puede ver aquí.

Servidor web y gestor de blogs casero

He montado un servidor web casero con un viejo ordenador que ya no utilizaba. Se trata de un AMD-K6 a 350 MHz, pero para servidor web y gestor de blogs puede valer. Sobre todo si no se le pide peras al olmo.

Servidor con gato incorporado

El cacharro tiene instalado Debian Lenny.

Como servidor web he instalado Apache/2.2.9 con PHP/5.2.6.

Como gestor de blogs he instalado WordPress, que según el paquete debian:

WordPress es una herramienta para hacer blogs con muchas características:

  • Publicación instantánea (sin reconstrucción).
  • Pingback de comentarios con protección de spam.
  • URL sencillas.
  • Personalizable.
  • Con complementos.

Para poder acceder al servidor, utilizo la ADSL de casa y el servicio que ofrece No-IP para dinámicamente asociar un nombre a la IP dinámica de la ADSL.