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
- Una imagen de Raspbian, en esta guía se usa la última imagen de Raspbian Stretch Lite.
- El último kernel Qemu para Raspberry Pi
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.