Me compré un Rasberry Pi pero como en tres semanas es que lo van a enviar (y hay que agregar un tiempo adicional por el servicio de envío) entonces decidí ver qué podía ir leyendo sobre el Raspberry. Luego se me ocurrió la idea de tratar de emular el Rasberry Pi para ver un poco más y en seguida me vino a la mente QEMU, ya que el Rasbperry Pi viene con un procesador ARM1176. En una búsqueda rápida me conseguí este blog que comentan cómo hacerlo. Pero no quise usar la imagen del proyecto Raspberry sino una de Raspbian, en particular la imagen Hexxeh. Por último, y como quería hacer pruebas sin necesidad de estar usando a interfaz gráfica, investigué un poco cómo hacer un puente (bridge) en QEMU. Luego de eso me puse a configurar la imagen como siguieren en Raspbian, ya que viene muy básica, y le quité LXDE para colocar XFCE con Slim. Aquí explico cómo hice todo:
Imagen Hexxhex
Me bajé la imagen de Raspbian Hexxeh y apliqué todos los cambios sugeridos:
- Instalación de servidor SSH y regeneración de las llaves (cosa que deben hacer si descargan esta imagen ya que las llaves públicas y privadas deben ser únicas). Basta con hacer lo siguiente:
# rm /etc/ssh/ssh_host_* # dpkg-reconfigure openssh-server
- Actualicé el listado de paquetes
- Instalé XFCE, y Slim (login manager) y quité LXDE porque me parece feo y mas pesado que XFCE.
- Actualicé la zona horaria a la de Caracas y ajusté el tiempo vía ntp.
- Coloqué los locales a US_us UTF8
- Configuré la distribución del teclado a español latinoamericano.
Si quieres personalizar esta imagen como se describe arriba puedes ver los pasos sugeridos en la página de Raspbian Hexxeh.
Raspbian en QEMU
Ahora para poner a correr Raspbian en QEMU debes hacer lo siguiente:
- Descargar el kernel para el procesador:
$ wget http://xecdesign.com/downloads/linux-qemu/kernel-qemu
- Descomprimir la imagen de Raspbian que hayan descargado. Coloco como ejemplo la imagen de Hexxeh pero puedes probar con cualquier otra:
$ unzip raspbian-r3.zip
- Lanzar QEMU con las siguientes opciones:
$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2" -hda raspbian-r3/raspbian-r3.img
Tengan en cuenta que es una emulación, y por ende no todo el hardware del Raspberry está soportado. Por ejemplo al iniciar se puede ver que la primera partición no se carga, que corresponde a la partición /boot, la cual es suplida por el kernel que se descargó.
Configuración del puente en QEMU
Otra cosa que quería hacer era poder acceder a la emulación desde otra máquina. La idea es no tener que depender del ambiente gráfico sino poder acceder desde ssh a la imagen Raspberry para, por ejemplo, instalar paquetes con aptitude. Para ello tuve que hacer un puente (bridge) como explico a continuación:
Instalación de paquetes necesarios
Primero debemos descargar los siguientes paquetes:
# aptitude install bridge-utils uml-utilities
Permisos sudo
Para que pueda asignarse las interfaces al puente se debe dar permiso de ejecución al usuario que lanzará la máquina virtual. Para ello se debe configurar sudo a través de la orden visudo:
# This file MUST be edited with the 'visudo' command as root. # # Please consider adding local content in /etc/sudoers.d/ instead of # directly modifying this file. # # See the man page for details on how to write a sudoers file. # Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"# Host alias specification# User alias specification# Cmnd alias specification Cmnd_Alias QEMU=/sbin/ifconfig, \ /sbin/brctl # User privilege specification root ALL=(ALL:ALL) ALL lgallard ALL=NOPASSWD: QEMU# Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL # See sudoers(5) for more information on "#include" directives: #includedir /etc/sudoers.d
En este caso lgallard es el usuario que se le concedió permisos para usar ifconfig y brctl.
Configuración del puente
Se debe configurar el archivo /etc/network/interfaces para que automaticamete levante la interfaz que servirá de puente. Para ello debes deshabilitar las interfaces (por ejemplo haciendo ifdown eth0) y dejar solo el puente como se muestra a continuación:
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5).# The loopback network interface auto lo iface lo inet loopback# The bridge network interface(s)auto br0iface br0 inet dhcp bridge_ports eth0 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off
Después de esto puede levantar el puente escribiendo:
# ifup br0
Script de inicio de interfaz de QEMU (/etc/eqemu-ifup)
Este script permite levantar las interfaces y el puente cuando se levanta la máquina con QEMU. Para ellos se debe editar el archivo /etc/qemu-ifup con la siguiente información:
#!/bin/sh #sudo -p "Password for $0:" /sbin/ifconfig $1 172.20.0.1 echo "Executing /etc/qemu-ifup" echo "Bringing up $1 for bridged mode..." sudo /sbin/ifconfig $1 0.0.0.0 promisc up echo "Setting tap0" sudo tunctl -t tap0 -u lgallard echo "Adding $1 to br0..." sudo /sbin/brctl addif br0 $1 sleep 2
Ahora para correr la imagen con la interfaz de red con el puente debes lanzar QEMU con las siguientes opciones:
qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2" -net nic,vlan=0 -net tap,ifname=tap0,script=/etc/qemu-ifup -hda raspbian-r3/raspbian-r3.img
Capturas
Aquí dejo algunas capturas de la emulación de QEMU:
Como puede verse en la última captura, no todo está instalado en la imagen por lo que si no funciona algo debes descargarlo. En este caso podría instalarse el navegador midory:
# aptitude install midory
O cualquier otro navegador de tu preferencia.