La virtualización de plataformas de desarrollo permite estudiar y experimentar con ambientes particulares de formas más económicas al no tener que adquirir equipo diverso sino utilizarlo mediante software. En este caso construiremos un ambiente basado en procedores ARM y el sistema operativo Raspbian, para trabajar con dispositivos Raspberry Pi de forma virtual utilizando QEMU en Windows 11.
Anteriormente se había publicado este ejercicio con limitaciones significativas utilizando la herramienta llamada qemu-system-arm para la emulación y puede ser consultada en el artículo llamado Simular Raspbian OS en QEMU para Windows. En esta ocasión actualizaremos al uso de la herramienta qemu-system-aarch64 para conseguir una máquina más eficiente, en particular porque la emulación cuenta con un procesador multinúcleos y hasta 1GB de memoria RAM.
Para construir nuestro ambiente de trabajo, necesitamos primero descargar algunos recursos. Todos ellos se encuentran disponibles de forma gratuita gracias a sus autores y las comunidades de desarrollo de código abierto y libre que las desarrollan. La lista a continuación se basa en las últimas versiones disponibles al escribir esta guía, que son:
- Una imagen de RaspiOS, preferiblemente la versión Lite; la versión más reciente basada en Debian Bookworm del 11 de diciembre del 2023, disponible acá.
- El emulador QEMU, la versión más reciente del 24 de diciembre del 2023, disponible acá.
- Una copia del kernel Linux para el emulador y el descriptor de hardware correspondiente, ambos disponibles acá para descarga directa, también extraíbles de la imagen del sistema operativo como se detalla en esta respuesta de StackExchange.
Emulador QEMU
El instalador del emulador QEMU se puede utilizar para instalar el programa o para extraer las herramientas del emulador sin modificar el sistema operativo. En este ejercicio seguiremos la segunda opción, con el fin de poder utilizar diferentes versiones del emulador según lo pueda necesitar el usuario y poder copiar fácilmente la máquina virtual entre computadoras. De esta forma también tendremos un ambiente portable. Para realizar esto, se requiere una herramienta de descompresión capaz de leer los contenidos del instalador. 7-zip tiene esta capacidad, se puede descargar de este enlace.
Parar abrir y extraer el archivo instalador de QEMU con 7-zip, el método más fácil es dar click derecho sobre el archivo instalador y elegir la opción del menú contextual de 7-Zip que dice Extraer archivos..., donde se elige la ubicación para la extracción. Si el menú contextual no está disponible, se puede abrir directamente en 7-zip, esto es abriendo la aplicación desde el menú de programas, navegando en la aplicación a la ubicación del instalador descargado y presionando las teclas Ctrl + Av Pag.
Para el ejemplo, QEMU será extraído en la carpeta qemu, dentro de la carpeta VMs, disponible en el disco D: de la computadora, esto es D:/VMs/qemu/. En esta misma carpeta también se deben colocar los archivos del kernel que se descargaron, sin aplicar modificaciones.
Preparación de la imagen
Primeramente extraer la imagen del archivo compreso ZIP descargado. Con el que se consigue tener el archivo 2023-12-11-raspios-bookworm-arm64-lite.img o similar, dependiendo de la versión que se haya descargado (en todos los comandos debe asegurarse de utilizar el nombre correspondiente a su versión). Este último lo moveremos a la misma ubicación en donde se extrajo QEMU. Dado que el archivo compreso queda intacto, puede cuidarlo como un respaldo en caso que deba iniciar la configuración nuevamente o quiera tener más de un ambiente configurado.
El archivo descompreso tiene por extensión img. Este es un formato de respaldo para dispositivos de almacenamiento, en este particular es un respaldo en crudo o RAW. Esta imagen de RaspiOS viene preparada para ser escrita en una memoria SD y expandir la partición a su tamaño máximo disponible la primera vez que se enciende un dispositivo con esta tarjeta como dispositivo de arranque. En nuestro ambiente emulado, no tenemos una tarjeta SD física, pero sí tenemos un dispositivo virtual al que está asociada la partición de almacenamiento virtual. Nuestro dispositivo es la imagen propiamente descargada, este es el dispositivo de almacenamiento principal que usará nuestro Raspberry Pi emulado.
En esta imagen hay espacio suficiente para contener la información de particiones, configuración de arranque y archivos del sistema operativo, con algo de espacio libre que le permita ejecutar con el mínimo de recursos. Para tener espacio para almacenar nuestros propios archivos, instalar nuevos programas y en general que el sistema operativo funcione correctamente, primero vamos a extender el espacio configurado en la imagen. Además que, opcionalmente, se puede cambiar el formato en crudo al formato QCOW2 de codificación que mejora la estabilidad del sistema. QEMU tiene una herramienta específica para gestionar este tipo de archivos, incluyendo modificaciones a su configuración. Le podemos agregar tanto espacio como sea requerido, pero posiblemente con 2-6 GB es suficiente en gran variedad de escenarios.
En particular para usar la arquitectura de 64 bits, ocupamos que el tamaño de la imagen sea una medida en GB que sea una potencia de 2, es decir, 8, 16, 32, etc.
Vamos a ejecutar el comando:
qemu-img convert -f raw -O qcow2 [ImagenOriginal] [NuevaImagen]qemu-img resize [NuevaImagen] +[CapacidadAgregada]
En nuestro ejemplo, como tenemos todos los archivos en la misma dirección, primeramente hay que ubicarse en la carpeta donde fueron extraídas las herramientas de QEMU, para lo cual se ejecutan los siguientes comandos:
cd D:\VMs\qemu\qemu-img convert -f raw -O qcow2 2023-12-11-raspios-bookworm-arm64-lite.img raspbian-bookworm.qcowqemu-img resize raspbian-bookworm.qcow 8G
El primer comando no genera ningún mensaje, mientras el segundo debe darnos la notificación que se hizo el cambio de tamaño.
Configuración de inicio
Para iniciar la máquina virtual, usamos el programa qemu-system-aarch64.exe. Como este programa requiere varios parámetros de arranque, vamos a crear un archivo de ejecución por lotes, para que esté el comando disponible cada vez que se utilice con solo un doble-click o una llamada sencilla en la línea de comandos. Este archivo puede crearse como un archivo txt vacío, que luego se cambia su extensión por bat. Un ejemplo, sería agregar al archivo raspbian-bookworm.bat un comando como el siguiente:
qemu-system-aarch64 -M raspi3b -cpu cortex-a53 -m 1024 -kernel [Linux Kernel File] -dtb [Linux DTB file] -drive "file=[Repository Image],index=0,media=disk,format=qcow2" -append "root=/dev/mmcblk0p2 filesystem=ext4 rw rootwait rootfstype=ext4" -usb -device usb-mouse -device usb-kbd -device usb-net,netdev=net0 -netdev user,id=net0,hostfwd=tcp::22022-:22,hostfwd=tcp::59010-:5901 -no-reboot
Modificando los parámetros con los de nuestro ejemplo, se vería de la siguiente forma:
qemu-system-aarch64 -M raspi3b -cpu cortex-a53 -m 1024 -kernel kernel8.img -dtb bcm2710-rpi-3-b-plus.dtb -drive "file=raspbian-bookworm.qcow,index=0,media=disk,format=qcow2" -append "root=/dev/mmcblk0p2 filesystem=ext4 rw rootwait rootfstype=ext4" -usb -device usb-mouse -device usb-kbd -device usb-net,netdev=net0 -netdev user,id=net0,hostfwd=tcp::22022-:22,hostfwd=tcp::59010-:5901 -no-reboot
Cada parámetro tiene un efecto importante que se puede revisar en la documentación de QEMU, pero en particular nos interesan las opciones de red, en las que se redireccionan puertos de la computadora local a la computadora virtual de forma que nos podamos comunicar con esta. En particular el puerto 22 se habilita para utilizar SSH y el 5901 para utilizar un escritorio virtual por medio de VNC.
Pasos finales
Una vez que inicia la máquina virtual por primera vez, va a solicitar información para el login del usuario (usualmente pi y raspberry por default). Tras iniciar la sesión, se recomienda expandir el sistema de archivos a la capacidad máxima elegida para el dispositivo de almacenamiento. Esto lo hacemos con la herramienta raspi-config directamente en el emulador. El teclado es bastante sensible en la consola, por lo que un toque minimamente extendido ocasionará una letra repetida rápidamente (particularmente de cuidado al poner la contraseña).
La información en el artículo Configuración y optimización de Raspbian en QEMU, en su mayoría aplicaría teóricamente a la nueva emulación. No es necesario tomar los pasos de extensión del sistema de archivos en este y el uso de la versión Lite del sistema operativo hace que no se requiera apagar la interfaz gráfica. Altamente recomendable hacer la modificación del archivo de intercambio.