Raspberry Pi en QEmu

Estos son los pasos para emular una Raspberry Pi con Raspbian Stretch en Linux, es una recopilación de diferentes guías pero sigue principalmente los pasos descritos en tutorial de Azeria Labs

Para emular la Raspberry PI necesitamos:

  • El emulador QEmu que puede instalarse con:

sudo apt-get install qemu-system

El primer paso es crear una carpeta de trabajo donde descargar la imagen de Raspbian y el kernel QEmu:

~$ mkdir qemu_vms && cd qemu_vms ~/qemu_vms$ wget https://downloads.raspberrypi.org/raspbian_lite_latest ~/qemu_vms$ unzip raspbian_lite_latest.zip ~/qemu_vms$ wget https://raw.githubusercontent.com/dhruvvyas90/qemu-rpi-kernel/master/kernel-qemu-4.4.34-jessie

Descargados, buscamos el sector donde empieza la partición con el sistema operativo:

~/qemu_vms$ fdisk -l latest-raspbian-stretch-lite.img Disk 2017-11-29-raspbian-stretch-lite.img: 1,7 GiB, 1858076672 bytes, 3629056 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x37665771
Device Boot Start End Sectors Size Id Type 2017-11-29-raspbian-stretch-lite.img1 8192 93236 85045 41,5M c W95 FAT32 (LBA) 2017-11-29-raspbian-stretch-lite.img2 94208 3629055 3534848 1,7G 83 Linux

El valor donde empieza es el 94208 (en negrita). Necesitamos multiplicar por 512 (tamaño del sector) ese número para obtener el byte donde comienza la partición para montarla:

~/qemu_vms$ mkdir raspbian ~/qemu_vms$ sudo mount -v -o offset=48234496 -t ext4 latest-raspbian-stretch-lite.img raspbian

Abrimos el archivo /mnt/raspbian/etc/ld.so.preload, comentamos todas las líneas y guardamos. Desmontamos la partición con:

~/qemu_vms$ sudo umount raspbian

Ahora ya está todo listo para iniciar el emulador con:

~/qemu_vms$ qemu-system-arm -kernel kernel-qemu-4.4.34-jessie -cpu arm1176 -m 256M -M versatilepb -serial stdio -append “root=/dev/sda2 rootfstype=ext4 rw” -hda 2017-11-29-raspbian-stretch-lite.img -redir tcp:5022::22 -no-reboot

Las malas noticias, y alguna buena

El emulador tal cual está no es útil. La imagen tiene ~200MB libres para trabajar, y al tratarse de una VM versatilepb la memoria RAM máxima está limitada a 256MB. Existen algunas soluciones: La imagen puede ampliarse cuanto queramos y la falta de RAM puede mitigarse aumentando la memoria de intercambio y overclocking la CPU del emulador.

Aumentar la partición

Antes de aumentar el tamaño de imagen recomiendo hacer una copia de la imagen por si algo falla. Para aumentar el tamaño de la imagen usaremos el comando:

~/qemu_vms$ qemu-img resize latest-raspbian-stretch-lite.img +2G

Una vez hecho esto iniciamos el emulador y tras usar el comando sudo fdisk /dev/sda seguimos estos pasos:

  • Imprimimos en pantalla la tabla de particiones con la opción p.
  • Borramos la partición que contiene el sistema operativo (sda2) con la opción d.
  • Creamos un partición Primary en la posicion 2 con la opción n.
  • La partición debe comenzar donde empezaba la que borramos (sda2) y terminar en el último sector de la imagen.
  • Para terminal guardamos los cambios con la opción w, y reinciamos el emulador.
  • Comprobamos los cambios con df -h.
Aumentar la memoria de intercambio

Para aumentar la memoria swap modifiremos el archivo /etc/dphys-swapfile y modificaremos el valor de la variable CONF_SWAPSIZE de 100 a 1024 MB, por ejemplo. Para hacer los cambios efectivos reiniciamos el emulador o con los comandos:

sudo /etc/init.d/dphys-swapfile stop sudo /etc/init.d/dphys-swapfile start

Overclocking

El cambio se puede realizar desde la utilidad raspi-config. Bajo la opción número 6.

Y elegimos el máximo, Turbo 1000 Mhz.

Una cosa más

Uno de los parámetros que hemos usado en el emulador es -redir tcp:5022::22. Este parámetro redirige el puerto TCP22 de la Raspberry Pi al puerto TCP5022 de nuestro equipo, de modo que podamos acceder mediante ssh al emulador:

~$ ssh pi@127.0.0.1 -p 5022

Antes es necesario iniciar el servidor ssh con la utilidad raspi-config, de esta forma el cambio será permanente.