Husq: un gestor de tareas pendientes

¡Esta vez en serio! [Puñetazo en la mesa] Ya es hora de aprender C++ y Qt. Para motivarse a estudiar hay que marcarse objetivos, como un pequeño proyecto. Con tal propósito me he inscrito en la quinta edición del Concurso Universitario de Software Libre, con una propuesta llamada Husq.

Husq será un programa gráfico para la gestión de tareas pendientes, organizadas jerárquicamente.
Cada tarea tendrá nombre, descripción, fecha límite y, opcionalmente, prioridad y categoría. Además, y como punto clave y diferencial, podrá ser desglosada en varias subtareas. Así mismo podrá disparar alarmas programadas.

Mi idea inicial es basarme, en la medida de lo posible, en TuDu. Intentaría que tuviera las mismas funcionalidades que esta utilidad (e incluso que sus archivos fueran compatibles). Como TuDu no es demasiado grande (unas 7000 líneas de código), creo que puede ser un proyecto realista y asequible para meterme en harina y aprender.

No obstante también recogeré ideas de hnb, yaGTD, Taskwarrior, gtg, Yokadi y otros, por lo que quizá dicha compatibilidad no sea posible, o precise de aportar parches a TuDu.

Con respecto a TuDu, Husq aportará:

  • Interfaz gráfica: TuDu es un programa ncurses para la terminal Unix, mientras que Husq será un programa gráfico basado en las bibliotecas Qt de Nokia, por lo que tendrá un look’n’feel nativo tanto en GNU/Linux como en Mac OS X y Microsoft Windows.
  • Internacionalización: TuDu sólo está disponible en inglés, pero Husq lo estará en al menos inglés y castellano, y será posible adaptarlo fácilmente a otros idiomas.
  • Robustez del código: en el código de TuDu la interfaz ncurses está íntimamente imbricada en la lógica del programa. Husq seguirá patrones de diseño, como MVC, que lo harán más robusto y flexible.
  • Mejoras a la usabilidad, nuevas funciones útiles y corrección de bugs.

Un efecto colateral de este proyecto es que las bases del concurso exigen que se vaya informando del desarrollo en un blog, lo que me obligará a retomar éste :-)

Cómo reparar GRUB en una máquina sin lector de CD

Es posible que al reinstalar Windows en una partición o utilizar algún software de restauración, GRUB quede dañado o sobreescrito, y debamos proceder a su reparación. Los netbooks no llevan lector de CD, pero sí son capaces de arrancar desde un puerto USB. Entramos en el BIOS del ordenador y lo configuramos para que intente arrancar antes de un disco USB que de un disco duro.

En otra computadora descargamos una imagen ISO de Debian Live, eligiendo la arquitectura adecuada. Insertamos un pendrive vacío (o sin datos a conservar) en un puerto USB, y comprobamos en que dispositivo se ubica (dmesg | grep scsi -A 3). Sin montar el dongle, copiamos la imagen (debe hacerse como usuario root):

bronchales:/tmp# dd if=debian-live-504-amd64-kde-desktop.img of=/dev/sdb bs=1M
704+0 records in
704+0 records out
738197504 bytes (738 MB) copied, 351,448 s, 2,1 MB/s
bronchales:/tmp# sync

Ya podemos extraer el lápiz USB, conectarlo al sistema dañado, y arrancar. Montaremos la partición que contenga nuestro sistema GNU/Linux, por ejemplo en /mnt, y ejecutaremos:

mount -t proc /proc /mnt/proc
mount -t sysfs /sys /mnt/sys
mount -o bind /dev /mnt/dev
chroot /mnt /bin/bash
grub-install /dev/sda
exit
umount /mnt/dev
umount /mnt/sys
umount /mnt/proc
reboot

Al reiniciarse el netbook, ya debería saludarnos el menú de GRUB.

MySQL: cómo copiar un dato de una fila a otra fila de la misma tabla

He intentado ingenuamente hacer esto:

mysql> UPDATE wp_sitemeta SET meta_value=(SELECT P2.meta_value FROM wp_sitemeta P2 WHERE P2.site_id="8" AND P2.meta_key="illegal_names") WHERE site_id="7" AND meta_key="illegal_names";

pero al SGBD no le ha gustado:
ERROR 1093 (HY000): You can't specify target table 'wp_sitemeta' for update in FROM clause

Se puede usar una subconsulta para asignaciones dentro del comando UPDATE, pero no se puede usar la misma tabla para la cláusula FROM de la subconsulta y el objetivo a actualizar. Tras leer esta historia, lo he resuelto usando una tabla temporal:

mysql> UPDATE wp_sitemeta SET meta_value=(SELECT meta_value FROM (SELECT meta_value FROM wp_sitemeta WHERE site_id="8" AND meta_key="illegal_names") AS X) WHERE site_id="7" AND meta_key="illegal_names";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

OpenBSD 4.6 en VirtualBox 3

He instalado OpenBSD 4.6 en una máquina virtual de VirtualBox 3 sobre Debian. Al hacerlo he tropezado con el bug #639: el instalador daba muchos segmentation fault por no tener habilitadas las extensiones de virtualización VT-x/AMD-V en el BIOS del sistema anfitrión.

Lo he solucionado como explica Siddi en un comentario del fallo:

  1. Creamos la máquina virtual en la interfaz de VirtualBox, indicando como disco de arranque install46.iso.
  2. Abrimos una terminal, y listamos las máquinas virtuales que tenemos:
    % VBoxManage list vms
    VirtualBox Command Line Management Interface Version 3.1.2_OSE
    (C) 2005-2009 Sun Microsystems, Inc.
    All rights reserved.

    "WinXP" {d31d7f15-79c8-4779-5ea3-434217af0881}
    "Solaris" {0c1e6b9d-7748-49ac-14a5-e927da229a6a}
    "CDLive" {d935f872-7ce4-4dc1-9c14-1a9525ac1ff7}
    "OpenBSD" {c361b3c2-5773-49df-b7c0-74eb1fa84f50}
  3. Nos fijamos en el ID de la máquina virtual de OpenBSD, y la iniciamos con la orden
    % VBoxSDL -norawr0 -vm c361b3c2-5773-49df-b7c0-74eb1fa84f50

Y ya podemos proceder a realizar la instalación, sin errores :-)

Captura de OpenBSD sobre VirtualBox

Cada vez que queramos usar la máquina virtual de OpenBSD, tendremos que acordarnos de lanzar VirtualBox con esa orden.

¡Recuperados más de 80 artículos antiguos!

He encontrado un backup de la base de datos que hice en el año 2006, un año antes de que el sistema saltara en pedazos. La recuperación no ha sido todo lo sencilla que me hubiera gustado, pues entre la reliquia que es WordPress 1.2.2 y el actual 2.9.1 la estructura de la base de datos ha cambiado bastante, y no se podía importar directamente. El procedimiento ha sido hacer una instalación de la versión 1.2.2 (que todavía esta disponible en el archivo de versiones de WordPress), actualizarla a la versión 1.5, y volver a actualizar a la última versión. Entonces he podido exportar todo el contenido a un fichero XML que finalmente he importado en el blog actual. Uff.

Queda por ver qué conserva archive.org de las entradas posteriores al backup.

9 años de Cronopios.Net

El 13 de enero de 2001 registré el dominio Cronopios.Net. Desde entonces, su uso ha sufrido drásticos altibajos. Inicialmente estuvo alojado en un proveedor de hosting de Estados Unidos. Algunos años más tarde, migró a mocoso, un humilde IBM de sobremesa reciclado (Pentium I) en las instalaciones de Base Digital, donde creció, adquirió un blog, etc.

Al cumplir los cinco años, se trasladó al servidor de Cauterized. Desgraciadamente, en otoño de 2007 un error fatal destruyó todo su contenido. Al no haber backups (o estar ilocalizables), el dominio quedó dormido hasta hoy, 13 de enero de 2010, cuando, celebrando su noveno cumpleaños, despierta de un largo sueño y vuelve a la vida. En los próximos días intentaré rescatar algunos fragmentos de los posts originales que han sobrevivido en archive.org.

¿Que acontecerá durante esta nueva etapa? ¿Resurgirá con energías renovadas? ¿O es éste su canto del cisne? Sólo el cierzo conoce las respuestas.

Compilación, instalación y uso de QEMU y kqemu en Ubuntu GNU/Linux

QEMU es un conocido emulador que permite ejecutar otros sistemas (como Hasefroch u otras distribuciones de GNU/Linux) en una ventana. Desafortunadamente, el sistema emulado funcionará unas diez veces más lento que una instalación nativa. kqemu es un acelerador de QEMU, un módulo para el núcleo escrito por el mismo autor de QEMU, que acelera notablemente el funcionamiento de éste (multiplica la velocidad por cinco) si emulamos un x86 en un x86 (pues qemu permite ejecutar binarios compilados para una arquitectura sobre otra distinta).

Debe advertirse que, por el momento, kqemu es gratuito, pero no libre (el autor está dispuesto a liberarlo si alguien le da dinero para compensar el tiempo invertido en él):

As a supporter of open source, the author accepts to open source the QEMU Accelerator Technology provided a company invests enough money to support the project and to recompense the author from the potential loss of revenue. Interested companies can look at the roadmap and make suggestions to the author.

(Cita de http://fabrice.bellard.free.fr/qemu/qemu-accel.html)

Ya se está desarrollando un acelerador libre, llamado qvm86, pero parece estar todavía en estado pre-alpha y no lo he probado.

Algunas alternativas a QEMU son Xen y Bochs (quizás también OpenVZ, que todavía no he mirado, pero me parece que es más comparable a Linux-VServer o User Mode Linux (UML)). Como opción privativa estaría VMWare.

Instalacion de QEMU

Para emplear el módulo acelerador no podemos instalar QEMU desde el paquete .deb binario, sino que debemos compilarlo todo nosotros mismos. Empezamos instalando las dependencias y programas necesarios para compilar:
aptitude install libsdl1.2-dev zlib1g-dev linux-headers-`uname -r` build-esential checkinstall nasm vgabios bochsbios

A continuación descargamos el código fuente de la última versión de QEMU de
http://fabrice.bellard.free.fr/qemu/download.html
y lo descomprimimos en /usr/local/src.

Parece ser que QEMU da problemas cuando se compila con gcc 4.x, así que debe compilarse con gcc 3.x:
# cd /usr/local/src/qemu-0.8.2
# ./configure --cc=gcc-3.4 --host-cc=gcc-3.4
# make
# checkinstall (para instalar usando un paquete debian, o bien make install)

Para evitar que nuestro paquete pueda ser sobreescrito al hacer un aptitude upgrade perdiendo así la aceleración, bloqueamos el paquete con
# echo "qemu hold" | dpkg --set-selections

Instalación de kqemu

Ahora descargamos de la misma página el tarball del módulo acelerador de QEMU (kqemu), y lo descomprimimos. El módulo kqemu debe compilarse con la misma versión del compilador que el núcleo que usamos (se puede ver con cat /proc/version), y para el mismo procesador, u obtendremos un error similar a
FATAL: Error inserting kqemu (/lib/modules/2.6.15-26-686/misc/kqemu.ko): Invalid module format
En nuestro caso, observamos que el núcleo ha sido compilado con la versión de gcc que usa por omisión el sistema, así que no nos preocupamos de ello.

Pensaba que con las cabeceras del núcleo linux sería suficiente, pero me encontré con este error:
# ./configure
Could not find kernel includes in /lib/modules or /usr/src/linux - cannot build the kqemu module
Source path /usr/local/src/kqemu-1.3.0pre9
C compiler gcc
Host C compiler gcc
make make
host CPU i386
./configure: line 344: test: =: se esperaba operador unario

Así que instalé el paquete del código fuente del núcleo, lo descomprimí, creé un enlace simbólico «linux» al directorio del código fuente, y copié en él el fichero de configuración.
# aptitude install linux-source-2.6.15
# cd /usr/src/
# tar jxvf linux-source-2.6.15.tar.bz2
# ln -s linux-source-2.6.15 linux
# cp /boot/config-2.6.15-26-686 linux/.config

Pero entonces pasé a encontrarme con este otro error al intentar hacer el make:
WARNING: Symbol version dump /usr/src/linux-source-2.6.15/Module.symvers
is missing; modules will have no dependencies and modversions.

y otros indicando que no encontraba autoconf.h, etc.

Finalmente lo resolví con
# cd /usr/src/linux
# make

Si quisiéramos aprovechar para personalizar nuestro núcleo, sería buena idea editar el Makefile antes de compilar, y cambiar la variable EXTRAVERSION.

Finalmente pude ya compilar kqemu:
# cd /usr/local/src/kqemu-1.3.0pre9/
# ./configure
# make

Durante el make aparece una advertencia:
Warning: could not find /usr/local/src/kqemu-1.3.0pre9/.kqemu-mod.o.cmd for /usr/local/src/kqemu-1.3.0pre9/kqemu-mod.o
pero podemos prescindir de ella.

Primero intenté instalarlo usando un paquete debian, pero me daba el error
dpkg: error al procesar /usr/local/src/kqemu-1.3.0pre9/kqemu_1.3.0pre9-1_i386.deb (--install):
intentando sobreescribir `/lib/modules/2.6.15-25-686/modules.alias', que está también en el paquete linux-image-2.6.15-25-686
dpkg-deb: el subproceso paste fue terminado por la señal (Tubería rota)

así que finalmente lo he instalado con
# cp /lib/modules/2.6.15-26-686/modules.alias /lib/modules/2.6.15-26-686/modules.alias.bak
# make install

Para cargar el módulo normalmente ejecutaríamos
# modprobe kqemu
pero como Ubuntu utiliza udev, lo hacemos con
# modprobe kqemu major=0
para que se cree el dispositivo /dev/kqemu (por supuesto también podríamos crearlo con # mknod /dev/kqemu c 250 0).

También podemos utilizar modconf para que se cargue siempre automáticamente (el módulo está en la sección misc).

Ahora debemos dar permisos al dispositivo kqemu para que todos los usuarios puedan acceder a él:
# chmod 666 /dev/kqemu
Para que udev ponga automáticamente los permisos adecuados en el arranque, editamos el fichero /etc/udev/rules.d/40-permissions.rules añadiendo las líneas
# Permisos para /dev/kqemu
KERNEL=="kqemu", MODE="0666"

Si no diésemos estos pasos, nos encontraríamos con este error al intentar usar QEMU:
Could not open '/dev/kqemu' - QEMU acceleration layer not activated
es decir, que a pesar de tener el módulo cargado, el acelerador no funcionaría.

Mientras estamos emulando algún sistema, para comprobar que el módulo acelerador está efectivamente en funcionamiento, pasamos al monitor de QEMU pulsando Ctrl-Alt-2, e introducimos la orden info kqemu. Deberíamos obtener algo así:
QEMU 0.8.2 monitor - type 'help' for more information
(qemu) info kqemu
kqemu support: enabled for user and kernel code
(qemu)

Para volver al sistema emulado pulsamos Ctrl-Alt-1

Al utilizar QEMU por primera vez me apareció esta curiosa advertencia:
Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal
error, but for better emulation accuracy either use a 2.6 host Linux kernel or
type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.

y la califico de curiosa porque sí que estoy usando un núcleo Linux 2.6… En fin, podemos hacer que se calle ejecutando esa orden.

Utilización de QEMU

Tras estudiar como instalar QEMU y el módulo acelerador kqemu en un sistema Ubuntu o Debian GNU/Linux, veamos ahora cómo usar las opciones básicas. Para más información, se puede consultar la documentación de QEMU.

Para probar la imagen ISO de una distribución en live-CD, ejecutaremos una orden similar a
$ qemu -boot d -m 224 -kernel-kqemu -cdrom gluz2_beta1.iso

La opción -boot d indica el dispositivo desde el que debe arrancar: disquete (a), disco duro (c) o CD-ROM (d).

La opción -m 224 indica cuanta memoria le asignamos a QEMU. Por omisión son 128 MB, pero si disponemos de más memoria libre, es recomendable asignarle más.
-kernel-kqemu es una nueva opción que habilita el modo de virtualización completa: tanto el código de usuario como el del núcleo invitado se ejecutan directamente en la CPU anfitriona (en el modo normal, sólo se ejecuta directamente el código de usuario, mientras que el código de núcleo es traducido dinámicamente por QEMU). Esto no funciona para todos los sistemas operativos invitados (sí la mayoría de los recientes, como GNU/Linux y Windows 2000/XP, aunque estos últimos no durante la instalación), y de momento sólo de 32 bits.

Y con la opción -cdrom gluz2_beta1.iso indicamos que la máquina virtual debe usar como unidad de CD-ROM ese fichero de imagen ISO.

Otra opción es -soundhw es1370, que habilita el sonido emulando una tarjeta con chip ENSONIQ AudioPCI ES1370 (como la SoundBlaster 128). A mí me da problemas, pero es posible que sea debido al hardware de mi máquina.

Si lo que necesitamos es poder usar dos sistemas operativos distintos simultáneamente, lo mejor es hacer una instalación en el disco duro. Para ello, empezamos creando una imagen de disco, que es un fichero que contendrá un sistema de ficheros con el sistema emulado, actuando como su disco duro

Esto se podría hacer con dd, pero normalmente lo haremos con la orden qemu-img, que admite varios formatos de imagen de disco:

raw
formato de imagen de disco en bruto (formato predeterminado). Este formato tiene la ventaja de ser sencillo y fácilmente exportable a los demás emuladores. Si nuestro sistema de ficheros admite agujeros (como ext2 y ext3), solamente se reservará espacio para los sectores escritos. Podemos conocer el tamaño real que usa la imagen con qemu-img info o ls -ls en sistemas de tipo Unix.
qcow
Formato de imagen de QEMU, el más versátil. Se usa para obtener imágenes más pequeñas en sistemas de ficheros que no admiten agujeros, como el de Windows, cifrado AES opcional y compresión basada en zlib.
cow
Formato de imagen Copy On Write de User Mode Linux. Antiguamente era el único formato de QEMU que podía crecer. Ahora se conserva solamente para mantener compatibilidad con las versiones anteriores. No funciona en Windows.
vmdk
Formato de imagen compatible con VMware 3 y 4.
cloop
Imagen Loop comprimido de GNU/Linux, útil para usar directamente imágenes de CD-ROM comprimidas, como la que usa Knoppix. Ubuntu usa squashfs en vez de cloop.

Si necesitásemos instalar uno de los sistemas de Hasecorp, podríamos ejecutar por ejemplo:
$ qemu-img create -f qcow winxp.img 10G
qcow es el formato recomendado para Hasefroch, winxp.img es el nombre del fichero de imagen, y 10G es el tamaño que le damos.

Para instalar el sistema en el fichero imagen, introducimos el CD-ROM de instalación y ejecutamos
$ qemu -boot d -m 224 -cdrom /dev/cdrom -hda winxp.img
Con la opción -hda indicamos que utilice como disco duro ese fichero de imagen.

Tras realizar la instalación, podremos arrancar el Hasefroch XP con
qemu -boot c -m 224 -hda winxp.img
Por omision arranca con la opción -net user, que proporciona una manera de usar la red. Sin embargo hay otra manera más fina de configurar la red, usando un dispositivo tun y el paquete bridge-utils (véase la documentación). Una cosa que me estaba volviendo loco: desde el sistema emulado, no podemos hacer ping a máquinas de Internet. Sin embargo, sí podemos navegar por la web, etc.

También es posible tener un directorio en el sistema anfitrión al que el Windows emulado pueda acceder por SMB de forma transparente (véase la documentación).

¿Llevas tiempo deseando echar un vistazo a FreeBSD, Plan 9 o Minix? En FreeOsZoo puedes descargar imágenes para QEMU de estos y otros sistemas, y así probarlos fácilmente.

Me voy al GeekTour '06

A última hora he decidido que hacer con mis vacaciones: me voy al GeekTour ’06. Estoy ya en Barcelona, y mañana saldré para Figueres e iniciar un viaje en bici hasta Jaca. Así que estaré offline unos 10 días. A pasarlo bien 😉

Instalación de GNU/Linux en un Apple MacBook

Desde la semana pasada tengo un ordenador portátil: un Apple MacBook. De momento estoy muy contento con él, aunque hay quien tiene razones para no comprarlo, como que se calienta demasiado como para tenerlo en las rodillas y que a algunos usuarios se les corroído misteriosamente la carcasa (Apple ya las está reemplazando).

Rápidamente instalé Kubuntu, aunque del mismo modo se podría instalar Debian, Gentoo u otra distribución. Esta computadora lleva un procesador Intel Core Duo, así que se puede usar cualquier distro para x86.

Para instalar la Ubuntu, seguí los pasos que indica vud1 en su blog, y que reproduzco a continuación con un par de pequeñas modificaciones, y el añadido de como configurar el teclado español.

Partición del disco

Antes de nada hay que hacer espacio en el disco duro, que tendremos totalmente ocupado por Mac OS X. En vez de usar BootCamp, podemos utilizar la utilidad diskutil, que según creo se incluye a partir de la versión 10.4.6 del sistema (creo que si quisiéramos tener un triple arranque con MS Windows, sí que necesitaríamos BootCamp, pero si alguna vez necesitara usar Hasefroch, recurriría a QEMU o Parallels).

Miramos las particiones de nuestro disco:

# diskutil list
/dev/disk0
#: type name size identifier
0: GUID_partition_scheme *55.9 GB disk0
1: EFI 200.0 MB disk0s1
2: Apple_HFS Macintosh HD 55.6 GB disk0s2

Según entiendo, la primera partición hace la función del BIOS de un PC normal. La partición que debemos redimensionar es la 2. Para ello hago:

# diskutil resizeVolume disk0s2 26624M "Linux" GNU 26624M "Swap" swap 2048M
Started resizing on disk disk0s2 Macintosh HD
Verifying
Resizing Volume
Adjusting Partitions

Finished resizing on disk disk0s2 Macintosh HD
You will need to manually reformat your new partitions.
WARNING: You must now reboot!

Inicialmente indiqué los tamaños en GB, pero no funcionó, mientras que señalándolos en MB curiosamente sí que funciona.

Instalación del gestor de arranque

Tras reiniciar el sistema, instalamos la aplicación rEFIt, que es un gestor de arranque, como LILO, GRUB o yaboot. Una vez descargada la imagen de disco, la abrimos y copiamos el directorio efi al directorio / de Mac OS X, de tal modo que al hacer un

# ls /efi/

nos salgan estos dos directorios:

refit tools

y activamos el rEFIt tal que así:

#cd /efi/refit
#sh ./enable.sh

Instalación de Ubuntu

Insertamos el CD de Kubuntu Dapper y reiniciamos. En principio, para que el MacBook arranque desde CD hay que pulsar la tecla C, aunque creo recordar que rEFIt ya lo hizo innecesario. Una vez arrancado el live-CD, usamos el instalador gráfico basado en Ubiquity de la manera habitual. A la hora de asignar las particiones, no debemos señalar nada para la partición EFI.

La instalación falla en el último paso, la instalación de GRUB, sobre lo que ya hay un bug abierto. Cerramos el instalador y abrimos una consola. Desde la consola lo que tenemos que hacer es montar la partición donde hemos instalado, montamos el dev y el proc y hacemos un chroot. Desde ahí instalamos y configuramos el cargador de Linux:

% sudo -s
# mount /dev/sda3 (o la partición donde hayamos instalado) /mnt
# cp /etc/resolv.conf /mnt/etc/resolv.conf (para tener unos servidores de nombres -DNS- funcionales)
# mount -t proc none /mnt/proc
# mount -o bind /dev /mnt/dev
# chroot /mnt
# vim /etc/apt/sources.list
# aptitude update
# aptitude install lilo
# aptitude dist-upgrade (para actualizar el sistema)
# aptitude install linux-686-smp (para que nos reconozca los dos procesadores del dual core :D )

En mi sources.list tengo activadas estas líneas:

deb http://es.archive.ubuntu.com/ubuntu/ dapper main restricted universe
deb http://es.archive.ubuntu.com/ubuntu/ dapper-updates main restricted universe
deb http://security.ubuntu.com/ubuntu dapper-security main restricted universe

deb http://kubuntu.org/packages/kde-latest dapper main
deb http://kubuntu.org/packages/koffice-stable dapper main
deb http://kubuntu.org/packages/amarok-stable dapper main

Desde esta misma consola editamos el fichero /etc/lilo.conf, dejándolo algo tal que así:

boot=/dev/sda3
default=Kubuntu

map=/boot/map
delay=20
append=”noapic”
image=/vmlinuz initrd=/initrd.img
root=/dev/sda3
label=Kubuntu
read-only

En otra terminal lanzamos lo siguiente para añadir el flag de arranque a la partición de Ubuntu:

#sudo parted
(parted) print
(parted) set 3 (o el número de la partición raíz de la instalación)
(parted) boot
(parted) on
(parted) quit

Volvemos a la terminal donde hemos editado el lilo y ejecutamos:

#lilo -b /dev/sda

Primer arranque

Finalmente reiniciamos la máquina, extrayendo el CD de instalación. Al reiniciar, en la pantalla del rEFIt veremos dos iconos: uno de la manzana, y otra del querido pingüino Tux (o quizás un rombo feote). En las opciones de abajo, las pequeñas, seleccionamos con las teclas cursor el segundo icono empezando por abajo a la izquierda, el del particionador. Al lanzarse sale una consola donde pregunta si queremos sincronizar con el MBR o algo así, y le decimos que sí. Acto seguido reiniciamos, y ya podremos arrancar GNU/Linux.

Mientras que el MacBook Pro creo que lleva una tarjeta gráfica ATI, nuestro MacBook lleva una tarjeta Intel (chipset i950) integrada en placa. Para que la resolución de pantalla tenga unos valores correctos (1280×800, por ejemplo), debemos instalar el paquete 915resolution (está en los repositorios de Ubuntu).

La disposición del teclado no coincide exactamente con la de un PC normal. La tecla AltGr no funciona (con lo que no se pueden escribir arrobas, tuberías (pipes), etc) y las teclas ºª y <> están intercambiadas.

Para solucionarlo en la consola he preparado este mapa de teclado, que se debe poner en /etc/console/boottime.kmap.gz.

Para solucionarlo en el sistema de ventanas X he creado este fichero .Xmodmap :

!!
!! xmodmap for Apple MacBook, Spanish keyboard
!! xmodmap para el Apple MacBook con teclado español
!! Enrique Matias Sanchez
!!
!! Cada tecla tiene un keycode (que se averigua con xev),
!! y se le asignan hasta 8 keysyms (fichero keysymdef.h):
!! 1) Cuando se pulsa la tecla sin ningún modificador
!! 2) Cuando se pulsa con Shift (mayúsculas)
!! 3) Cuando se pulsa con AltGr
!! 4) Cuando cuando se pulsa junto con AltGr y Shift
!!
! Se intercambian las teclas ºª y <>
keycode 94 = masculine ordfeminine backslash backslash backslash backslash
keycode 49 = less greater bar brokenbar bar brokenbar
!
! Manzana derecha -> AltGr
! Mayúsculas + manzana derecha -> botón central del ratón
keycode 116 = ISO_Level3_Shift Pointer_Button2
! Mayúsculas + Intro numérico -> botón derecho del ratón
keycode 108 = KP_Enter Pointer_Button3

Supongo que ambos se podrían mejorar (espero vuestros parches en los comentarios 😉 ) . El primer fichero será efectivo tras reiniciar la computadora (¡ojo si algún momento hay que reconfigurar console-data!).

Para el segundo hay que hacer xmodmap .Xmodmap cada vez que se arranque el sistema de ventanas X. Para que se haga automáticamente he puesto este script (con permisos de ejecución) en ~/.kde/AutoStart (supongo que habrá mejores maneras de hacerlo):

#!/bin/sh
xmodmap /home/quique/.Xmodmap

Como no siempre se tiene un ratón USB a mano, he emulado los clics derecho y central con pulsaciones del teclado (manzana derecha e intro numérico, en vez de los tradicionales F11 y F12). Para activar esta funcionalidad hay que instalar el paquete xkbset, y ejecutar xkbset m.

Con la versión actual del paquete del núcleo (linux-image-2.6.15-26-686) parecen funcionar correctamente la tecla Fn, el bluetooth y el sonido.

La tarjeta wireless está basada en el chip Atheros y usa los drivers madwifi, pero de momento no he conseguido ponerla en modo monitor, me escupe este error:

# iwconfig ath0 mode Monitor
Error for wireless request “Set mode” (8B06) :
SET failed on device ath0 ; Invalid argument.

Otros problemas:

  • si conecto un ratón al puerto USB que está al lado del puerto FireWire, el puntero va a saltos. En el otro puerto no da problemas.
  • La cámara de vídeo integrada todavía no va, aunque Ronald S. Bultje está trabajando para que funcione la iSight sobre Linux
  • A veces el teclado no reaccionaba bien, iba lento, ignoraba algunas pulsaciones o lo que es peor, repetía dos o más veces una pulsación. Éste era el principal problema, pues cuando sucedía, era muy difícil trabajar. Tal vez fuese cuestión del SMP (el live-CD funciona bien) o del orden en que se cargan los módulos. Desde hace dos o tres días no me ha sucedido, ¿quizás se haya arreglado de alguna manera?

Creación de una distribución basada en Ubuntu

En este artículo se explica como remasterizar (personalizar) la distribución (K)Ubuntu Dapper GNU/Linux. Es poco más que una traducción de los artículos

Requisitos

Antes de nada, debemos asegurarnos de que tenemos todo lo necesario:

  • unos 3-5 GB de espacio libre en disco
  • un CD o imagen ISO de (K)Ubuntu Dapper (http://releases.ubuntu.com/dapper/)
  • squashfs-utils y mkisofs instalados
  • un núcleo que admita squashfs (como el que viene de serie en Kubuntu Dapper
  • qemu instalado, para probar las imágenes que creemos

Extracción del CD

Cargamos el módulo squashfs:
$ sudo modprobe squashfs

Montamos la imagen ISO o el CD-ROM
$ sudo mount -o loop kubuntu-6.06-desktop-i386.iso /mnt
ó
$ mount /cdrom

Extraemos el contenido de la imagen en un directorio llamado «extract-cd». En mi caso lo hago en una partición aparte (hdb1), que debe estar montada de modo que permita la ejecución de binarios.
$ mkdir /media/hdb1/extract-cd
$ rsync –exclude=/casper/filesystem.squashfs -ax /mnt/ /media/hdb1/extract-cd

El CD contiene varios subdirectorios, incluyendo uno con una selección de programas libres para Windows. Si lo deseamos podemos borrarlo, ahorrando unos 95 MB.
$ sudo rm -rf /media/hdb1/extract-cd/programs
Igualmente podemos borrar el directorio disctree.

Extracción del sistema

Montamos el sistema de ficheros comprimido con squashfs
$ sudo mkdir /mnt2
$ sudo mount -t squashfs -o loop /mnt/casper/filesystem.squashfs /mnt2/

Extraemos el contenido del squashfs en un directorio llamado edit
$ mkdir /media/hdb1/edit
$ sudo cp -a /mnt2/* /media/hdb1/edit/

Ya podemos desmontar el CD y el sistema comprimido:
sudo umount /mnt2
sudo umount /mnt
sudo rmdir /mnt2

Personalización

Copiamos nuestro fichero /etc/resolv.conf para tener unos DNS que consultar al acceder a Internet
$ sudo cp /etc/resolv.conf edit/etc/

Finalmente entramos en nuestro nuevo sistema:
$ sudo chroot edit
# mount -t proc proc proc
# mount -t sysfs sys sys

Ahora podemos hacer todos los cambios que queramos. Podemos empezar editando el fichero /etc/apt/sources.list para modificar los repositorios, actualizar, y añadir/quitar paquetes.

Por ejemplo podemos eliminar los paquetes de idioma que no nos interesen (esto elimina también el paquete kubuntu-live, pero no lo necesitamos para nada)
# aptitude purge language-pack-ar language-pack-ar-base language-pack-bn language-pack-bn-base language-pack-de language-pack-de-base language-pack-fr language-pack-fr-base language-pack-hi language-pack-hi-base language-pack-nl language-pack-nl-base language-pack-kde-ar language-pack-kde-ar-base language-pack-kde-bn language-pack-kde-bn-base language-pack-kde-de language-pack-kde-de-base language-pack-kde-fr language-pack-kde-fr-base language-pack-kde-hi language-pack-kde-hi-base language-pack-kde-nl language-pack-kde-nl-base language-pack-kde-zh language-pack-kde-zh-base
e instalar otros idiomas que sí nos interesen:
# aptitude install language-pack-an language-pack-an-base

Limpieza

Borramos los ficheros que se hayan ido creando
$ sudo rm ~/.bash_history ~/.viminfo [etc]
$ sudo rm -rf /tmp/*

Los paquetes deb que hayamos descargados y estén en la cache:
$ sudo apt-get clean

Y finalmente desmontamos los sistemas de ficheros especiales y salimos del chroot
$ sudo umount proc
$ sudo umount sys
$ exit

Preparación del CD

Podemos editar el fichero extract-cd/isolinux/isolinux.cfg y añadir
preseed/locale=es_ES kbd-chooser/method=es
a las entradas append para que el CD arranque directamente en castellano.

Le damos un nombre a la imagen en extract-cd/README.diskdefines
$ sudo vim extract-cd/README.diskdefines

Regeneramos el manifest (lista de los paquetes del sistema):
chmod +w extract-cd/casper/filesystem.manifest
sudo chroot edit dpkg-query -W –showformat=’${Package} ${Version}n’ > extract-cd/casper/filesystem.manifest

Cuando se ejecuta el instalador del CD de escritorio, lo copia todo al sistema objetivo, pero después hace limpieza y elimina los paquetes que no estén en un segudo fichero llamado filesystem.manifest-desktop. Así se evita que en la instalación se incluya el propio instalador, por ejemplo.

Podemos filtrar el manifest con un script de sed. Creamos un fichero /tmp/filtro con este contenido:
/casper/d
/libdebian-installer4/d
/os-prober/d
/ubiquity/d
/ubuntu-live/d
/user-setup/d

y ejecutamos
cd /media/hdb1/extract-cd/casper
sed -f /tmp/filtro filesystem.manifest-desktop
rm /tmp/filtro

Comprimimos el sistema de ficheros (esto puede tomar 15-20 minutos, así que podemos salir a echar un café)
$ sudo mksquashfs edit extract-cd/casper/filesystem.squashfs

Calculamos las sumas MD5
$ (cd extract-cd && find . -type f -print0 | xargs -0 md5sum > md5sum.txt)

Y creamos la imagen ISO
$ cd extract-cd
$ mkisofs -r -V “MI_DISTRO” -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../midistro.iso .

Por último, podemos probar la imagen de CD creada con el emulador QEMU
$ qemu -cdrom cdname.iso -boot d