Emulación de Raspberry Pi con QEMU


XFCE4 - Raspberry Pi

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:

  1. Descargar el kernel para el procesador:
    $ wget http://xecdesign.com/downloads/linux-qemu/kernel-qemu
  2. 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
  3. 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 br0
iface 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:

Raspberry Pi - Hexxeh image

Raspberry Pui - Slim

Raspberry Pi - SSH

Rasbperry Pi basic

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.

Referencias


,

  1. #1 by Luis Gallardo on 05/09/2014 - 10:22

    @Miguelangel no lo he hecho, pero seguro no debes tener problemas porque Linux hace rato soporta usb, cd/dvd. Recuerda que a la larga el Raspberry es un Linux, y con lo automatizado que están las distro de Raspberry y XMBC, seguro lo conectas a un puerto USB y lo reconoce a la primera. Saludos!

  2. #2 by Miguelangel Esis on 04/09/2014 - 6:22

    saludos luis

    sigo tu blog desde hace tiempo te pregunto lo siguiente hace dias yo compre un raspberry b+ la ultima version que trae mas puertos de ubs y el cambio de tarjeta sd a microsd

    mi pregunta es los siguien yo realize al igual que tu mi htpc con el raspbmc pero quiero ver si es posible o lo ha intetado de colocar una unidad de cd/dvd por medio de usb al raspberry y reproducir dvd en el xbmc gracias por tu ayuda y tus comentarios

  3. #3 by Luis Gallardo on 25/02/2013 - 10:06

    @Zizou Como minimo yo lo quiero usar como centro multimedia, y centro de descarga…con una especie de SAN. Y luego el tema de los GPIO se ve interesante. Saludos!

  4. #4 by Zizou on 25/02/2013 - 10:03

    Casualidad me compré uno la semana pasada, también me llega como en dos semanas. Voy a ver a que juego con el raspberry. Saludos.

(No será publicado)