L'objectif est de tester l'émulation sur un PC amd64 des OS Debian RaspBerry Pi 3 & 4 64 bits en utilisant la carte (model) qemu rpi3. La méthode utilisée est reprise de https://github.com/wimvanderbauwhede/limited-systems/wiki/Debian-%22buster%22-for-Raspberry-Pi-3-on-QEMU.Elle fait appel pour l'amorçage aux noyaux et DTBs (Device Tree Blob) extraits des images
Le téléchargement et l'extraction des noyaux de l'image sont identiques à ceux décrits dans Émulation Debian RaspBerry Pi OS 64 bits sur un hôte amd64 - Qemu - carte virt
Sommaire
$ qemu-system-aarch64 --version
QEMU emulator version 5.0.0 (Debian 1:5.0-14~bpo10+1)
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers
$ qemu-system-aarch64 -machine help |grep raspi
raspi2 Raspberry Pi 2B
raspi3 Raspberry Pi 3B
$ wget https://raspi.debian.net/verified/20200831_raspi_3.img.{xz,sha256.asc}
$ wget https://raspi.debian.net/verified/20200909_raspi_4.img.{xz,sha256.asc}
$ gpg --keyserver keyring.debian.org --recv-keys 4D14050653A402D73687049D2404C9546E145360
$ gpg --verify 20200909_raspi_3.xz.sha256.asc
$ sha256sum -c 20200831_raspi_3.xz.sha256.asc
$ gpg --verify 20200909_raspi_4.xz.sha256.asc
$ sha256sum -c 20200909_raspi_4.xz.sha256.asc
$ unxz 20200831_raspi_3.img.xz
$ unxz 20200909_raspi_4.img.xz
$ sudo losetup -P /dev/loop93 20200831_raspi_3.img
$ sudo mount /dev/loop93p2 /mnt
$ suod mount /dev/loop93p1 /mnt/boot/firmare
$ cp /mnt/boot/initrd* /mnt/boot/vmlinuz ./
$ cp /mnt/boot/firmware/cmline.txt /mnt/boot/firmware/*.dtb ./
$ sudo umount /mnt/boot/firmware /mnt
$ sudo losetup -d /dev/loop93
$ ls -l
total 1130696
-rw-r--r-- 1 philippe philippe 1572864000 oct. 5 16:16 20200831_raspi_3.img
-rw-r--r-- 1 philippe philippe 367 août 31 19:52 20200831_raspi_3.xz.sha256.asc
-rwxr-xr-x 1 philippe philippe 13617 oct. 5 16:14 bcm2837-rpi-3-a-plus.dtb
-rwxr-xr-x 1 philippe philippe 13469 oct. 5 16:14 bcm2837-rpi-3-b.dtb
-rwxr-xr-x 1 philippe philippe 13661 oct. 5 16:14 bcm2837-rpi-3-b-plus.dtb
-rwxr-xr-x 1 philippe philippe 13457 oct. 5 16:14 bcm2837-rpi-cm3-io3.dtb
-rwxr-xr-x 1 philippe philippe 123 oct. 5 16:15 cmdline.txt
-rw-r--r-- 1 philippe philippe 24839400 oct. 5 16:12 initrd.img-4.19.0-10-arm64
-rw-r--r-- 1 philippe philippe 18759536 oct. 5 16:12 vmlinuz-4.19.0-10-arm64
$ cat cmdline.txt
console=tty0 console=ttyS1,115200 root=LABEL=RASPIROOT rw elevator=deadline fsck.repair=yes net.ifnames=0 cma=64M rootwait
cpu
et -m
de la commande qemu. La commande est passée sous forme de script pour raison de simplicité#!/usr/bin/env bash
RASPI=20200831_raspi_3.img VMLINUZ=vmlinuz-4.19.0-10-arm64 INITRD=initrd.img-4.19.0-10-arm64
DTB=bcm2837-rpi-3-b-plus.dtb
qemu-system-aarch64 \ -kernel $PWD/$VMLINUZ \ -initrd $PWD/$INITRD \ -dtb $DTB \ -M raspi3 -m 1024 \ -serial stdio \ -append "rw earlycon=pl011,0x3f201000 console=ttyAMA0 loglevel=8 root=/dev/mmcblk0p2 fsck.repair=yes net.ifnames=0 rootwait memtest=1" \ -drive file=$RASPI,format=raw,if=sd \ -no-reboot
exit
$ qemu-img resize 20200831_raspi_3.img -f raw 4G
Lancer le script :
Si la commande a été lancée avec l'option -serial stdio, les entrées sorties sont redirigées vers la console courante d'où a été lancée la commande
A l'invite de login, utiliser "root", sans mot de passe
# uname -a
Linux rpi3-20200831 4.19.0-10-arm64 #1 SMP Debian 4.19.132-1 (2020-07-24) aarch64 GNU/Linux
# lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
mmcblk0
│
├─mmcblk0p1
│ vfat RASPIFIRM
│ 8FBE-F858 235.9M 21% /boot/firm
└─mmcblk0p2
ext4 RASPIROOT
1b9125ba-e961-40bf-a9db-75f20fa8d9fa 525.9M 48% /
# free -h
total used free shared buff/cache available
Mem: 929Mi 44Mi 820Mi 3.0Mi 64Mi 817Mi
Swap: 0B 0B 0B
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
Dans l'attente d'un modèle rpi4 (!), on teste le modèle rpi3
$ sudo losetup -P /dev/loop99 20200909_raspi_4.img
$ sudo mount /dev/loop99p2 /mnt
$ sudo mount /dev/loop99p1 /mnt/boot/firmware/
$ cp /mnt/boot/initrd.img* /mnt/boot/vmlinuz* ./
$ cp /mnt/boot/firmware/cmdline.txt ./
$ ls -l
total 1269792
-rw-r--r-- 1 philippe philippe 1572864000 oct. 5 18:32 20200909_raspi_4.img
-rw-r--r-- 1 philippe philippe 367 oct. 5 14:45 20200909_raspi_4.xz.sha256.asc
-rwxr-xr-x 1 philippe philippe 23119 oct. 5 18:32 bcm2711-rpi-4-b.dtb
-rwxr-xr-x 1 philippe philippe 13990 oct. 5 18:32 bcm2837-rpi-3-a-plus.dtb
-rwxr-xr-x 1 philippe philippe 14250 oct. 5 18:32 bcm2837-rpi-3-b.dtb
-rwxr-xr-x 1 philippe philippe 14622 oct. 5 18:32 bcm2837-rpi-3-b-plus.dtb
-rwxr-xr-x 1 philippe philippe 13624 oct. 5 18:32 bcm2837-rpi-cm3-io3.dtb
-rwxr-xr-x 1 philippe philippe 115 oct. 5 18:32 cmdline.txt
-rw-r--r-- 1 philippe philippe 28172439 oct. 5 18:31 initrd.img-5.8.0-1-arm64
-rw-r--r-- 1 philippe philippe 22421360 oct. 5 18:31 vmlinuz-5.8.0-1-arm64
$ cat cmdline.txt
console=tty0 console=ttyS1,115200 root=LABEL=RASPIROOT rw elevator=deadline fsck.repair=yes net.ifnames=0 rootwait
$ sudo umount /mnt/boot/firmware /mnt
$ sudo losetup -d /dev/loop99
#!/usr/bin/env bash
RASPI=20200909_raspi_4.img VMLINUZ=vmlinuz-5.8.0-1-arm64 INITRD=initrd.img-5.8.0-1-arm64 DTB=bcm2711-rpi-4-b.dtb
qemu-system-aarch64 \ -kernel $PWD/$VMLINUZ \ -initrd $PWD/$INITRD \ -dtb $DTB \ -M raspi3 -m 1024 \ -serial stdio \ -append "rw earlycon=pl011,0x3f201000 console=ttyAMA0 loglevel=8 root=/dev/mmcblk0p2 fsck.repair=yes net.ifnames=0 rootwait memtest=1" \ -drive file=$RASPI,format=raw,if=sd \ -no-reboot
exit
$ qemu-img resize 20200831_raspi_3.img -f raw 4G
[ 0.000000] Kernel panic - not syncing: Attempted to kill the idle task!
[ 0.000000] ---[ end Kernel panic - not syncing: Attempted to kill the idle task! ]---
qemu-system-aarch64: terminating on signal 2