Emular la Raspberry Pi con Raspbian utilizando QEMU

Introducción

raspbianEs posible ejecutar Raspbian (ARM 1176) desde un PC (x86) mediante el uso de QEMU.

La emulación no es perfecta ya que aún no incluye todos los componentes ni es muy rápida, sin embargo será útil para efectos de experimentación.

Instalación de QEMU

$ sudo aptitude install qemu-system-arm qemu-system-common qemu-utils

Verificar que se cuenta con el soporte necesario para la CPU 1176 o la 1136-r2.

$ qemu-system-arm -cpu help | grep 1176

$ qemu-system-arm -cpu help | grep 1136

Si su distribución no cuenta con el soporte necesario, es posible compilar QEMU con soporte para ARM desde fuentes.

Si se desea utilizar Windows, es posible obtener una versión reciente de la distribución binaria de QEMU.

Obtener Raspbian

Descargar la versión mas reciente disponible en el sitio web oficial.

$ wget http://downloads.raspberrypi.org/raspbian_latest

Verificar la integridad del paquete descargado comparando su hash SHA1 con el especificado en el sitio de descargas oficial.

$ sha1sum 2014-01-07-wheezy-raspbian.zip

9d0afbf932ec22e3c29d793693f58b0406bcab86  2014-01-07-wheezy-raspbian.zip

Descomprimir el paquete descargado para obtener la imagen del sistema operativo.

$ unzip 2014-01-07-wheezy-raspbian.zip

Obtener el kernel

Para poder realizar la emulación de ARM desde x86 es necesario obtener un kernel compatible.  Al parecer el kernel mas utilizado para este tipo de emulación es el construido por xecdesign.com.

$ wget http://xecdesign.com/downloads/linux-qemu/kernel-qemu

Primer boot

En este primer inicio del sistema operativo será necesario realizar algunos ajustes al sistema operativo.

$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" -hda 2014-01-07-wheezy-raspbian.img

Tenga en cuenta las siguientes recomendaciones.

  • Ajuste el nombre del archivo de la imagen del sistema operativo según la versión descargada.
  • No asigne mas de 256MB de memoria RAM a la emulación.

Comentar la siguiente línea en el archivo ld.so.preload.

$ vi /etc/ld.so.preload

    # /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so

De manera opcional, crear el archivo 90-qemu.rules con el siguiente contenido con el fin de crear enlaces a los dispositivos de los discos con nombres iguales a los utilizados por la Raspberry Pi.

$ vi /etc/udev/rules.d/90-qemu.rules

    KERNEL=="sda", SYMLINK+="mmcblk0"
    KERNEL=="sda?", SYMLINK+="mmcblk0p%n"
    KERNEL=="sda2", SYMLINK+="root"

Reiniciar la emulación.

$ shutdown -t now

 Iniciar la emulación

$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2014-01-07-wheezy-raspbian.img

Recursos

Problemas de permisos para ejecutar las máquinas KVM después actualizar a Ubuntu 10.10 Server

Introducción.

Después de actualizar mi servidor de desarrollo a Ubuntu 10.10 server empecé a tener problemas para iniciar las máquinas virtuales basadas en KVM.  Básicamente se quejaba por problemas de permisos en /u/vms donde se almacenan las imágenes de los discos duros virtuales (por defecto es /var/lib/libvirt/images -global- o ~/.libvirt/storage -usuario-).

En los logs de las máquinas virtuales ubicados bajo /var/log/libvirt/qemu se pueden apreciar mensajes como el siguiente.

char device redirected to /dev/pts/1
qemu: could not open disk image /u/vms/sandbox_ubuntuserver-10.10_x64.img: Permission denied

Las imágenes de los discos duros pertenecen a root:root y esta relación es restaurada cada vez que se intenta ejecutar cada una de las máquinas virtuales así que modificarlas manualmente es infructuoso.

$ ls -l /u/vms

-rw——- 1 root root 7516192768 2010-08-11 23:32 c-head.img
-rw——- 1 root root 7516192768 2010-08-04 18:21 c-wn1.img
-rw——- 1 root root 7516192768 2010-07-24 16:42 c-wn2.img
-rw——- 1 root root 7516192768 2010-07-15 00:34 c-wn3.img

Solución.

Indicar explícitamente que root será el grupo y el usuario que ejecutará los procesos de QEMU.  Para hacer esto es necesario realizar el siguiente ajuste de configuración.

$ sudo vi /etc/libvirt/qemu.conf

# The user ID for QEMU processes run by the system instance
user = “root”

# The group ID for QEMU processes run by the system instance
group = “root”

Reiniciar el servicio para tener en cuenta los cambios recién realizados.

$ sudo service libvirt-bin restart

Conclusiones.

Aparentemente la nueva versión de KVM en Ubuntu trae consigo cambios en la forma como este se ejecuta, siendo ahora bajo usuarios sin privilegios y antes como root.  El proceso de actualización, al menos en mi caso, parece que no consiguió realizar todas las modificaciones necesarias para alcanzar este objetivo y por ello fue necesario indicar explícitamente que se utilizaba a root para ejecutar los procesos (método antíguo).

Otra posible solución a este problema podría haber sido indicarle a QEMU/libvirt (o a quien corresponda) que efectivamente se desea ejecutar los procesos con usuarios sin privilegios (método nuevo) sin embargo por el momento no he logrado encontrar quien es el responsable de los cambios de estos cambios de propiedad de los archivos.

Enlaces.