Émulation Debian Raspberry Pi OS 64 bits sur un hôte amd64 - Qemu - carte rpi3


Création : Hôte :
Debian Buster / 10.5, invités : images arm64 pour RaspBerry 3 et RaspBerry 4 : Debian RaspBerry unofficial Buster 10.5

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

Installation

$ 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

Téléchargement des images

$ 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

Image RaspBerry Pi 3

Extraction du noyau

$ 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

Lancement de l'émulation

#!/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

Utilisation

$ qemu-img resize 20200831_raspi_3.img -f raw 4G
# 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

Image RaspBerry Pi 4

Dans l'attente d'un modèle rpi4 (!), on teste le modèle rpi3

Extraction du noyau (id RaspBerry Pi 3)

$ 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

Lancement de l'émulation

#!/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