Mise à jour :
Hôte : Debian 11.1/ Bullseye amd64
Invité : RaspBerry PI 3/4 OS 32 bits - Debian 10.9 - qemu Version 6.1
L'objectif est d'émuler sur un PC amd64, un OS RaspBerry Pi 3/4 32 bits.
La méthode utilisée est celle décrite sur le site https://github.com/dhruvvyas90/qemu-rpi-kernel :
Sommaire
un contrôleur de disque SCSI
une carte Ethernet
un affichage graphique
Installer qemu-system-arm et noter le numéro de version. Ci-dessous on utilise la version buster-backports
$ sudo aptitude install -t bullseye-backports qemu-system-arm
$ qemu-system-arm --version
QEMU emulator version 6.1.0 (Debian 1:6.1+dfsg-6~bpo11+1)
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers
$ qemu-system-arm -machine help |grep versatilepb
versatilepb ARM Versatile/PB (ARM926EJ-S)
$ qemu-system-arm -M versatilepb -cpu help |grep arm1176
arm1176
Télécharger et décompresser une image Raspberry PI OS 32 bits, ci-dessous l'image Buster armhf lite (32 bits)
$ RASP_OS=2021-05-07-raspios-buster-armhf-lite.img
$ RASP_URL=
$ wget $RASP_URL
http://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-05-07/$RASP_OS.zip
$ unzip $RASP_OS.zip
$ truncate -s 8GiB $RASP_OS.img
$ sudo parted $RASP_OS.img resizepart 2 100%
$ sudo losetup --show -P /dev/loop99 $RASP_OS.img
/dev/loop99
$ sudo e2fsck -f /dev/loop99p2
$ sudo resize2fs /dev/loop99p2
$ sudo parted $PART_OS.img print free
...
Number Start End Size Type File system Flags
16,4kB 4194kB 4178kB Free Space
1 4194kB 273MB 268MB primary fat32 lba
2 273MB 8590MB 8317MB primary ext4
$ sudo losetup -d /dev/loop99
Télécharger les fichiers kernel-qemu et dtb (Device Tree Binary)
$ DTB=versatile-pb-buster-5.4.51.dtb
$ KERNEL=kernel-qemu-5.4.51-buster
$ wget https://github.com/dhruvvyas90/qemu-rpi-kernel/raw/master/{$DTB,$KERNEL}
Alternativement, cloner le dépôt
dhruvvyas90/qemu-rpi-kernel
$ git clone https://github.com/dhruvvyas90/qemu-rpi-kernel
Clonage dans 'qemu-rpi-kernel'...
.......
et récupérer les fichiers souhaités parmi ceux téléchargés dans le répertoire qemu-rpi-kernl
$ ls qemu-rpi-kernel/
kernel-qemu-3.10.25-wheezy kernel-qemu-5.4.51-buster versatile-pb-buster-5.4.51.dtb
kernel-qemu-4.14.79-stretch native-emulation versatile-pb-buster.dtb
kernel-qemu-4.19.50-buster README.md versatile-pb.dtb
kernel-qemu-4.4.34-jessie tools
$ RASP_OS=2021-05-07-raspios-buster-armhf-lite
$ DTB=versatile-pb-buster-5.4.51.dtb
$ KERNEL=kernel-qemu-5.4.51-buster
$ qemu-system-arm \
-M versatilepb \
-cpu arm1176 \
-m 256 \
-drive "file=$RASP_OS.img,if=none,index=0,media=disk,format=raw,id=disk0" \
-device "virtio-blk-pci,drive=disk0,disable-modern=on,disable-legacy=off" \
-net nic \
-net "user,hostfwd=tcp::5022-:22" \
-dtb $PWD/$DTB \
-kernel $PWD/$KERNEL \
-append 'root=/dev/vda2 panic=1' \
-no-reboot \
-serial stdio
Dans le cas de la machine versatilepb utilisée ici
la taille mémoire (option -m) est au maximum de 256MB
le nombre de cœurs est limité à un
Les chemins des fichiers des options -dtb et -kernel doivent être absolus d'où l'utilisation de $PWD
Noter que le nom de périphérique dans l'option -append est /dev/vda2 (et non /dev/sda2)
Noter l'ajout de l'option -net nic (pour créer l'interface internet)
L'option -serial stdio est facultative : elle permet de rediriger la sortie standard sur la console courante d'où a été lancé la commande d'émulation
L'option -net user,hostfwd=tcp::5022-:22 redirige le port ssh (22) au port local 5022.
Login et Mot de passe : pi et raspberry - Attention la console émulée est en qwerty! Mais pas la sortie standard sur la console courante
L'accès ssh depuis l'hôte s'effectue avec ssh pi@localhost -p5022 : le service ssh doit avoir été activé sur l'invité : sudo systemctl start ssh
$ sudo apt install debconf # qui fournit dpkg-reconfigure
$ sudo dpkg-reconfigure locales
$ sudo dpkg-reconfigure keyboard-configuration
$ sudo dpkg-reconfigure console-setup
$ passwd
Machine et noyau
$ uname -m
armv6l
$ uname -a
Linux raspberrypi 5.4.51 #1 Sat Aug 8 23:28:32 +03 2020 armv6l GNU/Linux
$ cat /etc/debian_version
10.9
$ cat /etc/issue
Raspbian GNU/Linux 10 \n \l
$ cat /etc/fstab
proc /proc proc defaults 0 0
PARTUUID=907af7d0-01 /boot vfat defaults 0 2
PARTUUID=907af7d0-02 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
$ cat /etc/apt/sources.list
deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
$ free -h
total used free shared buff/cache available
Mem: 242Mi 19Mi 173Mi 4,0Mi 49Mi 172Mi
Swap: 49Mi 0B 49Mi
$ lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
mtdblock0
vda
├─vda1
│ vfat boot 4AD7-B4D5 198,7M 21% /boot
└─vda2
ext4 rootfs
2887d26c-6ae7-449d-9701-c5a4018755b0 4,4M 93% /
$ 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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
3: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
$ ip route
default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 202
10.0.2.0/24 dev eth0 proto dhcp scope link src 10.0.2.15 metric 202
$ sudo apt update
$ sudo apt ugrade
etc ....
Exemple de script enchaînant les commandes indiquées ci-dessus
#!/usr/bin/env bash
# OS raspberry lite
RASP_OS=2020-08-20-raspios-buster-armhf-lite
RASP_URL=http://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2020-08-24/$RASP_OS.zip
# OS raspberry desktop
#RASP_OS=2020-05-27-raspios-buster-full-armhf
#RASP_URL=http://downloads.raspberrypi.org/raspios_full_armhf/images/raspios_full_armhf-2020-05-28/$RASP_OS.zip
# DTB (Device Tree Binary) et Kernel qemu
DTB=versatile-pb-buster-5.4.51.dtb
DTB_URL=https://github.com/dhruvvyas90/qemu-rpi-kernel/raw/master/$DTB
KERNEL=kernel-qemu-5.4.51-buster
KERNEL_URL=https://github.com/dhruvvyas90/qemu-rpi-kernel/raw/master/$KERNEL
# Demander droits root
sudo true
# Supprimer le proxy
http_proxy=""
# Téléchargement image zip
if ! [[ -e "$RASP_OS.zip" ]]; then
wget $RASP_URL || exit 2
fi
# Suppression image img existante ?
if [[ -e "$RASP_OS.img" ]]; then
read -p "Faut-il supprimer l'image existante oui/ ? "
if [[ $REPLY = oui ]]; then
rm $RASP_OS
fi
fi
# Création image si elle n'existe pas
if ! [[ -e "$RASP_OS.img" ]]; then
unzip $RASP_OS.zip || exit 3
# Augmentation de la taille de la partition racine
truncate -s 8GiB $RASP_OS.img
sudo parted $RASP_OS.img resizepart 2 100%
sudo losetup --show -P /dev/loop99 $RASP_OS.img
sudo e2fsck -f /dev/loop99p2
sudo resize2fs /dev/loop99p2
sudo losetup -d /dev/loop99
fi
# Téléchargement des fichiers kernel-qemu et dtb
if ! [[ -e $DTB ]]; then
wget $DTB_URL || exit 4
fi
if ! [[ -e $KERNEL ]];then
wget $KERNEL_URL || exit 5
fi
# Démarrage émulation ?
read -p "Démarrer l'émulation ? oui/"
if [[ $REPLY = oui ]]; then
qemu-system-arm \
-M versatilepb \
-cpu arm1176 \
-m 256 \
-drive "file=$RASP_OS.img,if=none,index=0,media=disk,format=raw,id=disk0" \
-device "virtio-blk-pci,drive=disk0,disable-modern=on,disable-legacy=off" \
-net nic \
-net "user,hostfwd=tcp::5022-:22" \
-dtb $PWD/$DTB \
-kernel $PWD/$KERNEL \
-append 'root=/dev/vda2 panic=1' \
-no-reboot \
-serial stdio
fi
exit