MarioDebian, mi devlog

Bitácora de un desarrollador newbie.

TCOS en Ubuntu Lucid 10.04, the perfect setup

Ya tenemos un artículo para instalar y configurar TCOS en Ubuntu 9.04 Jaunty, ahora voy a dar unos pequeños trucos para instalarlo en Lucid.

 

  1. Instalar Ubuntu 10.04 Lucid (quizás sirva para otras *buntu), yo lo he probado con Ubuntu y GNOME.
  2. Añadir el siguiente repositorio:

    deb http://tcosproject.org lucid main
  3. El repositorio está firmado con mi clave GPG por lo que cuando actualicemos nos dará un error, para añadir la clave se puede instalar el paquete tcos-keyring 
  4. Luego instalamos el paquete tcos.
  5. Actualizar el paquete GDM, en el repositorio de TCOs está disponible la versión 2.30.2.is.2.30.2-0ubuntu1.lucid.tcos2 que tiene unas ligeras mejoras con respecto al que trae Ubuntu:

    - Desactivado IPV6 - desgraciadamente las nuevas versiones del gdm lo traen activado por defecto y XDMCP no funciona
    Parche para la inicialización del buffer XdmcpFill()
    Parche para el TimedLogin remoto
    - Otras pequeñas mejoras

  6. Lanzar el configurador de servidor desde el menú Administración o ejecutar: sudo tcos-configurator



  7. En la primera pestaña configurar el interfaz de red que atenderá a los terminales ligeros y el rango DHCP.
  8. En la segunda pestaña añadir usuarios (si se quiere que funcione el autologin usar el mismo prefijo que los nombres de equipo)



  9. En la tercera pestaña activar la entrada remota de GDM y opcionalmente el timeout y autologin



  10. En la cuarta pestaña lanzar Tcosconfig
  11. Seleccionar la plantilla tcos.conf.all y dar siguiente hasta la parte de construcción de la imagen, pulsar el botón contruir y cuando termine guardar.



  12. A continuación unos pequeños trucos para evitar problemas
 
Desactivar Multicast DNS, se edita /etc/nsswitch.conf y se cambia la línea:
 
hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
 
por
 
hosts:          files dns

(esto desactiva los servicios AVAHI que no son imprescindibles y que aumentan mucho los timeouts de login de GDM o incluso SSH)

 

Verificar el correcto funcionamiento de los DNS, lo recomendable es desinstalar network-manager y configurar una IP fija en /etc/network/interfaces (de hecho el configurador del servidor de TCOS debería haberlo hecho ya).

Comprobar que la primera línea de /etc/resolv.conf es la IP interna de nuestro servidor

Comprobar que en /etc/resolv.conf.real tenemos los DNS de nuestro proveedor de internet o en su defecto unos que funcionen.

Comprobaremos que el archivo /etc/gdm/custom.conf tiene este aspecto:

[xdmcp]

Enable=true

MaxPending=60

MaxWaitIndirect=80

MaxWait=75

PingIntervalSeconds=35

MaxPendingIndirect=30

MaxSessions=40

DisplaysPerHost=4

[daemon]

TimedLogin=/usr/sbin/tcos-gdm-autologin --local=usuario-que-usara-el-servidor|

TimedLoginEnable=true

TimedLoginDelay=1

[security]

AllowRemoteAutoLogin=true

 
Podemos activar el debug en GDM (clave [debug]Enable=True ) y ver el syslog mientras los equipos intentan cargar por red.
 
Si hemos seguido todos los pasos con total exactitud tendremos un servidor TCOS funcionando en menos de media hora (contando la instalación de Ubuntu)




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.

 





Mi primer app en android: RsyncDroid

Presento mi nueva aplicación (mejor no mirar el código) para android: RsyncDroid.

Es como si fuese un HolaMundo pero un poco más complejo, pero me ha servido para aprender un poco Java y sobre todo para ver su entorno de desarrollo basado en Eclipse. El debugger (ddms) es la leche y se puede estudiar muy bien lo que va haciendo nuestra aplicación mientras se ejecuta... me ha gustado.

Instalación

Lo primero es conseguir el binario de rsync, he preparado este script (necesita ser root del teléfono)

wget http://adqmisc.googlecode.com/svn/trunk/androidutils/rsync/rsync-3.0.6-arm-softfloat-linux-gnueabi.gz
zcat rsync-3.0.6-arm-softfloat-linux-gnueabi.gz > rsync

./adb push rsync /sdcard/rsyncdroid/rsync
./adb shell mount -o remount,rw /dev/block/mtdblock0 /system
./adb shell "cat /sdcard/rsyncdroid/rsync > /system/bin/rsync"
./adb shell chmod 755 /system/bin/rsync
./adb shell mount -o remount,ro /dev/block/mtdblock0 /system

Ahora instalaremos este apk: rsyncdroid.apk

./adb install -r ~/Desktop/rsyncdroid.apk
401 KB/s (18269 bytes in 0.044s)
    pkg: /data/local/tmp/rsyncdroid.apk
Success

Capturas de pantalla

El programa es muy sencillo, lo que hace es arrancar, parar y ver el estado del proceso rsync, si no existe la configuración usa una base en la que se comparte el contenido de la memoria SD. Es recomendable añadir algo como "hosts allow = xx.xx.xx.xx", para permitir el acceso sólo desde la IP que queramos (man rsyncd.conf).

La primera vez que lo ejecutemos nos pedirá el permiso de root (rsync se ejecuta en un puerto privilegiado).

Script para copia de datos

rsync -Pavz --no-g --no-p --no-numeric-ids \
    htcmagic::sdcard/ --delete /home/mario/htcmagic/backup/

Yo me he hecho un script un poco más complejo para (por la madrugada) hacer ping al teléfono y si está en la wifi de mi red hacer la copia incremental (creando enlaces duros) y borrando las copias de seguirdad que tengan más de 30 días.





Diferencias entre algo sencillo y algo enrevesado

Hoy me he puesto a intentar hacer una cutre aplicación para Android (que está tan de moda) y de paso a programar mis primeras líneas en JAVA. ¿Quén inventó ese lenguaje del diablo? Se merece las 7 plagas seguidas de una lapidación pública, y voy a ello con un ejemplo muy simple.

Vamos a intentar partir una cadena de texto por espacios, en Python:

>>> a="esto   es una cadena   de texto"
>>> a.split()
['esto', 'es', 'una', 'cadena', 'de', 'texto']

Nótese que entre alguna de las palabras hay más de un espacio.

Ahora vamos a hacerlo en JAVA:

public class test {
public static void main(String args[]) {
String a;
String [] aArray;
int i;
a="esto   es una cadena   de texto";
aArray=a.split(" ");
for (i=0; i<aArray.length; i++) {
System.out.println("index=" + i + " aArray=" + aArray[i]);
}
}
}

Que como resultado da:

index=0 aArray=esto
index=1 aArray=
index=2 aArray=
index=3 aArray=es
index=4 aArray=una
index=5 aArray=cadena
index=6 aArray=
index=7 aArray=
index=8 aArray=de
index=9 aArray=texto

No quiero ir de listillo, pero necesitar 6 veces más código para no hacerlo bien es como volver al esamblador. He intentado hacer aArray=a.trim().split(" ") pero ni con esas...seguro que hay una forma rebuscada de hacerlo, en python no hay que pensar tanto. Además es bastante más lento que python y eso que se ejecuta compilado en bytecode:

$ time python -c "a='esto   es una cadena   de texto'; print a.split()" >/dev/null
real	0m0.026s
user	0m0.020s
sys	0m0.004s
$ time java test > /dev/null
real	0m0.135s
user	0m0.064s
sys	0m0.016s




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.





Microsoft ha perdido el tren en educación

Sí, si no te le crees empieza a creertelo. Quizás hoy no y mañana tampoco pero lo veremos y el tiempo pondrá a cada uno en su sitio.

Cuando otros se dedican a poner un montón de servicios en línea, ellos siguen pensando que al escritorio aún le queda algo que ofrecer. En otra ocasión ya comentaré lo acojonado que me tiene el nuevo monopolio.

Hace muchos años hizo algo que no supo hacer nadie, poner algo muy elitista (un ordenador/PC y un sistema operativo) en manos del gran público, y eso debemos agradecerselo en su justa medida, pero hoy es una losa que pesa demasiado y que no deja innovar (si no se quiere) lo suficientemente rápido al resto de nuevos visionarios™.

Se hacen públicos acuerdos cuando ven que están a punto de perder el tren. Su modelo de negocio se virtualiza y ven como su facturación se resentirá, por lo que proponen cobrar licencias por año (por ejemplo un Windows XP $100/año, sí, por año) regalan su sistema operativo si compras la suite ofimática y otro tipo de jugadas que hace 10 años ni se les hubiera pasado por la cabeza ¿desesperación?

Los colegios (me refiero a los privados, los públicos están en otra dimensión con demasiada burocracia y politiqueo) aceptan con mejores ganas el Software Libre, varios de nuestros clientes están migrando todas sus aulas e instalaciones a, al menos, un modelo de arranque dual con las miras de quitar para siempre el sistema operativo de las 7 letras en uno o dos años, otros directamente (y de la noche a la mañana) cambian uno por otro (reciclando con TCOS por ejemplo) aparcan sus dominios en Google Apps, y reciben con los ojos como platos cualquier nuevo invento que les ayude a reducir costes y ser más productivos (estamos montando un montón de filtros de control de contenido, VPNs y gestores documentales)

Creo que no soy un recién llegado (llevamos algo más de 3 años trabajando para educación) y desde la cercanía se ven mucho mejor las tendencias. En Castilla y León y supongo que en otras comunidades, el colegio privado/concertado marca tendencia y el público suele imitarle si ve que funciona.

Como las capas OSI/TCP, la pequeña empresa es una parte necesaria en la modernización de la educación y es la que hace de pasarela, ayuda y formación para el desarrollo de las TICs, debemos saber hacerlo y creo que cada día hay más empresas siguiendo estas direcciones.

Así que hagámoslo, por el Software Libre en Educación.

PD.- Se que no escribo mucho últimamente pero con la entrada de hoy os podeis imaginar que tenemos mucho trabajo Laughing





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.





Accesorios de mi HTC Magic

Después de gastarme los dineros en eBay por el móvil estuve buscando accesorios útiles ya que este móvil se «zampa» la batería si no andas con cuidado, y este es el resultado después de esperar:

El consumo de batería también se puede mejorar con aplicaciones, la mejor que he encontrado sin duda es PowerManager, de hecho he descargado la versión de pago ($0,99)





Estamos de mudanza: mariodebian.com

A partir de ahora este blog se mueve a su propio dominio:

 

Actualiza tu lector de RSS con el nuevo dominio (el viejo empezará a apuntar al nuevo)





Compilando rsync en Android

Hace muy pocos días que he aterrizado en el mundo de android pero creo que voy avanzando poco a poco. Voy a publicar una minireceta de como compilar utilidades linux (sencillas) nativamente en Android. Antes de empezar sería bueno recordar que los binarios de Android se compilan para arquitectura ARM por lo que o usamos un emulador (tipo qemu) o un toolchain. Yo he usado el toolchain para compilar nativamente, con el emulador deberíamos compilar en estático y el binario ocupará bastante más. Vamos por pasos:

1.- Descargar el git de android, viene muy bien explicado aquí. Yo lo he descargado en mi $HOME/toolchain.

mkdir ~/toolchain
cd toolchain
wget http://android.git.kernel.org/repo
chmod +x repo
./repo init -u git://android.git.kernel.org/platform/manifest.git
./repo sync

2.- Hora de tomarse algo, descarga la friolera de 2.1 GiB, seguimos, hay que compilar la parte base (librerías)

make BUILD_TINY_ANDROID=true

3.- Tarda otro buen ratillo, ahora compilamos la parte oprofile (lo he compilado aquí porque así tenía a mano los includes de popt.h que son los únicos que he necesitado), cargamos el entorno de ayuda y compilamos el directorio actual y subdirectorios con "mm":

cd external/oprofile
. ../../build/envsetup.sh
mm 

4.- Ahora descargamos las fuentes de rsync (pueden valer las de Debian)

dget -u http://ftp.uk.debian.org/debian/pool/main/r/rsync/rsync_3.0.6-1.dsc
cd rsync-3.0.6

5.- La parte que más me ha costado ha sido entender los Makefile de Android que se llaman Android.mk. Este es mi Android.mk para rsync:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
flist.c\
rsync.c\
generator.c\
receiver.c\
cleanup.c\
sender.c\
exclude.c\
util.c\
main.c\
checksum.c\
match.c\
syscall.c\
log.c\
backup.c\
options.c\
io.c\
compat.c\
hlink.c\
token.c\
uidlist.c\
socket.c\
hashtable.c\
fileio.c\
batch.c\
clientname.c\
chmod.c\
acls.c\
xattrs.c\
progress.c\
pipe.c\
params.c\
loadparm.c\
clientserver.c\
access.c\
connection.c\
authenticate.c\
lib/wildmatch.c\
lib/compat.c\
lib/snprintf.c\
lib/mdfour.c\
lib/md5.c\
lib/permstring.c\
lib/pool_alloc.c\
lib/sysacls.c\
lib/sysxattrs.c\
zlib/deflate.c\
zlib/inffast.c\
zlib/inflate.c\
zlib/inftrees.c\
zlib/trees.c\
zlib/zutil.c\
zlib/adler32.c\
zlib/compress.c\
zlib/crc32.c
LOCAL_SRC_FILES += netbsd_getpass.c
LOCAL_STATIC_LIBRARIES := \
libpopt
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/.. \
$(LOCAL_PATH)/../libdb \
$(LOCAL_PATH)/../libutil \
$(LOCAL_PATH)/../libop \
$(LOCAL_PATH)/../libabi
LOCAL_MODULE := rsync
include $(BUILD_EXECUTABLE)

El archivo netbsd_getpass.c lo he tomado de ~/toolchain/external/dropbear/netbsd_getpass.c ya que Android no debe tener la rutina getpass(), sólo se usa si la rutina getpassf() de rsync nativa falla.

6.- A compilar toca, sólo hay que ejecutar "mm" dentro del directorio rsync-3.0.6 y si todo va bien veremos al final:

target Executable: rsync (out/target/product/generic/obj/EXECUTABLES/rsync_intermediates/LINKED/rsync)
target Non-prelinked: rsync (out/target/product/generic/symbols/system/bin/rsync)
target Strip: rsync (out/target/product/generic/obj/EXECUTABLES/rsync_intermediates/rsync)
Install: out/target/product/generic/system/bin/rsync
make: se sale del directorio `/home/mario/toolchain'

7.- Para copiarlo al móvil (conectar el cable USB y activar el modo depuración USB en las preferencias)Necesitamos el SDK de Android.

cd ~/sdk/tools
sudo ./adb kill-server
sudo ./adb remount
sudo ./adb push ~/toolchain/out/target/product/generic/system/bin/rsync /system/bin
sudo ./adb shell chmod 755 /system/bin

Ya podemos abrir el terminal desde android (o desde adb shell) y ejecutar rsync para ver si se copio bien.

Se me ocurren miles de cosas sencillas (GScript + rsync) para tener las fotos publicadas en un blog, hacer copias de seguridad remotas (incrementales) o incluso usarlo para descargar contenido pudiendo perder la conexión temporalmente.

Rizando el rizo, estaría guapo hacer un pequeño frontend con las opciones más usadas y llamarlo desde una aplicación APK.

Como próximo objectivo compilar alguna otra cosa que hecho en falta (¿git? etc...)





1 2 3 ... 32 33 34  Siguiente»