Debian GNU/Hurd en VirtualBox

Índice

1. El Hurd.
2. Elección del medio de instalación.
3. Preparativos.
4. Instalación de Debian GNU/Hurd mediante tarball.
5. Configuración de Debian GNU/Hurd.
6. Referencias.

1. Hurd

Hurd es un proyecto de GNU, pensado para convertirse en sustituto del núcleo de Unix. Se trata de un conjunto de servidores que funcionan sobre el micronúcleo Mach, y que implementan sistemas de archivos, protocolos de red y archivos de control de accesos, así como otras características también soportadas por el núcleo de Unix o similares (como es Linux).

El Hurd, junto al micronúcleo GNU Mach, la GNU C Library y otros programas GNU y non-GNU en el sistema GNU, provee un sistema operativo básicamente completo y usable. No está listo para su uso en producción, ya que todavía tiene muchos bugs y le faltan características. Sin embargo, debería ser una buena base para desarrollo en el futuro y uso de aplicaciones no críticas. Podríamos ejecutar varias instancias del Hurd en paralelo, e incluso corregir servidores críticos en una instancia de Hurd con gdb ejecutándose en otra instancia de Hurd. Puedes ejecutar el X window system, aplicaciones que lo usen, y aplicaciones de servidor avanzadas como el servidor web Apache.

En el lado negativo, el soporte para dispositivos es bastante pobre. Aunque la interfaz POSIX está implementada, algunas interfaces adicionales como la memoria compartida POSIX o semáforos están todavía en desarrollo.

2. Debian GNU/Hurd. Elección del medio de instalación

Debian GNU/Hurd es una distribución de GNU/Hurd creada por los desarrolladores de Debian, y su instalación será objetivo de los siguientes puntos. La versión actual es Debian GNU/Hurd K16 series.

El uso de la virtualización de la mano de VirtualBox nos permitirá realizar todas las pruebas que queramos sin que nuestro sistema "real" se vea afectado lo más mínimo. Básicamente tenemos dos alternativas, como son los CD's de instalación y el tarball de Hurd.

Si nos decidimos por el CD de instalación hemos de visitar alguno de los sitios que se proponen, como por ejemplo éste. Una vez dentro escogemos lo que se ajuste a nuestras necesidades. Podemos elegir entre una mini-imagen .iso de instalación, cuatro imágenes de CD's y dos de DVD's

El segundo método (uso del tarball de Hurd) es algo más laborioso y necesita de una instalación existente de GNU/Linux. Sin embargo, y especialmente si nuestro sistema es Debian, nos ofrece algunas ventajas como la posibilidad de usar el paquete crosshurd y la existencia de un GRUB instalado para el arranque de nuestro sistema Hurd.

3. Preparativos

Si nos decidimos por la última opción, en primer lugar necesitamos crear la "cuna" del sistema. Así, nos ponemos a la instalación de Debian GNU/Linux sobre VirtualBox. Será necesario, si no lo tenemos ya, obtener un medio de instalación de Debian. Tenemos muchas opciones, y realmente no importa con cuál nos quedemos. En este caso optamos por un netinstall de Debian Etch, así que vamos a la web de Debian y la descargamos

En el caso objeto de estudio partimos de un entorno Archlinux, y dado que no ha sido configurado para cargar el módulo vboxdrv de VirtualBox al iniciar, lo cargamos manualmente

# modprobe vboxdrv

Iniciamos VirtualBox, y nos encontraremos con un entorno muy intuitivo. Seleccionamos Nueva y seguimos las instrucciones del asistente gráfico para crear nuestra nueva máquina virtual. A la hora de dimensionar el disco duro hemos de tener presente que necesitaremos unos 2 GB para albergar a Hurd, además del espacio que tengamos pensado dedicar a Debian GNU/Linux.

Si necesitas ayuda para instalar y/o configurar VirtualBox, puedes pasarte por este otro artículo.

Una vez realizados los ajustes necesarios pasamos a la instalación. Montamos en la unidad de CD-ROM virtual la imagen de la netinstall de Etch e iniciamos el proceso. Sólo un apunte; al llegar a la sección del particionado de discos es conveniente la elección del modo manual, ya que la partición dedicada a swap es crítica en los sistemas GNU/Hurd. Si se agota, Mach se vuelve inestable. En nuestro caso tenemos un disco duro virtual de 8,6 GB, y dedicaremos 2 GB para Hurd, 510 MB a la partición de swap, que además será compartida entre los sistemas GNU/Linux y GNU/Hurd, y el resto para Debian GNU/Linux, con lo que quedaría así:

Maestro IDE1 (hda) - 8.6 GB VBOX HARDDISK
#3   primaria   6.1 GB  B   f  ext3   / 
#2   primaria   2.0 GB
#5   lógica     510 MB   F    intercambio  intercambio

Es muy importante tener en cuenta que a la partición destinada a Hurd no hay que asignarle sistema de ficheros alguno, ni hacerla arrancable, simplemente la dejamos ahí, la marcamos como "no utilizar" y ya nos encargaremos de ella cuando llegue el momento.
En principio, a menos que queramos aprovechar las circunstancias para dejar terminada una instalación de Debian con algunas funcionalidades extra, no es necesario instalar más que el sistema base. Una vez terminado el proceso e instalado el GRUB necesitaremos desmontar la imagen del netinstall y reiniciar la máquina. Hacemos login como root e iniciamos los pasos para la instalación de nuestro nuevo sistema.


# debian login: root
Password:
# aptitude update
# aptitude upgrade

4. Instalación de Debian GNU/Hurd mediante tarball

Nos ocuparemos ahora de aquella partición que reservamos en el proceso de instalación. Recordemos que, en nuestro caso, es hda2

Cuando un determinado kernel es dueño de un sistema de archivos, otros kernel podrán tener acceso al sistema, pero quizá con algunas limitaciones. Hurd soporta varias extensiones del sistema de ficheros ext2. Para poder aprovechar esto tenemos que hacer a Hurd dueño de la partición

Crearemos el sistema de ficheros ext2 en la partición con mke2fs, y haremos a Hurd dueño del nuevo sistema de archivos con -b 4096 -I 128 -o hurd

# mke2fs -b 4096 -I 128 -o hurd /dev/hda2

El siguiente paso es la obtención del sistema base. Como siempre, tenemos varias alternativas. Una de las ventajas teóricas de trabajar sobre un sistema Debian es la posibilidad de usar crosshurd.

Según podemos leer en www.debian.org ,

crosshurd uses apt and a bit of black magic to setup a functional Debian system. It supports the following target systems:

- linux-gnu (GNU/Linux)
- gnu (GNU/Hurd)
- kfreebsd-gnu (GNU/kFreeBSD)
- knetbsd-gnu (GNU/kNetBSD)

Así, con crosshurd podríamos construir un sistema Debian funcional. Sin embargo no lo utilizaremos puesto que al ejecutarlo nos encontramos con algunos errores. Al parecer no es posible la obtención del tarball porque el sitio de descarga predeterminado no se encuentra operativo.

Así, descargaremos el tarball del sistema base. Creamos /gnu para montar la partición,


# mkdir /gnu
# mount -t ext2 /dev/hda2 /gnu

No es fácil si eres principiante encontrar un tarball válido y/o actualizado. Muchos de los sitios aconsejados están caídos, o el proyecto está descontinuado. Sin embargo, navegando por la web de Debian, encontramos esto

Así, lo descargamos, lo guardamos en /gnu y descomprimimos

# wget http://ftp.debian-ports.org/debian-cd/hurd-i386/current/gnu-2007-12-01.t...
# mv gnu* /gnu/
# cd /gnu
# tar xvzf gnu-2007-12-01.tar.gz

Hurd necesita de GRUB para arrancar. Existen varios métodos para darle un GRUB a Hurd, como son el uso de un live-CD de alguna distribución linux o el paquete grub-disk. Sin embargo, en nuestro caso aprovecharemos el GRUB que nos proporciona Debian GNU/Hurd. Antes de entrar en faena dediquemos tiempo a recordar la nomenclatura de las particiones en Linux, Hurd y GRUB.

En Hurd, si el disco en cuestión es un disco SCSI, necesitamos saber el número del dispositivo SCSI; si es un disco IDE, debemos saber en qué controladora está el disco y si es maestro o esclavo. Hurd usa el convenio de nomenclatura de BSD; los discos están ordenados de acuerdo a su localización física, numéricamente, empezando desde cero. Este esquema de nomenclatura es bastante similar al encontrado en Linux. Ahí, el disco maestro en la controladora primaria se designa por hda y el esclavo por hdb. En la controladora secundaria designamos al maestro y al esclavo como hdc y hdd respectivamente. Bajo Hurd, hda se convertirá en hd0 y hdb en hd1

En Hurd, al igual que en BSD, se llaman tajadas (slices) a las particiones, y se numeran empezando desde el 1. De esta forma, para dar nombre a una partición, tomaremos el nombre del disco, añadiremos una 's' y el número de partición. De nuevo, es parecido a Linux, excepto en que no hay "s". Por ejemplo, hda1 sería hd0s1

GRUB, el cargador de arranque, usa una nomenclatura totalmente diferente. Pregunta a la BIOS y añade cada disco en orden a un array. Tanto los discos como las particiones se enumeran usando arrays que empiezan por cero. El formato es de la forma hd (disco, partición). Así, hd (0, 1) se refiere a la segunda partición del primer lector detectado por la BIOS.

Aclarados los conceptos pasamos a editar menu.list para incluir nuestro nuevo sistema. Recordemos que la partición es hda2

# nano /boot/grub/menu.lst

title Debian GNU/HURD
root (hd0,1)
kernel (hd0,1)/boot/gnumach.gz root=device:hd0s2
module (hd0,1)/hurd/ext2fs.static --multiboot-command-line=${kernel-command-line} --host-priv-port=${host-port} --device-master-port=${device-port} --exec-server-task=${exec-task} -T typed ${root} $(task-create) $(task-resume)
module (hd0,1)/lib/ld.so.1 /hurd/exec $(exec-task=task-create)
boot

El editor nano inserta automáticamente un salto de línea al final de líneas largas (como este caso), así que el formato pasa a ser ilegible para GRUB. Existen dos maneras fáciles de solucionar esto. Podríamos, por ejemplo, utilizar un editor distinto a nano para editar menu.lst, o bien usar el carácter <\>, que le indica a GRUB que debe leer la siguiente línea como si fuese parte de la actual. Así, nos quedaría

    
module /hurd/ext2fs.static \
--multiboot-command-line=${kernel-command-line} \
--host-priv-port=${host-port} --device-master-port=${device-port} \
--exec-server-task=${exec-task} \
-T typed ${root} $(task-create) $(task-resume)

GRUB lo interpretará todo como una sola línea.

Dado que Hurd aún no ha sido configurado, debemos iniciarlo en modo >single user mod. Añadimos a la línea de kernel '-s'

kernel (hd0,1)/boot/gnumach.gz root=device:hd0s2 -s

Instalamos el GRUB con las modificaciones que hemos realizado, y si todo es correcto reiniciamos la máquina virtual


# grub-install /dev/hda
# reboot

Al reiniciar, si todo ha ido bien nos encontraremos con una nueva entrada en el GRUB, la de Debian GNU/Hurd. Vamos a entrar por primera vez en nuestro nuevo sistema, aún sin configurar.

5. Configuración de Debian GNU/Hurd

Un prompt de shell nos da la bienvenida.


sh-3.1#

Siempre que utilicemos el modo single user mode será necesario hacer

# export TERM=mach

Ejecutaremos ahora la rutina native-install. Se implementarán los traductores y se instalarán paquetes de software esenciales

# ./native-install

Llegados a este punto nos damos cuenta de que el teclado no está configurado, así que tendremos que ir probando las teclas hasta dar con las adecuadas. Terminado el proceso, reiniciamos y de nuevo en single user mode ejecutamos native-install.

Una vez realizadas las dos pasadas de native-install seguimos con la configuración.

El sistema de ficheros de Hurd permite la implementación de traductores en cualquier archivo o directorio del que seamos dueños. En líneas generales, un traductor es cualquier servidor de Hurd que provea la interfaz básica de sistema de archivos. Los "translators nodes" son algo intermedio entre los links simbólicos de Unix y los puntos de montaje.

Cuando un programa intenta acceder al contenido de un "translator node", el servidor del sistema de ficheros redirecciona la petición al traductor apropiado, iniciándolo si fuese necesario. Entonces, el nuevo traductor atiende la petición del cliente. Las librerías C de GNU hacen este proceso transparente al cliente.

Los traductores corren con los privilegios del dueño del "translated node", por lo que no pueden ser usados para comprometer la seguridad del sistema. Cualquier usuario puede escribir sus propios traductores.

Será necesario construir los traductores para la swap, home (opcional) y el CD-ROM. Nos situamos en /dev y ejecutamos el script MAKEDEV.

Añadimos el traductor para la swap y el CD-ROM. Recordemos que en nuestro caso la swap es compartida con Debian GNU/Linux y se encuentra en hda5. En cuanto al CD-ROM, si en el arranque de Hurd observamos con atención obtendremos que, en nuestro caso, es hd2


# cd /dev
# ./MAKEDEV hd0s5 hd2

A continuación editamos /etc/fstab para añadir la partición de swap. Ya nos habremos percatado de que el editor por defecto de GNU/Hurd es nano.


# export TERM=mach (si no lo hemos hecho antes)
# nano /etc/fstab

     device          mount point    filesystem type  options  dump pass
     /dev/hd0s2      /              ext2fs           rw       1    1
     /dev/hd0s5      none           swap             sw       0    0
     /dev/hd2        cdrom          iso9660          ro,noauto 0   0

Pasamos ahora a configurar la conexión a internet. Usaremos el comando settrans.

En primer lugar tenemos que prestar atención en el arranque de nuestro sistema Debian GNU/Hurd, para comprobar si el microkernel detecta nuestra tarjeta de red como eth0. A continuación hacemos uso de settrans para configurar el traductor.


# settrans -fgcap /servers/socket/2 /hurd/pfinet -i eth0 \
-a a.b.c.d -m e.f.g.h -g i.j.k.l

En este ejemplo, settrans usa las opciones 'f', 'g', 'c', 'a', y 'p'.

-fg fuerza a todo lo vinculado con /servers/socket/2 y /hurd/pfinet a parar.
-c para crear el traductort
-ap pone /server/socket/2 y /hurd/pfinet en modo activo pasivo. En modo pasivo la configuración se mantiene incluso tras reiniciar o apagar la máquina.

-i eth0, la interfaz que estamos configurand
-a a.b.c.d, la dirección ip de la máquina
-m e.f.g.h, la máscara de la máquina
-g i.j.k.l, el gateway de la máquina (puerta de enlace)

Desgraciadamente, GNU/Hurd no tiene cliente DHCP. Sin embargo, al tener otro sistema operativo, concretamente Debian GNU/Linux instalado en la misma máquina (en este caso virtual), podemos obtener los datos necesarios con algunos "trucos".

Reiniciamos la máquina virtual y entramos en nuestro sistema Debian GNU/Linux. Como root ejecutamos las órdenes


# ifconfig
# route

Observamos los resultados. ifconfig nos proporciona inet addr y Mask, y route nos dará el valor de la puerta de enlace (gateway). Necesitaremos también los archivos /etc/resolv.conf y /etc/hosts. Sencillamente, los abrimos y anotamos su contenido para copiarlos en nuestro sistema GNU/Hurd

# nano /etc/resolv.conf
     search mydomain           
     nameserver xxx.xxx.xxx.xxx
     nameserver xxx.xxx.xxx.xxx


# nano /etc/hosts

Reiniciamos y, de nuevo en single user mode, entramos en el sistema GNU/Hurd. Ejecutamos settrans con los valores que hemos obtenido anteriormente, y que hemos anotado, y creamos los archivos /etc/hosts y /etc/resolv.conf gemelos de Debian GNU/Linux en nuestro sistema Debian /GNU/Hurd

Sólo resta modificar el GRUB para poner el arranque de GNU/Hurd en modo normal. Volvemos a iniciar la máquina con Linux


# nano /boot/grub/menu.lst

y borramos la '-s' que anteriormente habíamos añadido a la línea del kernel.


grub-install /dev/hda

Finalmente, reiniciamos y entramos en nuestro recién instalado y configurado sistema Debian GNU/Hurd en modo multiusuario.

GNU (0.3) (hurd) (console)

Use 'login USER' to login, or 'help' for more information
login>

6. Referencias

http://www.debian.org/ports/hurd
http://www.gnu.org/software/hurd/