MarioDebian, mi devlog

Bitácora de un desarrollador newbie.

Compilando drivers de TDT (DVB) AverTV TwinStar 07ca:0825

Me he hecho con un nuevo receptor de TDT USB, el anterior (15a4:9016 Afatech Technologies, Inc. AF9015 DVB-T USB2.0 stick) me estaba dando muchos problemas y la poca señal que llega a mi habitación me hacía perder varios canales.

En este HOWTO intentaré de manera sencilla explicar como compilar una nueva versión de V4L previamente parcheada para el nuevo hardware.

1.- Reconocimiento

Lo primero es abrir el receptor (si lo piensas devolver no deberías hacerlo) para identificar los chips, en el mío se puede ver que tiene 2 chips (receptor doble) del tipo AF9035B y AF9033.

Buscando por varios sitios encuentro este hilo: http://patchwork.kernel.org/patch/61950/ que explicaque hay que aplicar dos parches al kernel y compilar, en lugar de compilar el kernel he usado la rama Mercurial del proyecto V4L.

2.- Descargamos V4L

hg clone http://linuxtv.org/hg/v4l-dvb

En el enlace que he puesto antes explica que hay que aplicar 2 parches,el primero del método B de este wiki, y el segundo elque adjunta en ese hilo. Yo he aplicado los dos (corregido los rechazos) y preparado un nuevo parche único, que puedes descargar de aquí: af9035.v4l.hg.diff

3.- Parchear

En el directorio v4l-dvb ejecutamos lo siguiente:

cat /ruta/al/parche/af9035.v4l.hg.diff | patch -p1

4.- Compilar

Teniendo nuestras cabeceras del kernel instaladas (apt-get install linux-headers-`uname -r`) ejecutamos make.

5.- Instalar

No es recomendable instalarlo encima ya que si algo no va bien tendremos que reinstalar nuestro kernel, vamos a instalarlo en el directorio update del kernel para que si queremos en un futuro podamos borrarlo y no estropear nuestro kernel. Es muy importante compilar e instalar como usuario (no como ROOT) ya que no se ejecutarán o copiarán cosas que no queramos.

make install DESTDIR=`pwd`/tmp
sudo mkdir -p /lib/modules/`uname -r`/updates
sudo cp -ra tmp/lib/modules/`uname -r`/kernel/drivers/media/ /lib/modules/`uname -r`/updates/v4l
sudo depmod -a 

(va a dar errores de copia de firmware... no problem !!!)

5.- Instalar el firmware

Descargamos este archivo: dvb-usb-af9035-01.fw y lo copiamos en /lib/firmware/

6.- Pruebas antes de conectar

$ sudo modinfo dvb-usb-af9035

filename:       /lib/modules/2.6.32-2-686/updates/v4l/dvb/dvb-usb/dvb-usb-af9035.ko
license:        GPL
description:    Afatech AF9035 driver
author:         Antti Palosaari <crope@iki.fi>
alias:          usb:v07CAp0825d*dc*dsc*dp*ic*isc*ip*  <======= here is it!!!
alias:          usb:v0CCDp0093d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v15A4p9035d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v15A4p1003d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v15A4p1002d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v15A4p1001d*dc*dsc*dp*ic*isc*ip*
alias:          usb:v15A4p1000d*dc*dsc*dp*ic*isc*ip*
depends:        dvb-usb,usbcore
vermagic:       2.6.32-2-686 SMP mod_unload modversions 686
parm:           debug:set debugging level (int)
parm:           adapter_nr:DVB adapter numbers (array of short)

 

7.- Conectamos

Ejecutamos en un terminal: sudo tail -f /var7log/syslog, debería salir algo como esto:

usb 1-3: new high speed USB device using ehci_hcd and address 6
usb 1-3: New USB device found, idVendor=07ca, idProduct=0825
usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-3: Product: A825
usb 1-3: Manufacturer: AVerMedia TECHNOLOGIES, Inc.
usb 1-3: SerialNumber: 0000000000000
usb 1-3: configuration #1 chosen from 1 choice
dvb-usb: found a 'Avermedia TwinStar' in cold state, will try to load a firmware
usb 1-3: firmware: requesting dvb-usb-af9035-01.fw
dvb-usb: downloading firmware from file 'dvb-usb-af9035-01.fw'
dvb-usb: found a 'Avermedia TwinStar' in warm state.
dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
DVB: registering new adapter (Avermedia TwinStar)
af9033: firmware version: LINK:11.15.10.0 OFDM:5.48.10.0
DVB: registering adapter 0 frontend 0 (Afatech AF9033 DVB-T)...
mxl5007t 4-00c0: creating new instance
mxl5007t_get_chip_id: unknown rev (3f)
mxl5007t_get_chip_id: MxL5007T detected @ 4-00c0
dvb-usb: will pass the complete MPEG2 transport stream to the software demuxer.
DVB: registering new adapter (Avermedia TwinStar)
af9033: firmware version: LINK:11.15.10.0 OFDM:5.48.10.0
DVB: registering adapter 1 frontend 0 (Afatech AF9033 DVB-T)...
mxl5007t 4-00c1: creating new instance
mxl5007t_get_chip_id: unknown rev (3f)
mxl5007t_get_chip_id: MxL5007T detected @ 4-00c1
dvb-usb: Avermedia TwinStar successfully initialized and connected.
usbcore: registered new interface driver dvb_usb_af9035

En /dev/dvb se crearán nuevos dispositivos:

tree /dev/dvb/
/dev/dvb/
├── adapter0
│   ├── demux0
│   ├── dvr0
│   ├── frontend0
│   └── net0
└── adapter1
    ├── demux0
    ├── dvr0
    ├── frontend0
    └── net0

Si algo no funciona, como por ejemplo nos sale esto por el syslog:

usb 1-3: new high speed USB device using ehci_hcd and address 5
usb 1-3: New USB device found, idVendor=07ca, idProduct=0825
usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-3: Product: A825
usb 1-3: Manufacturer: AVerMedia TECHNOLOGIES, Inc.
usb 1-3: SerialNumber: 0000000000000
usb 1-3: configuration #1 chosen from 1 choice
dvb_usb_af9035: disagrees about version of symbol dvb_usb_device_init
dvb_usb_af9035: Unknown symbol dvb_usb_device_init

... es porque teníamos cargados módulos dvb_* , tenemos que mirar los que estan cargados (lsmod) y quitarlos (rrmod), si sigue sin ir podemos probar a reiniciar.

 





Montando un NAS con Debian Lenny (Intel SS4200)

Mi último «capricho» ha sido comprarme un NAS para tenerlo como servidor de almacenamiento y aplicaciones en mi pequeña red de casa.

Después de buscar entre muchos modelos y ver las desventajas de los más pequeños, basados en micros ARM (lentos) me decidí por el Intel SS4200, tuvo que ver que habíua bastante documentación de montarlo desde el blog de binarito.

El NAS es un poco más grande de lo que me esperaba (lo que está encima es un disco USB de 3.5") pero si lo vemos por dentro es bastante lógico ya que tiene 4 discos y la refrigeración es a través del flujo desde la parte delantera.

He comprado 4 discos Western Digital (son más silenciosos y más duraderos que los típicos Seagate), el NAS lo he comprado por ebay en una tienda alemana por unos 216 € y los dicos (1 TB) me han costado 325 €.

Instalación

  1. Como el NAS no tiene tarjeta gráfica hay varias opciones de instalarlo, la que aparentemente es la única es mediante un cable serie DB9-IDC10 con el esquema de conexión DTK/Intel. (howto instalación por cable serie)
  2. Los que conocemos un poco linux sabemos que se puede instalar un sistema operativo en un disco duro conectado en una máquina y si lo conectamos a otra y hacemos unos pocos cambios, la instalación sirve y funciona correctamente, así que esta fue mi opción, el primer disco duro lo conecté a un equipo normal e hice uns instalación de Debian lenny básica, el único detalle a tener en cuenta es hacer que en cada reinicio no se guarde la MAC de la tarjeta de red, para eso edité /etc/rc.local añadiendo esta línea
    	cat /dev/null > /etc/udev/rules.d/70-persistent-net.rules
    	
    antes del exit 0. Esto se puede quitar una vez tengamos en disco en el NAS.
  3. La instalación es muy simple, he usado una partición primaria de unos 10GB para el sistema y el resto lo he dejado como Linux Raid Autodetect. Hay que configurarle una IP fija en /etc/network/interfaces e instalar ssh para poder entrar una vez que lo pinchemos en el NAS.
  4. Desmontamos el disco del PC y conectamos el disco (en la ranura 1) en el NAS, conectando el resto de los discos.
  5. Conectamos cable de red y alimentación y encendemos, puede que en el primer arranque no carguepero después de un botonazo sí lo hace (quizás la primera vez que la BIOS ve los discos no sabe desde donde arrancar)
  6. Una vez que lo tenemos funcionando nos conectamos por ssh y empezamos a instalar aplicaciones...
    • ssmtp - reemplazará a exim4 y nos permitirá enviar avisos a la cuenta que indiquemos, yo lo he configurado para que me mande a mi cuenta de gmail cuando pase algo
    • mdadm y lvm2 - Para montar el RAID y luego crear los volúmenes, con unos discos tan grandes es recomendable usar algo como esto... para montar el RAID5 he ejecutado lo siguiente:

      Clonamos las particiones a todos los discos
      		sfdisk -d /dev/sda > sda.pf
      		sfdisk /dev/sdb < sda.pf
      		sfdisk /dev/sdc < sda.pf
      		sfdisk /dev/sdd < sda.pf
      		
      Creamos el RAID
      		mdadm --create /dev/md0 --level=5 -n 4 /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2
      		pvcreate /dev/md0
      		vgcreate vg0 /dev/md0
      		lvcreate --name mirror --size 350G vg0
      		lvcreate --name descargas --size 400G vg0
      		mkfs.ext3 -m 0 -L mirror /dev/vg0/mirror
      		mkfs.ext3 -m 0 -L descargas /dev/vg0/descargas
      		
      Añadir al /etc/fstab
      		/dev/mapper/vg0-mirror /mnt/mirror ext3 rw,noatime 0 0
      		/dev/mapper/vg0-descargas /mnt/descargas ext3 rw,noatime 0 0 
    • smartmontools - Monitoriza la salud de los discos y avisa por mail si algo empieza a fallar.
    • hddtemp - Es imprescindible que los discos esten lo más frescos posible, ahora mismo estan los 4 entre 36 y 42
    • ntpdate - para que se sincronice la hora (cada día desde el crontab)
    • rsync - impresincible para copiar datos de manera eincremental, hacer backups, etc...
    • módulo ss4200 - es un módulo del kernel para controlar a través de /sys el estado de los leds frontales, de hecho me he hecho un script que por defecto apaga todos y los enciende si pasa algo raro. En la web, explican como parchear el kernel pero no es necesario ya que se puede compilar como módulo y las cabeceras de Debian (linux-headers-2.6.26-2-686)
  7. No tenía claro si usar RAID5 o un doble RAID1 con la solución mixta RAID10, en la doc del paquete mdadm no recomiendan usar RAID5 aunque no acabo de tener muy claros los motivos.
  8. Una de las cosas que he probado es instalar Xvfb (virtual framebuffer X server) para tener un programa gráfico arrancado (lease estilo JDownloader o un cliente bittorrent) aquí el script.
  9. Este es el script para activar los leds (cada 10 minutos desde el cron) en caso de emergencia.

Resumiendo, tener un NAS no es algo que necesite todo el mundo, pero en mi caso (uso portátil en lugar de sobremesa desde hace muchos años) los discos USB no estan hechos para funcionar 365/24 y ya me han petado unos cuantos.





HOWTO cacheado de repositorios Debian/Ubuntu para colegios/instituciones

La idea de este HOWTO es poder cachear paquetes deb en un servidor local cuando en un centro tienen varios equipos con Debian/Ubuntu instalado (supongo que valdrá para otros casos menos concretos)

1.- Tenemos que tener un servidor haciendo de puerta de enlace, pongamos que tiene como IP en la LAN interna: 192.168.1.1

2.- En ese equipo tenemos que instalar un apache, el paquete approx y un servidor DNS, me quedo con dnsmasq. Se pueden tener más cosas, yo por ejemplo tengo montado un squid transparente.

3.- Configuramos approx para que cachee paquetes, en /etc/approx/approx.conf añadimos estas 2 líneas al final:

ubuntu http://uk.archive.ubuntu.com/ubuntu
debian http://ftp.uk.debian.org/debian

Lógicamente pon los repositorios que vayan mejor según tu zona geográfica y no uses los principales. Es importante que apuntemos a uno local, porque si apuntamos al principal haremos un bucle infinito. Approx por defecto sirve los repos en el puerto 9999, ahora necesitamos redirigir el 80 al 9999 de nuestra máquina. Se puede hacer con iptables (sabiendo las IPs de destino) o se puede hacer con mod_proxy de apache2.

4.- Creamos un site para apache /etc/apache2/sites-available/cache.mirror:

ProxyRequests Off
ProxyPass /debian/ http://localhost:9999/debian/ 
ProxyPassReverse /debian/ http://192.168.1.1:9999/debian/

ProxyPass /ubuntu/ http://localhost:9999/ubuntu/ ProxyPassReverse /ubuntu/ http://192.168.1.1:9999/ubuntu/

5.- Lo activamos:

# a2enmod proxy
# a2enmod proxy_http
# a2ensite cache.mirror
/etc/init.d/apache2 restart

6.-Ahora viene la magia... como los equipos de la red interna tienen 192.168.1.1 como DNS y gateway (y si no, lo forzamos con iptables) editamos /etc/hosts y añadimos:

# cache paquetes deb
192.168.1.1 archive.ubuntu.com
192.168.1.1 ftp.debian.org

En los equipos del centro tenemos que configurar los repositorios con estos repositorios, si usamos uno nacional no cacheará... Por ejemplo este sería el contenido de un sources.list de Ubuntu Hardy:

deb http://archive.ubuntu.com/ubuntu hardy main universe multiverse restricted
deb http://archive.ubuntu.com/ubuntu hardy-updates main universe multiverse restricted
deb http://archive.ubuntu.com/ubuntu hardy-security main universe multiverse restricted

7.-Reiniciamos dnsmasq (que lee el /etc/hosts antes de hacer peticiones DNS hacia fuera)

8.- Para comprobar que está funcionando en nuestro servidor miramos /var/cache/approx/ y veremos como empiezan a aparecer archivos. El paquete tiene 2 utilidades que se ejecutan diaria y semanalmente, una para actualizar los Packages.gz y otra para hacer limpieza por lo que no deberíamos preocuparnos de tener que mantener el sistema.Supongo que si crece exagerádamente y borramos el contenido de la cache seguirá funcionando y volverá a descargar...

Esta solución desde el punto de vista de consumo de ancho de banda es mejor que debmirror ya que sólo cacheamos los paquetes según se instalan, con debmirror se descarga el repositorio completo.





dnsmasq: esto si que es efectividad

Bug con parche sobre dnsmasq [532201] (realmente muy sencillo) y un día después nuevo upstream con el parche aplicado.

Acaba de llegarme el correo con el parche cerrado.

Así da gusto no como otros (aunque ponga Fix Released no lo han arreglado).





Posicionamiento web de TCOS

Revisando estadísticas de la web de TCOS, me he llevado una grata sorpresa:

debian thin client [en google]

Esto me anima aún mas para seguir con el trabajo de subirlo a Debian... ya he solucionado muchos problemas y espero que en breve pueda estar listo.Tengo varios contactos con DD así que no creo que esta vez tenga problemas para que alguien esponsorice el paquete.





Evolution 2.26 super inestable

Llevo 2 o 3 días maldiciendo evolution, la versión 2.26 recientemente incluida en Debian unstable peta más que una escopeta de feria.

Todos los bugs en su lista en alioth.



Pavucontrol

El nuevo pavucontrol [Debian pkg] tiene una pinta estupenda:

Ya lo podían convertir en applet para tenerlo más a mano.

Revisaremos la traducción que no me acaba de convencer eso de "Frente izquierdo".

La entrada de hoy ha sido muy cortita (que estamos de fiesta).




Hace un año: Mi historia en Max

Squid 3.0 con soporte a X_FORWARDED_FOR

Cuando se mezcla Dansguardian con Squid en un proxy transparente existen ciertos inconvenientes que es bueno conocer.

  1. Dansguardian escucha las peticiones de la red interna en el puerto 8080, con iptables redirigimos todo el tráfico de salida a este puerto.
  2. Dansguardian pasa su petición a Squid por localhost al puerto 3128.
  3. Squid hace la petición y dansguardian la procesa.

Esto tiene un inconveniente y es que todas reglas acl o delay_pool en squid dejan de trabajar ya que todo el tráfico usa como IP cliente 127.0.0.1.

Existe un parche relativamente antiguo llamado follow_xff (pensado para versiones 2.x) que he reescrito en parte para que Squid3 use la cabecera X_FORWARDED_FOR. El parche se guarda en debian/patches en formato dpatch. Me falta el detalle de que no muestre un mensaje de no reconocer las nuevas reglas, porque funcionar sí lo hace.

Parece que en Debian (#523943) estaba activado, pero solo era un modificador de debian/rules, no había ni rastro de código y también parece que se ha añadido a Squid a partir de la versión 3.1.0.1.

He preparado un repositorio GIT de squid para compilarlo en Debian lenny con el parche y un simple «git-buildpackage».





El xorg.conf más pequeño que hayas visto nunca

Hoy me ha dado por actualizar a la última versión de Xorg en Debian SID (1:7.4+1) y como ya había visto por el planet las quejas de la gente, estaba avisado que ahora HAL es el que configura en caliente las Xorg. Copia de seguridad de xorg.conf (por si las moscas) y dpkg-reconfigure xserver-xorg. He añadido a mano la línea del driver nvidia aunque no estoy seguro si hace falta.

$ grep -v -e ^$ -e ^# /etc/X11/xorg.conf
Section "Device"
Identifier	"Configured Video Device"
Driver		"nvidia"
EndSection

Reinicio y a pesar de parpadear un par de veces las X cargan y el monitor externo parece que lo reconoce y consigo configurarlo como extendido sin mucho problema.

Desde Octubre tengo un ratón Logitech Laser y la rueda tiene la función de botones laterales, en mi anterior xorg.conf tuve que hacer malabarismos para configurarlo como ratón de 7 botones, ahora con ayuda de xbindkeys funciona sin tocar nada:

$ grep -v -e ^# -e ^$ ~/.xbindkeysrc 
"xbindkeys_show" 
control+shift + q
"/usr/bin/xvkbd -xsendevent -text "\C\[Prior]""
m:0x0 + b:6
"/usr/bin/xvkbd -xsendevent -text "\C\[Next]""
m:0x0 + b:7

Con esta configuración puedo cambiar de pestaña del navegador o la consola de una manera super cómoda.

Ya para terminar último truco "GRATIX", mi portatil da 1680x1050 de resolución y hace unos meses me compré otro monitor (LG de 22") para trabajar con escritorio extendido (3360x1050).

Al usar el driver de NVidia estas obligado a usar su interfaz gráfico «nvidia-settings» y son un montón de clicks para configurarlo, en Launchpad he encontrado un proyecto super interesante: disper, son unos binding en python para que ataque a las libs de nvidia o a xrand y poder cambiar resolución mediante atajos de teclado, scripts o usandolos en otros programas...

Me he hecho un script y con un botón en el panel lo llamo:

#!/bin/sh
cd /home/mario/sources/disper/disper
RES=$(/usr/lib/tcos/screensize)
if [ "$RES" = "1680x1050" ]; then
# extend if CRT-0 is connected
python src/cli.py --list| grep -q "CRT-0" && python src/cli.py --extend
elif [ "$RES" = "3360x1050" ]; then
python src/cli.py --single
else
zenity --error --text="NVidia extend resolución desconocida ($RES)"
fi

Básicamente lo que hace es detectar la resolución actual y si es 1680x1050 y detecta el monitor CRT-0 la cambia a extendida (3360x1050), si ya está extendida la pone en simple deshabilitando el monitor externo. Si esto lo añadimos a un atajo de teclado tipo Fn+F6 ya tenemos el conector desconector de proyectores.

Por hoy nada más, voy a investigar como le sienta a TCOS el cambio de Xorg.





NVidia en Debian con el kernel 2.6.29

Es un verdadero dolor de cabeza cada vez que se cambia algo en el kernel y nvidia da largas.

Esta vez el motivo es una nueva versión de kbuild y diferentes modelos de empaquetado de las cabeceras del kernel (antes entre el common y el -686, por ejemplo, había enlaces para que el de cada arquitectura tuviera lo necesario del common, ahora parece que no)

He probado miles de cosas hasta que he dado con el truco para hacerlo funcionar, inspirado en un comentario de este bug de Debian: #520706. Primero hay que buscar el archivo Makefile_32.cpu y copiarlo en su sitio.

¿Como compilamos?

  1. Ejecutar module-assistant como siempre (y esperar el fallo) para así tenerlo descomprimido.
  2. Editar /usr/src/modules/nvidia-kernel/debian/rules y cambiar la línea:

    IGNORE_CC_MISMATCH=1 CC="$(CC)" $(MAKE) -C $(CURDIR)/$(dirname) -f Makefile SYSSRC=$(KSRC) $(KPKG_EXTRAV_ARG) KBUILD_PARAMS=$(KBUILD_PARAMS) module;

    por:

    IGNORE_CC_MISMATCH=1 CC="$(CC)" $(MAKE) -C $(CURDIR)/$(dirname) -f Makefile SYSSRC=/usr/src/linux-headers-2.6.29-1-common/ KERNEL_OUTPUT=$(KSRC) $(KPKG_EXTRAV_ARG) KBUILD_PARAMS=$(KBUILD_PARAMS) module;

  3. Ejecutar nuevamente m-a -O -t build,install nvidia (es muy importante el -O ya que así no descomprime de nuevo las fuentes, y nos chafa la edición)

En el bug comentaban de usar la variable $(KCOM), pero debo tener una versión de module-assistant que no genera esa variable.

Escribo desde un kernel 2.6.29-1-686 con el driver nvidia 180.44.

A todo esto y ya se que «glxgears» es una unidad de medida de una credibilidad nula, pero hay un aumento considerable de rendimiento desde el 180.22 o 180.29 (2.500FPS) a este 180.44 (4200 FPS) (NVidia Quadro NVS 140M).

Los paquetes deb del 180.44 me los hice hace tiempo para el 2.6.28, pero eso será una historia para otro día.