こんばんにちは
QEMUではホストとは異なるアーキテクチャのシステムをエミュレートすることができます.
そこで,Windows(x86_64)上にQEMUをインストールし,その上でaarch64(arm64)をエミュレートし,Raspberry Pi OSを動かしてみます.
続きをどうぞ
目次
環境
Host
- Windows 10 Pro ver.2004 build 19041
- QEMU 5.1.0
- WSL2
- Ubuntu 20.04.1 LTS (Focal Fossa)
※ Ubuntuは .img
の操作に使います.
Guest
- Raspberry Pi OS GNU/Linux 10 (buster) arm64 lite
QEMU インストール
通常通りQEMUをインストールします.
ダウンロード
ダウンロードページより, qemu-w64-setup-20200814.exe
をダウンロードします.
インストール
インストールするコンポーネントはデフォルトのまま.
インストール先はデフォルトの C:\Program Files\qemu
としました.
確認
PS J:\raspi-buster> & 'C:\Program Files\qemu\qemu-img.exe' -V
qemu-img version 5.1.0 (v5.1.0-11824-g8699890d91-dirty)
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers
必要ファイルの準備
OS イメージ
現時点でraspberrypi.orgのダウンロードページからは32-bitのイメージしかダウンロードできません.
そこでミラーから探します.
今回はJAISTからダウンロードします.
Index of /pub/raspberrypi/raspios_lite_arm64/images/raspios_lite_arm64-2020-08-24
Ubuntu /mnt/m/DISK_IMAGE/Raspbian % wget http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_lite_arm64/images/raspios_lite_arm64-2020-08-24/2020-08-20-raspios-buster-arm64-lite.zip
Ubuntu /mnt/m/DISK_IMAGE/Raspbian % unzip 2020-08-20-raspios-buster-arm64-lite.zip
Ubuntu /mnt/m/DISK_IMAGE/Raspbian % ll 2020-08-20-raspios-buster-arm64-lite.img
-rwxrwxrwx 1 k-san k-san 2000683008 8月 20 20:55 2020-08-20-raspios-buster-arm64-lite.img*
kernelとdtb
起動に必要なファイルをイメージから取り出します.
guestfish
コマンドは libguestfs-tools
パッケージに入ってます.
Ubuntu /mnt/j/qemu-raspi-buster % sudo guestfish --ro -a /mnt/m/DISK_IMAGE/Raspbian/2020-08-20-raspios-buster-arm64-lite.img
Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.
Type: ‘help’ for help on commands
‘man’ to read the manual
‘quit’ to quit the shell
> run
100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ --:--
> list-filesystems
/dev/sda1: vfat
/dev/sda2: ext4
> mount /dev/sda1 /
> copy-out /kernel8.img .
> copy-out /bcm2710-rpi-3-b-plus.dtb .
> quit
Ubuntu /mnt/j/qemu-raspi-buster % ll
合計 15152
-rwxrwxrwx 1 k-san k-san 28599 10月 16 11:54 bcm2710-rpi-3-b-plus.dtb*
-rwxrwxrwx 1 k-san k-san 15483392 10月 16 11:53 kernel8.img*
仮想ディスク
ダウンロードした .img
ファイルからそのまま起動できるのですが,今回は別に仮想ディスクを用意します.
raw
からqcow2
に変換- 仮想的なサイズを
16G
にリサイズ(ディスク上のサイズは変化しません)
PS J:\qemu-raspi-buster> & 'C:\Program Files\qemu\qemu-img.exe' convert -f raw -O qcow2 M:\DISK_IMAGE\Raspbian\2020-08-20-raspios-buster-arm64-lite.img .\vdisk.qcow2
PS J:\qemu-raspi-buster> ls
ディレクトリ: J:\qemu-raspi-buster
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2020/10/16 11:54 28599 bcm2710-rpi-3-b-plus.dtb
-a---- 2020/10/16 11:53 15483392 kernel8.img
-a---- 2020/10/16 13:09 1333854208 vdisk.qcow2
PS J:\qemu-raspi-buster> & 'C:\Program Files\qemu\qemu-img.exe' info .\vdisk.qcow2
image: .\vdisk.qcow2
file format: qcow2
virtual size: 1.86 GiB (2000683008 bytes)
disk size: 1.24 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
PS J:\qemu-raspi-buster> & 'C:\Program Files\qemu\qemu-img.exe' resize .\vdisk.qcow2 16G
Image resized.
PS J:\qemu-raspi-buster> & 'C:\Program Files\qemu\qemu-img.exe' info .\vdisk.qcow2
image: .\vdisk.qcow2
file format: qcow2
virtual size: 16 GiB (17179869184 bytes)
disk size: 1.24 GiB
cluster_size: 65536
Format specific information:
compat: 1.1
compression type: zlib
lazy refcounts: false
refcount bits: 16
corrupt: false
ネットワーク準備
今回はホストにtapインターフェースを用意して,それに接続し,ホストにNATさせます.
TAP-Windows
ダウンロード
Windowsにtapデバイスを追加するのに, TAP-Windows
というソフトウェアをインストールします.本来はOpenVPNのインストーラーに同梱されているようですが,単体でも問題なく使用できました.
現時点での最新が 9.24.2 2020/02/20
でした.
インストール
インストールするコンポーネントは TAP Virtual Ethernet Adapter
のみで大丈夫です.
名前変更
環境によりますが, イーサネット 2
などの名称で TAP-Windows Adapter V9
のネットワークアダプターが追加されます.
指定しやすくするために イーサネット 2
を tap0
等の任意の名称に変更しておきます.
IPアドレス指定
tap0
のv4アドレスを設定します.
今回は 10.20.30.1/24
としました.
Nat 設定
管理者権限でPowershellを起動します.
-Name
は任意です.-InternalIPInterfaceAddressPrefix
はtap0
に割り当てたアドレスです.
PS C:\WINDOWS\system32> Get-NetNat
PS C:\WINDOWS\system32> New-NetNat -Name QemuNat -InternalIPInterfaceAddressPrefix 10.20.30.1/24
Name : QemuNat
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 10.20.30.1/24
IcmpQueryTimeout : 30
TcpEstablishedConnectionTimeout : 1800
TcpTransientConnectionTimeout : 120
TcpFilteringBehavior : AddressDependentFiltering
UdpFilteringBehavior : AddressDependentFiltering
UdpIdleSessionTimeout : 120
UdpInboundRefresh : False
Store : Local
Active : True
起動
起動
以下のコマンドで起動します.
PS J:\qemu-raspi-buster> & 'C:\Program Files\qemu\qemu-system-aarch64.exe' -M raspi3 -append "console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait" -dtb .\bcm2710-rpi-3-b-plus.dtb -drive file=.\vdisk.qcow2,format=qcow2,if=sd -m 1G -smp 4 -serial stdio -usb -device usb-kbd -device usb-net,netdev=net0 -netdev tap,id=net0,ifname=tap0 -kernel .\kernel8.img
QEMUのウィンドウが出現し,ズラーッとテキストが流れ,ログインプロンプトが表示されます.
Debian GNU/Linux 10 raspberrypi ttyAMA0
raspberrypi login:
ログイン
通常通りログインします.
- username: pi
- password: raspberry
Debian GNU/Linux 10 raspberrypi ttyAMA0
raspberrypi login: pi
Password:
Last login: Thu Aug 20 13:03:55 BST 2020 on tty1
Linux raspberrypi 5.4.51-v8+ #1333 SMP PREEMPT Mon Aug 10 16:58:35 BST 2020 aarch64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
pi@raspberrypi:~$
確認
Raspberry Pi OS といってもほぼDebianです.
pi@raspberrypi:~$ uname -a
Linux raspberrypi 5.4.51-v8+ #1333 SMP PREEMPT Mon Aug 10 16:58:35 BST 2020 aarch64 GNU/Linux
pi@raspberrypi:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 10 (buster)
Release: 10
Codename: buster
pi@raspberrypi:~$ getconf LONG_BIT
64
ファイルシステムリサイズ
通常ならば初回起動時にファイルシステムが自動的にリサイズされるようになっているのですが,起動時に指定していないのでリサイズさせます.
powershellからだと表示が崩れるので,QEMUのウィンドウで作業します.
pi@raspberrypi:~$ df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/root 1.6G 1.3G 219M 86% /
pi@raspberrypi:~ $ sudo raspi-config
7 Advanced Options
-> A1 Expand Filesystem
再起動します.
が,私の環境ではうまく再起動ができなくて, [ xxxx.xxxxxx] reboot: Restarting system
で止まってしまうので,QEMUのウィンドウを閉じるかpowershellで Ctrl+c
で終了させ,改めて起動します.
pi@raspberrypi:~$ df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/root 16G 1.3G 14G 9% /
IPアドレス指定
通常通り指定します.
pi@raspberrypi:~$ EDITOR=vi sudo -e /etc/dhcpcd.conf
pi@raspberrypi:~$ tail -n4 /etc/dhcpcd.conf
interface eth0
static ip_address=10.20.30.10/24
static routers=10.20.30.1
static domain_name_servers=192.168.100.30
再起動なりして反映します.
pi@raspberrypi:~$ ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether 40:54:00:12:34:57 brd ff:ff:ff:ff:ff:ff
inet 10.20.30.10/24 brd 10.20.30.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::fc11:381d:1a6f:f9b3/64 scope link
valid_lft forever preferred_lft forever
pi@raspberrypi:~$ curl -I https://blog.k-san.info
HTTP/1.1 200 OK
Date: Fri, 16 Oct 2020 06:06:09 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000
Link: <https://blog.k-san.info/wp-json/>; rel="https://api.w.org/"
Link: <https://wp.me/9vPHv>; rel=shortlink
Content-Type: text/html; charset=UTF-8
既知の未解決問題
パワーオフや再起動ができません.
reboot
は [ xxxx.xxxxxx] reboot: Restarting system
で止まるし,
shutdown -h now
は最後にカーネルパニックになります.
halt
ならカーネルパニックは起きませんが,結局 Ctrl+c
なりで終了させる必要があります.
オフ時はいいとしても,再起動が出来ないのが少し不便ですね...改善方法は現時点では不明です.
余談
デスクトップ環境
今回はliteを用いましたが,起動時のオプションに -device usb-mouse
を追加してポインタデバイスを接続することで,デスクトップ環境も使えるようです.(未検証)
ネットワークのブリッジ接続
今回はホストにNATさせていますが, tap0
を任意のネットワークアダプターとブリッジ接続し,適切にIPアドレス等を設定すればホストと同じサブネットに接続できます.(未検証)
QEMU on Linux
今回はWindowsにインストールしたQEMUで起動していますが,QEMUが動けば何でも良いので,もちろんLinux上のQEMUでも同様のことが出来ます.
たとえば,WSL2にQEMUをインストールして,raspiosを起動できます.
Ubuntu /mnt/j/qemu-raspi-buster % /opt/qemu/qemu-5.1.0/bin/qemu-system-aarch64 -M raspi3 -append "console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait" -dtb ./bcm2710-rpi-3-b-plus.dtb -drive file=./vdisk.qcow2,format=qcow2,if=sd -m 1G -smp 4 -serial stdio -kernel ./kernel8.img -display none
ネットワーク周りは環境に合わせて変更する必要があります.
QEMUのウィンドウ
起動時のオプションに -display none
を追加すれば,ウィンドウが出てこなくなります.
参考サイト
- Windows で Raspbian システムを起動(QEMU, qemu-rpi-kernel を使用)
- dhruvvyas90/qemu-rpi-kernel: Qemu kernel for emulating Rpi on QEMU
- QEMU System Emulation User’s Guide — QEMU 5.0.92 (v5.1.0-rc2) documentation
- QEMUのRaspberry Pi 3モデルでUSBホストエミュレーション – Qiita
- guestfish (libguestfs-tools)を使う – Qiita
- オープンギャラリー:QEMUブリッジネットワーク接続環境(QEMU on Windows編)
- Windows版QEMUにTAP-driverをインストールしてみた。 – Qiita
- 仮想MacアドレスのベンダーID – うまいぼうぶろぐ
- NAT ネットワークのセットアップ | Microsoft Docs
- Linuxでの32bit/64bitの確認方法(CPU、カーネルのBit数) | ぱーくん plus idea