スポンサーリンク

Raspberry Pi OS 64-bit を qemu 7.2.0 で動作させる

RaspberryPi OS 64-bit on qemu 7.2.0
記事内に広告が含まれています。
スポンサーリンク
  1. QEMU 仮想マシンで Raspberry PI OS を試す
  2. qemu のインストール
    1. qemu のバージョンは 7.2.0
    2. Windows11 に qemu をインストール
    3. WSL2 Debian 11 (bullseye) backports に qemu をインストール
    4. WSL2 Ubuntu 23.04 (Lunar Lobster) に qemu をインストール
  3. Raspberry Pi OS の準備
    1. Raspberry Pi OS のダウンロード
    2. kernel と dtb (device tree blob) ファイルの抜き出し
    3. イメージファイルのリサイズ
  4. qemu で Raspberry Pi OS with desktop を起動
    1. Windows11 の場合 (bat)
    2. WSL2 Debian & Ubuntu の場合 (bash script)
    3. qemu のオプションについて
  5. Raspberry Pi OS with desktop の初期設定
    1. Welcome to the Raspberry Pi Desktop! (起動直後の画面)
    2. Set Country (国と言語とタイムゾーンの設定)
    3. Create User (一般ユーザーの作成)
    4. Set Up Screen (画面表示の調整)
    5. Update Software (ソフトウェアの更新)
    6. Setup Complete (初期設定終了、再起動)
    7. 初期設定終了後の起動
  6. Raspberry Pi OS with desktop の設定 続き
    1. raspi-config による設定
    2. 6 Advanced Options, A1 Expand Filesystem
    3. 3 Interface Options, I2 SSH
    4. swap の拡張
    5. ソフトウェアのアップデート、kernel & dtb ファイルの再抜き出し
    6. systemd service の状況
    7. 個人的に不要なサービスの削除
  7. qemu で Raspberry Pi OS Lite を起動する
    1. 手順の概略
    2. Raspberry Pi OS Lite の起動と初期設定
    3. Raspberry Pi OS Lite の設定の続き
      1. Locale の設定
      2. Timezone の設定
      3. その他の設定
      4. 起動に要する時間
      5. apt update & upgrade
  8. 使ってみた印象
    1. Raspberry Pi OS with desktop について
    2. Raspberry Pi OS Lite について
  9. その他
    1. qemu の -netdev user を使用した場合には ping (ICMP) が通らない
    2. 64-bit Raspberry Pi OS の bcm2708_fb は qemu 7.1.0 以降で使用可能
    3. apt line の変更が簡単には出来なくなった
  10. まとめ
  11. 今回のアイキャッチ画像

QEMU 仮想マシンで Raspberry PI OS を試す

私は昔から x86 以外の小さいコンピュータに触れる事を楽しく感じています。

古くは OpenBlockS 初代 (シリーズの系譜、PowerPC) や玄箱 (Wikipedia、PowerPC) と、省スペースな Linux マシンをメインの PC とは別に使用していました。OpenBlockS はインターネット向けの NAT Box として使用し、玄箱は OpenBlockS 用のバイナリ作成マシン兼 NAS として使用していました。何方も x86 とは異なる環境で、ハードウェア寄りのプログラムを組んだりして色々と楽しい経験が出来ました。

最近だと Raspberry Pi が面白そうで使ってみたいのですが、品薄に伴う入手性の悪化と高値での転売が横行していて、とても実機を入手する状況ではないと感じています。また、昔の様に小さいとはいえ PC を増やす事は、家庭持ちの身には家族の理解を得る事も難しくなってきました。

このような環境ですので、メイン PC 上で仮想マシンを動作させる事に最近は興味が移っています。はてなブログの日記では、Hyper-V / Virtualbox / WSL2 / qemu の仮想マシンを使用して、Android-x86 を動作させたり、WSL2 に Plamo Linux をインストールしたり、Path through ディスクを利用して仮想マシンと実機の両方で起動できるようにしたり、と色々と試してきました。

これまではメイン PC と同じ x86 環境の仮想マシンを試してきましたが、そろそろ別のアーキテクチャ (CPU) の仮想マシンを試してみたいと考えていました。Raspberry Pi も供給が安定したら実機を1台入手したいとは考えていますが、その前に仮想マシンで Raspberry Pi OS を試してみる事にしました。

20230507 追記 : 32bit 版でも検証しました。

以下の qiita のページを参考に作業しました。

スポンサーリンク

qemu のインストール

まずは qemu をインストールします。Raspberry Pi OS を GUI 有効で起動する為には、qemu のバージョンに注意が必要です。

qemu のバージョンは 7.2.0

CUI で使用する場合にはバージョンが古くても大丈夫ですが、Raspberry Pi OS 64-bit を GUI 有効で起動する為には qemu 7.2.0 が必要です。(未検証ですが、ソースを確認すると 7.1.0 から対応しているようです。後述します)

2023年4月時点で qemu 7.2.0 が使用できるのは、Windows11 上で動作するものとしては

  • Windows11 版 qemu (winget)
  • WSL2 Debian 11 (bullseye-backports)
  • WSL2 Ubuntu 23.04 (Lunar Lobster)

になります。Ubuntu 22.04 LTS (Jammy Jellyfish) や 22.10 (Kinetic Kudu) では、qemu のバージョンが古い為に GUI は使用できません。ソースからビルドする等、他の方法で qemu 7.2.0 を準備する必要があります。

Windows11 に qemu をインストール

インストーラを落として入れても良いですが、winget で入れるのが簡単です。

> winget search qemu
名前             ID                                        バージョン 一致              ソース
----------------------------------------------------------------------------------------------
QEMU             SoftwareFreedomConservancy.QEMU           7.2.0      ProductCode: qemu winget
QEMU guest agent SoftwareFreedomConservancy.QEMUGuestAgent 102.10.0                     winget
> winget install qemu
> ls 'C:\Program Files\qemu\qemu-system-aarch64.exe'

    Directory: C:\Program Files\qemu

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          2022/12/31     2:22       17833344 qemu-system-aarch64.exe

> & 'C:\Program Files\qemu\qemu-system-aarch64.exe' --version
QEMU emulator version 7.2.0 (v7.2.0-11948-ge6523b71fc-dirty)
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers

> & 'C:\Program Files\qemu\qemu-system-aarch64.exe' -machine help | select-string rasp

raspi0               Raspberry Pi Zero (revision 1.2)
raspi1ap             Raspberry Pi A+ (revision 1.1)
raspi2b              Raspberry Pi 2B (revision 1.1)
raspi3ap             Raspberry Pi 3A+ (revision 1.0)
raspi3b              Raspberry Pi 3B (revision 1.2)

C:\Program Files\qemu 以下にインストールされます。2023年4月現在では qemu 7.2.0 がインストールされます。

WSL2 Debian 11 (bullseye) backports に qemu をインストール

Debian 11 (bullseye) の backports を使用すると qemu 7.2.0 をインストールする事ができます。

始めに WSL2 に Debian 11 (bullseye) をインストールします。

>wsl.exe --install Debian

WSL2 用の初期設定を済ませます。WSL2 Ubuntu とは異なり systemd は使用できないようですが、qemu の動作には支障ありません。

パッケージを最新にアップグレードします。

$ sudo apt update
$ sudo apt upgrade

apt line には元々 backports が入っているので、下記のように bullseye-backports を指定すればインストールできます。

$ sudo apt install -t bullseye-backports qemu-system-arm

qemu 7.2.0 が使用できるようになります。

$ qemu-system-aarch64 --version
QEMU emulator version 7.2.0 (Debian 1:7.2+dfsg-5~bpo11+1)
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
$ qemu-system-aarch64 -machine help | grep -i rasp
raspi0               Raspberry Pi Zero (revision 1.2)
raspi1ap             Raspberry Pi A+ (revision 1.1)
raspi2b              Raspberry Pi 2B (revision 1.1)
raspi3ap             Raspberry Pi 3A+ (revision 1.0)
raspi3b              Raspberry Pi 3B (revision 1.2)

WSL2 Ubuntu 23.04 (Lunar Lobster) に qemu をインストール

Ubuntu 23.04 (Lunar Lobster) は 2023年4月21日に公開されました。こちらのバージョンでは、qemu 7.2.0 が使用できます。

こちらのページを参考に WSL2 Ubuntu 23.04 をインストールします。私は Ubuntu 22.10 にアップデート済みでしたので、Ubuntu 22.10 から 23.04 にアップデートします。手順のみ列記します。

# Prompt を LTS から normal に変更
$ cat /etc/update-manager/release-upgrades | grep -v ^#

[DEFAULT]
Prompt=normal

# 更新前のバージョン
$ cat /etc/os-release | grep ^VERSION=
VERSION="22.10 (Kinetic Kudu)"

$ sudo apt update 
$ sudo apt upgrade

# Ubuntu 23.04 へアップグレード
$ sudo do-release-upgrade -d

# 更新後のバージョンの確認
$ cat /etc/os-release | grep ^VERSION=
VERSION="23.04 (Lunar Lobster)"

Ubuntu 23.04 にアップグレードできた事が確認できたら qemu-system-arm をインストールします。qemu 7.2.0 が使用できるようになります。

$ sudo apt install qemu-system-arm
$ qemu-system-aarch64 --version
QEMU emulator version 7.2.0 (Debian 1:7.2+dfsg-5ubuntu2)
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
$ qemu-system-aarch64 -machine help | grep -i rasp
raspi0               Raspberry Pi Zero (revision 1.2)
raspi1ap             Raspberry Pi A+ (revision 1.1)
raspi2b              Raspberry Pi 2B (revision 1.1)
raspi3ap             Raspberry Pi 3A+ (revision 1.0)
raspi3b              Raspberry Pi 3B (revision 1.2)

Raspberry Pi OS の準備

Raspberry Pi OS は、Linux のディストリビューションの一つである debian を Raspberry Pi 向けに使用できるようにした Raspberry Pi 財団公式のディストリビューションです。以前は Rasbian と呼ばれていました。

Raspberry Pi OS のイメージを準備して、qemu で使用できる形に調整します。

Raspberry Pi OS のダウンロード

Raspberry Pi OS は SD カード用のイメージで配布されているので、Raspberry Pi 実機で使用する場合には SD カードにイメージを書き込み、こちらから起動して使用します。

仮想マシンで使用する場合には SD カードに書き込む必要はありません。イメージファイルを入手します。以下に機種毎のイメージファイルがあります。

イメージファイルには以下の種類があります。32-bit のイメージは全ての Raspberry Pi に対応し、64-bit のイメージは Raspberry Pi 3以降、Zero 2W 以降に対応します。

  • Raspberry Pi OS (32-bit, Debian 11 bullseye ベース)
    • Raspberry Pi OS with desktop
    • Raspberry Pi OS with desktop and recommended software
    • Raspberry Pi OS Lite
  • Raspberry Pi OS (64-bit, Debian 11 bullseye ベース)
    • Raspberry Pi OS with desktop
    • Raspberry Pi OS Lite
  • Raspberry Pi OS (Legacy, 32-bit, Debian 10 buster ベース)
    • Raspberry Pi OS (Legacy) with desktop
    • Raspberry Pi OS Lite (Legacy)
  • Raspberry Pi Desktop (32-bit, Debian 11 bullseye ベース)

今回は、64-bit 版の Raspberry Pi OS with desktop と Lite を使用します。2023年4月時点での最新は 2023-02-21 でしたので、こちらを使用しました。この後の作業も考えて WSL2 側でダウンロードして展開します。

$ mkdir RasPi3 && cd RasPi3
$ wget https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2023-02-22/2023-02-21-raspios-bullseye-arm64.img.xz
$ xz -d 2023-02-21-raspios-bullseye-arm64.img.xz
$ ls -l *img
-rw-r--r-- 1 hiro hiro 4395630592  2月 21 13:34 2023-02-21-raspios-bullseye-arm64.img

新しめの Raspberry Pi OS では画面が暗転して GUI が使えず、古いイメージを使用するという記事が多いですが、原因は qemu のバージョンが古い為です。qemu 7.2.0 であれば 2023-02-21 の 64-bit 版 Rasberry Pi OS でも GUI は表示できます。

これでイメージファイルが入手できました。

kernel と dtb (device tree blob) ファイルの抜き出し

qemu に x86 環境の Ubuntu 等をインストールする場合には、インストール用の ISO イメージをマウントして、こちらから起動した後で、仮想HDDにインストールするという手順でした。

Raspberry Pi OS の場合には、既に起動できる状態のイメージが提供されています。qemu から起動する場合にはイメージ内の kernel を直接読み込めないので、イメージの中から kernel を抜き出して、qemu のオプションに指定する必要があります。また、arm 系の kernel には、固有のハードウェアの情報が記録されている dtb ファイル (device tree blob) が必要のようです。こちらについても、イメージ内に含まれているので、抜き出して qemu のオプションに指定します。

以下、WSL2 で作業します。イメージファイルを loopback mount して kernel と dtb ファイルを抜き出します。

$ sudo losetup --show -fP ./2023-02-21-raspios-bullseye-arm64.img
/dev/loop0
$ sudo mkdir /mnt/raspi3img
$ ls /dev/loop0*
loop0    loop0p1  loop0p2
# /dev/loop0p1 が root
$ sudo mount /dev/loop0p1 /mnt/raspi3img

# kernel8.img と bcm2710-rpi-3-b.dtb が必要なファイル
$ cp /mnt/raspi3img/kernel8.img /mnt/raspi3img/bcm2710-rpi-3-b.dtb .

# 後始末
$ sudo umount /mnt/raspi3img
$ sudo rmdir /mnt/raspi3img
$ sudo losetup -d /dev/loop0

# 必要なファイルの確認
$ ls
2023-02-21-raspios-bullseye-arm64.img
bcm2710-rpi-3-b.dtb
kernel8.img

元のイメージファイルと同じディレクトリに kernel と dtb ファイルを配置します。

イメージファイルのリサイズ

半端なサイズのイメージファイルでは使用できないので、8GB にリサイズします。8GB あれば、1回目のアップデートでも未だ余裕のある容量です。後で同様の作業で増やす事も可能です。

$ qemu-img resize ./2023-02-21-raspios-bullseye-arm64.img 8G
WARNING: Image format was not specified for './2023-02-21-raspios-bullseye-arm64.img' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.
Image resized.
$ ls -l *img
total 1323228
-rw-r--r-- 1 hiro hiro 8589934592 Apr 15 23:14 2023-02-21-raspios-bullseye-arm64.img

リサイズしないで起動しようとすると、以下のメッセージが表示されます。

$ ./run.sh
qemu-system-aarch64: Invalid SD card size: 1.95 GiB
SD card size has to be a power of 2, e.g. 2 GiB.
You can resize disk images with 'qemu-img resize <imagefile> <new-size>'
(note that this will lose data if you make the image smaller than it currently is).

qemu で Raspberry Pi OS with desktop を起動

Windows11 も Linux (Debian & Ubuntu) も、指定しているオプションは同一です。起動に要した時間は、Ryzen 7 3800x (8c16t)、メモリ 64 GB の環境での結果です。

Windows11 の場合 (bat)

Windows11 の場合にはバッチファイル (bat) で起動します。run.bat 等で保存して実行します。

"C:\Program Files\qemu\qemu-system-aarch64.exe" ^
-m 1024 ^
-M raspi3b ^
-kernel kernel8.img ^
-dtb bcm2710-rpi-3-b.dtb ^
-drive format=raw,file=2023-02-21-raspios-bullseye-arm64.img ^
-append "console=ttyAMA0 root=/dev/mmcblk0p2 rw rootwait rootfstype=ext4 dwc_otg.fiq_fsm_enable=0 bcm2708_fb.fbwidth=1280 bcm2708_fb.fbheight=720" ^
-serial stdio ^
-no-reboot ^
-device usb-kbd ^
-device usb-tablet ^
-device usb-net,netdev=net0 ^
-netdev user,id=net0,hostfwd=tcp::2222-:22
Windows11 qemu GUI 起動直後 ラズベリーが4個表示
Windows11 qemu GUI 起動直後 Welcome 表示

ログインプロンプトが表示されるまで56秒、GUI の初期画面が表示されるまで1分53秒を要しました。

WSL2 Debian & Ubuntu の場合 (bash script)

WSL2 (Debian & Ubuntu) の場合には bash スクリプトで起動します。run_desktop.sh 等で保存して実行ます。chmod 755 で実行フラグを付加しておくと便利です。

#!/bin/sh

qemu-system-aarch64 \
-m 1024 \
-M raspi3b \
-kernel kernel8.img \
-dtb bcm2710-rpi-3-b.dtb \
-drive format=raw,file=2023-02-21-raspios-bullseye-arm64.img \
-append "console=ttyAMA0 root=/dev/mmcblk0p2 rw rootwait rootfstype=ext4 dwc_otg.fiq_fsm_enable=0 bcm2708_fb.fbwidth=1280 bcm2708_fb.fbheight=720" \
-serial stdio \
-no-reboot \
-device usb-kbd \
-device usb-tablet \
-device usb-net,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp::2222-:22
WSLg qemu GUI 起動直後 ラズベリーが4個表示
WSLg qemu GUI 起動直後 Welcome 表示

ログインプロンプトが表示されるまで1分5秒、GUI の初期画面が表示されるまで2分を要しました。WSL2 Debian と WSL2 Ubuntu では差はありませんでした。Windows11 と比較すると若干遅いです。

qemu のオプションについて

qemu に指定しているオプションについて説明します。

  • メモリ (-m 1024) とマシンタイプ (-M raspi3b) は固定です。メモリ増量は出来ません。
  • -kernel と -dtb には、イメージから抜き出したファイルを指定します。
  • append の bcm2708_fb はフレームバッファの名称です。qemu では bcm2835-fb で認識されてメニューで表示されますが、append では bcm2708_fb で指定します。fbheight と fbwidth で GUI の画面サイズを指定できます。
  • -serial stdout を指定すると、起動した端末に起動ログとログインプロンプトが表示されます。ただし、端末情報が正常に設定されていない為か画面表示が乱れます。CLI を使用したい場合には ssh で接続する事をお勧めします。このオプションを消去すると GUI 側に端末の表示が追加されます。
  • -device に usb-mouse の代わりに usb-tablet を指定すると、ホスト側と仮想環境側のマウスカーソルが同期します。
  • 最後の -netdev の行はホスト側から仮想環境側に ssh 接続する為の設定です。ssh サーバを起動すれば、以下のコマンドで仮想環境の Raspberry Pi OS にパスワード認証でログインできます。複数の Raspberry Pi OS 仮想マシンを起動する場合には、割り当てるポート番号 (2222) を変更する事で対応できます。
$ ssh -p 2222 username@localhost

Raspberry Pi OS with desktop の初期設定

Raspberry Pi OS が起動できたら、一般ユーザー登録を含む初期設定を行います。qemu で GUI が起動してしまえば、Windows11 や WSL2 の仮想マシンでも、実機と同様の作業となります。

以下では Windows11 の qemu で実行した場合の初期設定について説明します。

Welcome to the Raspberry Pi Desktop! (起動直後の画面)

GUI が起動すると、Welcome 画面が表示されます。

Welcome to the Raspberry Pi Desktop!

Set Country (国と言語とタイムゾーンの設定)

Country と Language、Timezone を選択します。Use English language と Use US keyboard の設定はお好みで。Use English language のチェックを入れると home 以下に自動で作られるディレクトリ名が英語表記になります。

Set Country

Create User (一般ユーザーの作成)

一般ユーザーを作成します。

Create User

Set Up Screen (画面表示の調整)

実機で使用している場合に、モニターと表示エリアに違いがある場合に修正する為の設定だと思います。仮想マシンでは必要ありません。

Set Up Screen

Update Software (ソフトウェアの更新)

Raspberry Pi OS のソフトウェアの更新を行うかどうかを選択します。後で何時でも実行できますし、後述しますが root directory の残り容量が少ないので、初期設定時には Skip した方がよいと思います。

Update Software

Setup Complete (初期設定終了、再起動)

初期設定の内容を反映して再起動します。といっても、qemu 仮想マシンの場合には再起動はせずにシャットダウンして、GUI ウィンドウは閉じます。

Setup Complete

ここまでで初期設定は終了です。一般ユーザーの登録が出来ましたので、ログイン可能になります。

初期設定終了後の起動

もう一度 Raspberry Pi OS を起動すると、一般ユーザーでログインした状態で GUI 画面が表示されます。ネットワークにも接続しています。

とはいえ、root directory は 95% 使用と残り容量も少なく、ソフトウェアアップデートも難しい状況です。(イメージファイルのリサイズは未だ反映されていません)

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root        3889688 3484344    187644  95% /
devtmpfs          437184       0    437184   0% /dev
tmpfs             471840       0    471840   0% /dev/shm
tmpfs             188740     904    187836   1% /run
tmpfs               5120       0      5120   0% /run/lock
/dev/mmcblk0p1    261108   31292    229816  12% /boot
tmpfs              94368      28     94340   1% /run/user/1000

$ free
               total        used        free      shared  buff/cache   available
Mem:          943684      202564      256016        5324      485104      677516
Swap:         102396           0      102396

次項でもう少し調整します。

Raspberry Pi OS with desktop の設定 続き

Raspberry Pi OS の初期設定が終了すると一般ユーザーでログインできるようになります。初期設定以外の項目について、使用する目的に合わせて設定します。

raspi-config による設定

Raspberry Pi OS を起動した端末で raspi-config を実行します。

$ sudo raspi-config
raspi-config 起動直後

Ctrl + n で下、Ctrl + p で上にカーソルが移動します (Emacs のキー操作です)。Tab で <Select> と <Finish> にカーソルが移動します。設定を変更する項目のみ説明します。

6 Advanced Options, A1 Expand Filesystem

6 Advanced Options を選択し、A1 Expand Filesystem を選択します。先に行ったイメージのリサイズの最大容量まで root filesystem を拡張します。

6 Advanced Options, A1 Expand Filesystem

root partition が拡張されましたので、再起動して反映させます。

A1 Expand Filesystem 実行後

95% 使用していた root partition が 47% になりました。これでソフトウェアアップデートを実行できる状態になりました。

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root        7921460 3500968   4040432  47% /
devtmpfs          437184       0    437184   0% /dev
tmpfs             471840       0    471840   0% /dev/shm
tmpfs             188740     884    187856   1% /run
tmpfs               5120       0      5120   0% /run/lock
/dev/mmcblk0p1    261108   31292    229816  12% /boot
tmpfs              94368      16     94352   1% /run/user/1000

3 Interface Options, I2 SSH

Raspberry Pi OS を起動した端末は terminal の設定が正常にされておらず使いにくいので、SSH Server を起動します。3 Interface Options を選択し、I2 SSH を選択します。

I2 SSH を選択

SSH server を起動させる際の注意事項が表示されますので、確認の上で TAB で切り替えて <Yes> を選択します。

I2 SSH 選択後

SSH server が起動できれば下の画面になります。

SSH server 起動成功

localhost の port 2222 に ssh で接続すると、Raspberry Pi OS にログインできます。

>ssh -p 2222 hiro@localhost
hiro@raspberrypi:~ $

ssh でログインすると、raspi-config も ncurses が有効になり使いやすくなります。

ssh で Raspberry Pi OS に接続し raspi-config を起動

上下矢印で移動できるようになります。<Select> と <Finish> に移動するのは TAB です。

swap の拡張

初期状態では、swap は 100MB に設定されています。

$ sudo service dphys-swapfile status
● dphys-swapfile.service - dphys-swapfile - set up, mount/unmount, and delete a swap file
     Loaded: loaded (/lib/systemd/system/dphys-swapfile.service; enabled; vendor preset: enabled)
     Active: active (exited) since Fri 2023-04-21 22:45:20 JST; 1h 13min ago
       Docs: man:dphys-swapfile(8)
   Main PID: 421 (code=exited, status=0/SUCCESS)
      Tasks: 0 (limit: 1024)
        CPU: 0
     CGroup: /system.slice/dphys-swapfile.service

Apr 21 22:45:14 raspberrypi systemd[1]: Starting dphys-swapfile - set up, mount/unmount, and delete a swap file...
Apr 21 22:45:17 raspberrypi dphys-swapfile[323]: want /var/swap=100MByte, checking existing: keeping it
Apr 21 22:45:20 raspberrypi systemd[1]: Finished dphys-swapfile - set up, mount/unmount, and delete a swap file.

メインメモリ 1GB + スワップ 100MB では足りなくなりますので、スワップを 1GB に増量します。

$ cat /etc/dphys-swapfile | grep -v ^# | uniq

CONF_SWAPSIZE=1024

$ sudo service dphys-swapfile restart
$ free
               total        used        free      shared  buff/cache   available
Mem:          943684      219928      179928        5324      543828      652884
Swap:        1048572           0     1048572

これで多少の負荷を掛けても良い状態になりました。

ソフトウェアのアップデート、kernel & dtb ファイルの再抜き出し

初期設定で skip していたソフトウェアのアップデートを実行します。53個のパッケージがアップデートされますが、パッケージのダウンロードには時間を要しますので気長に待ちます。

$ sudo apt update
$ sudo apt upgrade

今回のアップデートでは kernel と dtb が更新されました。その結果、古い kernel と dtb ファイルで起動した場合にネットワークが認識できなくなりました。

$ cat /proc/version
Linux version 6.1.21-v8+ (dom@buildbot) (aarch64-linux-gnu-gcc-8 (Ubuntu/Linaro 8.4.0-3ubuntu1) 8.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #1642 SMP PREEMPT Mon Apr  3 17:24:16 BST 2023
$ ls -l /boot/bcm*rpi-3-b.*
-rwxr-xr-x 1 root root 32142 Apr 22 21:13 /boot/bcm2710-rpi-3-b.dtb

更新された kernel と dtb ファイルを前述の手順で再度抜き出し、起動スクリプトに指定すれば、ネットワークの接続不具合は解消しました。

systemd service の状況

systend で起動する service のうち、次の二つについては起動できませんでした。

$ systemctl list-units | grep 'failed failed'
● hciuart.service            loaded failed failed    Configure Bluetooth Modems connected by UART
● rpi-eeprom-update.service  loaded failed failed    Check for Raspberry Pi EEPROM updates

コメントをみると、Bluetooth Modem と EEPROM に関する物ですので、仮想環境では気にしないでも良いかと思います。

個人的に不要なサービスの削除

プリンタ印刷用のサービスの CUPS は仮想環境でも実環境でも不要かと思いますので削除します。

$ systemctl list-units *cups*
  UNIT                 LOAD   ACTIVE SUB     DESCRIPTION
  cups.path            loaded active running CUPS Scheduler
  cups-browsed.service loaded active running Make remote CUPS printers available locally
  cups.service         loaded active running CUPS Scheduler
  cups.socket          loaded active running CUPS Scheduler
$ dpkg -l cups
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version            Architecture Description
+++-==============-==================-============-===================================================================
ii  cups           2.3.3op2-3+deb11u2 arm64        Common UNIX Printing System(tm) - PPD/driver support, web interface
$ sudo apt purge cups
$ sudo apt autoremove
$ dpkg -l | grep ^rc
rc  bc                   1.07.1-2+b2         arm64  GNU bc arbitrary precision calculator language
rc  cups-browsed         1.28.7-1+deb11u1    arm64  OpenPrinting CUPS Filters - cups-browsed
rc  cups-core-drivers    2.3.3op2-3+deb11u2  arm64  Common UNIX Printing System(tm) - driverless printing
rc  cups-daemon          2.3.3op2-3+deb11u2  arm64  Common UNIX Printing System(tm) - daemon
rc  cups-filters         1.28.7-1+deb11u1    arm64  OpenPrinting CUPS Filters - Main Package
rc  fuse                 2.9.9-5             arm64  Filesystem in Userspace
rc  libsane-hpaio:arm64  3.21.2+dfsg1-2      arm64  HP SANE backend for multi-function peripherals
rc  ssl-cert             1.1.0+nmu1          all    simple debconf wrapper for OpenSSL

$ sudo apt purge bc cups-browsed cups-core-drivers cups-daemon cups-filters fuse libsane-hpaio:arm64 ssl-cert

同様にして、不要なサービス・パッケージを削除します。

qemu で Raspberry Pi OS Lite を起動する

GUI が不要な用途では、Raspberry Pi OS Lite を使う方がイメージのサイズも小さく、不要な GUI のソフトウェアも入っていないので便利です。

しかし、Raspberry Pi OS になってから、初めから登録されている一般ユーザーの pi が使用できなくなりました。実機で使用する場合には、Raspberry Pi OS Lite の初期設定を行う Raspberry Pi Imager というソフトウェアを使用する事が出来ますが、qemu で Raspberry OS Lite を使用する場合には適用できません。

Raspberry Pi OS Lite を使用する場合の初期設定の方法について説明します。

手順の概略

Raspberry Pi OS Lite の場合も、Raspberry Pi OS with desktop と同様に、初回起動時に初期設定の画面が表示されます。

最初の手順については Raspberry Pi OS with desktop と変わりません。変更点のみ追記します。

  • Raspberry Pi OS のダウンロード Raspberry Pi OS Lite をダウンロードします。
  • kernel と dtb (device tree blob) ファイルの抜き出し Raspberry Pi OS Lite のイメージから抜き出します。kernel8_lite.img と bcm2710-rpi-3-b_lite.dtb の名前で、Raspberry Pi OS Lite のイメージと同じディレクトリに配置します。
  • イメージファイルのリサイズ 8GBに変更します。

起動用のスクリプトを変更して Raspberry Pi OS Lite を起動します。Windows11 用の起動用スクリプト run_lite.bat を以下に示します。

"C:\Program Files\qemu\qemu-system-aarch64.exe" ^
-m 1024 ^
-M raspi3b ^
-kernel kernel8_lite.img ^
-dtb bcm2710-rpi-3-b_lite.dtb ^
-drive format=raw,file=2023-02-21-raspios-bullseye-arm64-lite.img ^
-append "console=ttyAMA0 root=/dev/mmcblk0p2 rw rootwait rootfstype=ext4 dwc_otg.fiq_fsm_enable=0 bcm2708_fb.fbwidth=640 bcm2708_fb.fbheight=480" ^
-serial stdio ^
-no-reboot ^
-device usb-kbd ^
-device usb-tablet ^
-device usb-net,netdev=net0 ^
-netdev user,id=net0,hostfwd=tcp::2222-:22

GUI は使用しませんが、初期設定に必要なので bcm2708_fb の設定を残しておきます。画面サイズは 640 x 480 としました。

Raspberry Pi OS Lite の起動と初期設定

Raspberry Pi OS Lite を起動すると、初期設定の画面が表示されます。

始めにキーボードの配置を選択します。Other を選択すると Japanese の選択肢も選べます。

Windows11 qemu Raspberry Pi OS Lite 起動直後 キーボードの選択
キーボードの選択 Other を選ぶと Japanese も選択できる

次に一般ユーザーを登録します。ユーザー名の入力とパスワードを2回入力します。

一般ユーザーの登録 ユーザー名の登録
一般ユーザーの登録 パスワードの登録 (2回入力)

登録が終了すると、CUI のログイン画面になりますので、登録したユーザーでログインします。

初期設定終了 一般ユーザーログイン

これで一般ユーザーでログインする事が出来るようになりました。

Raspberry Pi OS Lite の設定の続き

Raspberry Pi OS with desktop の時に設定してた locale や timezone は raspi-config で設定します。

$ sudo raspi-config
raspi-config 起動直後

Locale や Timezone は 5 Localisation Options で設定します。

5 Localisasion Options を選択

Locale の設定

L1 Locale を選択します。

L1 Locale を選択

"en_US.UTF-8 UTF-8" と 'ja_JP.UTF-8 UTF-8" を有効にしておけば良いかと思います。

en_US.UTF-8 と ja_JP.UTF-8 のチェックを入れる

デフォルトの locale を選択します。お好みですが、個人的には必要以上に日本語化されるのは好みではありませんので、デフォルトは C にしておいて、必要な場合のみ ja_JP に切り替えるようにしたいと思います。

デフォルトの locale を選択

Locale の設定が終了すると、初期画面に戻ります。

Timezone の設定

次に Timezone を設定します。5 Localisasion Options から L2 Timezone を選択します。

L2 Timezone の設定

Asia -> Tokyo を選択します。

Asia を選択
Tokyo を選択

Timezone の設定が終了すると、初期画面に戻ります。

その他の設定

  • Raspberry Pi OS with desktop と同様に、6 Advanced Options -> A1 Expand Filesystem を選択して、root partition を最大限拡張します。
  • swap についても同様に拡張します。
  • SSH や VNC の設定もありますので、必要に応じて選択します。SSH を有効にしても systemd で有効になっていない場合には、以下のコマンドで有効化します。
$ sudo systemctl enable ssh
$ sudo systemctl restart ssh

起動に要する時間

各 qemu で Raspberry Pi OS Lite のログインプロンプトが表示されるまでの時間を測定しました。

  • Windows11 qemu : 40 秒
  • WSL2 Ubuntu 23.04 qemu : 42 秒
  • WSL2 Debian11 backports qemu : 43秒

環境の差は誤差範囲でしょうか。Raspberry Pi OS with Desktop と比較すると 20秒から30秒短く、GUI の表示が完了するまでと比較すると1分以上短い結果でした。

各種サーバをインストールすれば起動時間は長めになりますが、GUI が不要であれば Raspberry Pi OS Lite の方を使用するのが良いと思います。

apt update & upgrade

Raspberry Pi OS Lite の場合は、アップグレードされるファイルは libxml2 の1つのみでした。upgrade も直ぐに終了します。kernel や dtb ファイルも更新されませんので、そのまま使用できます。

$ sudo apt update
$ sudo apt upgrade

使ってみた印象

qemu 7.2.0 で Raspberry Pi OS 64-bit を動作させた印象について、これまで様々な x86-64 の OS を動作させてきた経験と比較して記載します。

Raspberry Pi OS with desktop について

  • GUI の起動まで約2分を要しました。流石に CPU のエミュレーションは大きく影響しています。同じ CPU アーキテクチャであれば kvm を利用して高速化も図れますが、別の CPU ではそれも使えません。
  • とはいえ、一度起動してしまえば、反応は鈍いもののウェブブラウザも起動します。Youtube を見る等は難しいですが、ちょっとしたテキストや画像のページであれば、表示させる事は可能です。
  • アイキャッチ画像に、私の日記を chromium で表示させました。全て表示させるのには時間はかかりますが、不可能という程ではないと思います。
  • 実用的かと言われたら、流石に常用は難しいと感じました。仮想マシンでの動作は、あくまでも試用と動作確認まででしょう。
  • ssh で CLI で操作する場合にも、所々で引っ掛かるような動作をしていました。GUI を有効にして使用するのは、少々厳しいと感じました。

Raspberry Pi OS Lite について

  • CUI でログインプロンプトが表示されるまで約40秒を要しました。起動ログを見ていると、一昔前の Linux の起動時を見ているような気持になります。目で追いかけるのは難しいですが、エラー等が発生しているのは認識できる程度の速度です。
  • ログインしてからの一つ一つのコマンドの応答はまずまずだと思います。GUI 有効の時と比較すれば、応答は良いと感じました。
  • CPU を含めた環境をエミュレートしているのでしょうがないですが、apt を実行したときのディスクアクセスやネットワークアクセス、データ取得後の処理は一呼吸置くような感じです。この部分に関しては、ふた昔前のアップデートの感覚です。
  • GUI 有効の時と比較すれば、CUI であればまずまず使えるという感触でした。これなら、実機で試す前の試用環境として十分使えるのではないかと思います。

その他

qemu や Raspberry Pi OS をインストールしている際に気付いた点について記載します。

qemu の -netdev user を使用した場合には ping (ICMP) が通らない

WSL2 の qemu の Raspberry Pi OS を使用している際に、動作確認の為に ping を使用すると、ホスト側や外部のネットワークから応答が返ってこない事がありました。

qemu の -netdev user を使用して NAT で外部と通信させている場合には、基本的には ping (ICMP) は通らないと考えておいた方が良さそうです。

その場合でも TCP / UDP は通りますので、apt 等のコマンドは問題なく使用できます。

なお、Windows11 の qemu 上の Raspberry Pi OS からは問題なく ping が通りました。

64-bit Raspberry Pi OS の bcm2708_fb は qemu 7.1.0 以降で使用可能

Raspberry Pi OS は bcm2708_fb フレームバッファを使用してグラフィック画面を表示します。フレームバッファが有効になると、ラズベリーが4つ表示された後で GUI 画面が表示されます。フレームバッファを認識できた場合には、dmesg のログに次のように記録されます。

[    1.382166] bcm2708_fb soc:fb: FB found 1 display(s)
[    1.432890] bcm2708_fb soc:fb: Registered framebuffer for display 0, size 1280x720

フレームバッファを認識できなかった場合には、dmesg のログは以下のようになります。

[    1.781587] bcm2708_fb soc:fb: Unable to determine number of FBs. Disabling driver.
[    1.781647] bcm2708_fb: probe of soc:fb failed with error -2

Raspberry Pi OS で認識されるフレームバッファの名称は bcm2708_fb ですが、qemu 側では bcm2835_fb が使用されています。qemu の source では、qemu-7.2.0/hw/display-bcm2835_fb.c が Raspberry Pi のフレームバッファをエミュレートしている箇所になります。

qemu 7.0.0 では 64-bit の Raspberry Pi OS の GUI 表示ができず、qemu 7.2.0 では表示できました。qemu 7.0.0 と 7.2.0 の bcm2835_fb.c の diff の結果は以下の通りです。

--- qemu-7.0.0/hw/display/bcm2835_fb.c  2022-04-20 04:10:27.000000000 +0900
+++ qemu-7.2.0/hw/display/bcm2835_fb.c  2022-12-15 01:28:45.000000000 +0900
@@ -279,8 +279,7 @@
     newconf.xoffset = ldl_le_phys(&s->dma_as, value + 24);
     newconf.yoffset = ldl_le_phys(&s->dma_as, value + 28);

-    newconf.base = s->vcram_base | (value & 0xc0000000);
-    newconf.base += BCM2835_FB_OFFSET;
+    newconf.base = s->vcram_base + BCM2835_FB_OFFSET;

     /* Copy fields which we don't want to change from the existing config */
     newconf.pixo = s->config.pixo;

バージョン毎に追いかけると qemu 7.1.0 から対応しているようです。

apt line の変更が簡単には出来なくなった

Rasberry Pi OS とは直接は関係ありませんが、Debian 11 (bullseye) より apt line の gpg 鍵によるチェックが厳しくなったようです。

これまでは国内の ftp / http サーバーに apt line を切り替えて apt update & apt upgrade を実行していましたが、sources.list を書き換えただけだと gpg 公開鍵による確認が出来ないエラーが発生します。

Raspberry Pi OS の初期状態の apt line の gpg 鍵は /etc/apt/trusted.gpg.d/ 以下に含まれていますので問題ありませんが、apt line を変更した場合には、こちらのディレクトリに gpg 公開鍵を保管する必要があります。

公開鍵の追加、及び検証については未だ全て調べきれていません。この先、調べて記事にまとめようかと考えています。その為、今回の記事では apt line の変更については記載しませんでした。

まとめ

以前から仮想マシンで Raspberry Pi OS を使ってみたいと考えていました。前に調べた時には情報が少なく、起動させる所まで辿り着くことが出来ませんでした。

今回は、Raspberry Pi OS のイメージから kernel と dtb ファイルを抜き出して、qemu のオプションに指定する方法を見つけられましたので、無事に qemu で Raspberry Pi OS を起動させる事が出来ました。

64-bit の Raspberry Pi OS with desktop を qemu で起動させる記事では、古い Raspberry Pi OS を使用し、新しいイメージでは画面が表示されないという内容ばかりでしたが、qemu 7.2.0 を使用する事で正常に GUI を動作させる事が出来ました。常用するには難しい応答ですが、実機の前に試すのには十分かと思います。

Raspberry Pi の品薄が解消されたら、出来れば実機を入手して色々と試してみたいと考えています。その前段階として、仮想マシンで Raspberry Pi OS を起動させる事が出来ましたので、環境構築やバイナリの実行等を事前に試したいと思います。

今回のアイキャッチ画像

Raspberry Pi OS with desktop で chronium と terminal を動作させている時の画面キャプチャです。仮想マシンなので画面サイズを 1200 x 630 に指定できました。こういう所も仮想マシンは便利です。

コメント

タイトルとURLをコピーしました