Una estrategia para desarrollar en Minix

En Diseño e implementación de Sistemas Operativos (diso, de a aquí en mas) tenemos que tocar el código fuente del kernel Minix. El primer trabajo práctico se trata de la implementación de una llamada al sistema.

Por supuesto que utilizamos algún emulador para correr este mini Unix. Pero ¿cómo trabajar? ¿cómo modificar el kernel y testearlo? ¿Desde Minix con vi y la shell que no recuerda los comandos que ejecutamos?. Estaría bueno trabajar en GNU/Linux (o el sistema que utilicemos), mover los cambios de alguna forma a la partición de Minix, compilar allí y verificar que todo funcione correctamente.

Podríamos crear una partición raw desde QEMU. Luego la montamos en GNU/Linux, trabajamos allí, luego iniciamos Minix con esa partición para compilar y probar los cambios. El problema de esta solución es que sigue siendo incómoda: no podemos tener montado en ambos lados (nuestro sistema y Minix) la misma partición. Ya lo probé, y si bien parece funcionar, provoca inconsistencias en el file system. En realidad, este método no funciona si no remontamos la partición.

La solución que hallé fue configurar Minix para la red y usar el servidor ftp. A continuación les doy los pasos a seguir para llegar a esto.

Primero, hay que compilar Minix con soporte de Red (vale aclarar que estamos hablando de Minix 2.0.2). Sin embargo, no es tan sencillo. Los problemas vienen con la placa de red que emula QEMU. Si bien podemos cambiar el modelo (-net nic,model=modelo), la placa mejor soportada es NE2000, por lo que ví. Podemos emular la versión ISA o PCI. No investigué la primera. Para darle soporte PCI a Minix hay que parchear (son tres cambios chiquitos) el archivo /usr/src/kernel/dp8390.c. Este archivo corresponde a la tarea DP8390, encargada de manejar la placa de red NE2000. Desde aquí pueden bajar el parche. No me acuerdo de qué pagina lo saqué.

Una vez que terminamos de compilar, copiamos la imagen en algún lugar y cerramos el sistema (shutdown) y salimos de QEMU. Como root, volvemos a ejecutar el emulador, de la siguiente forma:

# qemu -hda minix202 -net nic -net tap

La opción “-net nic” hace que se emule la placa de red (por defecto el modelo ne2k_pci), y la “-net tap” crea un dispositivo en nuestro Linux, /dev/net/tun, que podemos configurar como queramos (por esta razón necesitamos correr el emulador como root). Si usan Debian, ya tienen un script /etc/qemu-ifup, que se encarga de configurar dicho dispositivo con la dirección IP 172.20.0.1. Listo, ya estamos en contacto con el sistema guest. Sólo falta configurar correctametne Minix.

Cuando arranca el Boot Monitor, opriman Ctrl-Alt-2, para ir a la shell de QEMU. Vamos a verificar si se cargó correctamente la placa de red, y ver en qué IRQ y qué dirección posee.

(qemu) info network

ne2000 pci macaddr=…
(qemu) info pci

Ethernet controller: PCI device…
IRQ 11.
BAR0: I/O at 0xc100…

Para no extenderme demasiado con el Boot Monitor, les dejo esta imagen para que vean cómo lo configuré. Obviamente, cambien las opciones según su sistema.

Boot Monitor

La imagen tiene un link para verla en tamaño original, por si no lo ven bien en esta página.

El paso siguiente es configurar RARP, para indicarle la dirección IP de nuestro Minix. Abran el archivo /etc/ethers y coloquen la dirección MAC de la placa de red emulada (información que obtuvimos de la consola de QEMU), un tab, y el nombre de la máquina (por ejemplo “minix”). Más info con “man ethers”.

Con esto sólo mapeamos la dirección MAC con un nombre de host. Para obtener la IP, editamos el archivo /etc/hosts, agregamos el nombre de nuestro host y su dirección IP (recuerden que la dirección seteada por QEMU en Linux es 172.20.0.1, con los dos primeros octetos representando la red, así que usen una IP compatible a eso). También es bueno agregar ya en este archivo una entrada para su host Linux.

Con esto, y si no me olvidé de mencionar nada, ya tenemos contacto con el mundo emulado. Hagan un ping desde su Linux o desde su Minix para verificar. Ahora simplemente resta configurar el servidor ftp.

Yo uso directamente el usuario root. Sea cual sea el usuario que usen para loguearse, ponganle un password (sino no funciona). Listo. Usando Nautilus o Konqueror se conectan, editan lo que tienen que editar, guardan, compilan, prueban, etc etc etc… no hace falta montar ni desmontar nada cuidando de no dañar el file system.