Mancher kennt das vielleicht: Man möchte Software für einen Raspberry Pi testen, hat aber gerade keinen Raspi zur Hand, oder möchte nicht sein laufendes System gefährden.
Eine (relativ) einfache Lösung kann hier sein auf einem normalen Rechner eine Raspberry Pi zu emulieren.
Hierfür nutzen wir ein aktuelles Ubuntu-System (24.04) und die freie Virtualisierungssoftware QEMU.
Hinweis
Wir emulieren hier ein laufendes Raspberry Pi OS in einer virtuellen QEMU ARM Umgebung.
Da dies eine vollständige Hardware-Emulation ist, sind möglicherweise nicht alle Hardware-Features des echten Raspberry Pi verfügbar.
Inhalt
- Vorbereitungen
- Kernel kompilieren
- Raspberry Pi OS Image anpassen
- Image vergrößern
- Konfiguration von Benutzer und Passwort und aktivieren von SSH
- Starten des emulierten Systems
- Login in das System
- Stoppen des emulierten Systems
- Fehlerbehandlung
- Start im WSL
- Monitor-Konsole
Vorbereitungen
Zur Vorbereitung benötigen wir zuerst ein aktuelles Raspberry Pi OS Image, welches wir von der offiziellen Downloadseite herunterladen können.
Möglich ist die Verwendung der 64-bit und der 32-bit Version. Wir verwenden hier die 64-bit Variante.
Dabei sollten wir auf die dort angegebene Kernel-Version achten, da wir gleich den Kernel selbst kompilieren müssen.
Hinweis
Bei Erstellung dieser Anleitung war 2024-07-04-raspios-bookworm
mit Kernel 6.6 aktuell.
Wir nutzen hier zur Demonstration die 64-bit Lite-Variante.
Zunächst installieren wir uns noch die benötigten Softwarepakete:
1 | sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \ |
Das Image 2024-07-04-raspios-bookworm-arm64-lite.img
und alle weiteren Dateien legen wir Ordner ~/rpi-emu/
ab.
1 | mkdir ~/rpi-emu |
Kernel kompilieren
Wir benötigen einen für QEMU passenden Kernel, welchen wir uns aus den offiziellen Quellen des Linux-Kernels selbst kompilieren.
Zuerst brauchen wir die aktuelle Kernel-Version, welche wir uns von kernel.org besorgen können.
Im Idealfall nutzen wir die Version, die auf der Download-Seite von Raspberry Pi OS angegeben ist. Beim Erstellen diese Beitrags war dies die Version 6.6 bzw. 6.6.49.
Um den Prozess zu vereinfachen erstellen wir das Skript build-qemu-kernel.sh
mit folgendem Inhalt und führen es anschließend aus:
1 |
|
Hinweis
Das Kompilieren des Kernels dauert etwas, ist aber in der Regel nur einmalig notwendig.
1 | chmod +x build-qemu-kernel.sh |
Der selbst gebaute Kernel liegt anschließend als kernel
in unserem Verzeichnis.
Damit ist das Schlimmste auch schon geschafft. 😉
Raspberry Pi OS Image anpassen
Damit wir das Raspberry Pi OS Image mit QEMU nutzen können, müssen wir es zuerst noch etwas anpassen.
Image vergrößern
Ein normaler Raspberry Pi vergrößert beim ersten Start automatisch das Dateisystem auf den auf der SD-Karte verfügbaren Speicherplatz.
Da dies hier nicht automatisch passiert, müssen wir das Image manuell vergrößern, wobei wir es auch gleichzeitig in eine neue Datei speichern.
Im folgenden speichern wir das neue Image als disk.img
und vergrößern es um 20Gb
1 | cp 2024-07-04-raspios-bookworm-arm64-lite.img disk.img |
Tipp
Das hier angegebene /dev/sda2
bezieht sich auf die Partition 2 in dem Image. Bitte nicht mit eine ggf. vorhandenen sda2 Partition auf dem eigenen Rechner verwechseln.
Konfiguration von Benutzer und Passwort und aktivieren von SSH
Bei den neueren Raspberry Pi OS Images gibt es keinen Standardbenutzer mehr. Darum müssen wir das Image bearbeiten, um diesen zu erstellen.
Hierzu lassen wir uns zuerst die Partitionen im Image anzeigen.
1 | fdisk -l disk.img |
Von der Ausgabe benötigen wir den Anfang von disk.img1 (hier 8192) und die Sektorgröße (hier 512).
Diese beiden Werte multiplizieren wir, um den offset zum Einbinden der Partition zu erhalten.8192 * 512 = 4194304
Anschließend erstellen wir uns ein Verzeichnis und mounten die Partition aus dem Image unter Angabe des eben berechneten offset in dieses.
Achtung
Bitte unbedingt auf die korrekte Angabe des offset achten.
1 | mkdir mnt |
Nun erstellen wir eine Datei userconf.txt
in der gemounteten Partition. Diese Datei beinhaltet den Benutzernamen und das Passwort für den Login.
Das Passwort wird interaktiv abgefragt.
1 | PW=$(openssl passwd -6) |
Damit auch SSH in unserem emulierten System aktiviert wird, erstellen wir zudem eine ssh
Datei.
1 | sudo touch mnt/ssh |
Anschließend unmounten wir die Partion vom Image wieder.
1 | sudo umount mnt |
Starten des emulierten Systems
Nun haben wir alles soweit vorbereitet, um das Emulierte Raspberry Pi OS zu starten.
Um den Start zu vereinfachen, erstellen wir zunächst ein kurzes Startskript rpi-emu-start.sh
.
1 |
|
Dieses Skript machen wir ausführbar und starten es anschließend.
1 | chmod +x rpi-emu-start.sh |
Der erste Start kann etwas länger dauern. Weitere Starts aus dem selben Image sollten dann schneller sein.
Tipp
Durch das erstellen mehrere Images und Angabe des jeweiligen Images im Startskript können auch mehrere unterschiedliche Systeme gestartet werden.
Zudem kann bei nicht laufendem Emulator auch die Image-Datei einfach kopiert werden, um beispielsweise ein Backup zu erstellen.
Login in das System
Da wir den SSH-Server aktiviert und den SSH-Port durchgereicht haben, können wir per SSH wie folgt auf unser emuliertes System zugreifen:
1 | ssh -p 2222 pi@localhost |
Nach dem Login werden wir wie gewohnt begrüßt und können wie gewohnt Befehle ausführen.
1 | Linux raspberrypi 6.6.49 #1 SMP PREEMPT Thu Sep 5 12:19:57 CEST 2024 aarch64 |
Stoppen des emulierten Systems
Um das emulierte Raspberry Pi OS zu beenden gehen wir wie bei einem rechten Raspberry Pi auch vor.
Wir loggen in das System ein und fahren es anschließend per Befehl sauber herunter.
1 | sudo shutdown -h now |
Achtung
Es ist auch möglich durch einfaches Schließen des Fensters QEMU zu beenden. Dies gleicht aber dem Steckerziehen bei einem echten Raspberry Pi und kann zu Fehlern im Dateisystem führen.
Fehlerbehandlung
Start im WSL
Im Windows Subsystem for Linux kann QEMU ebenso genutzt werden. Hierbei ist jedoch keine grafische Oberfläche möglich (jedenfalls nicht so ohne Weiteres) und beim Start muss zusätzlich das Argument -nographic
angegeben werden.
Monitor-Konsole
Die QEMU Monitor-Konsole kann per telnet localhost 5555
erreicht werden. Hierrüber ist es beispielsweise möglich Befehle an die QEMU Instanz zu senden.