[記事化済み] Raspberry Pi OS の KVM を利用する
Raspberry Pi OS の KVM で Debian12 を動かす
動作環境: Raspberry Pi 4B 8GB
Raspberry Pi OS Lite 64bit (Debian version: 10 (buster))
libvirt の利用は想定しない。
関連パッケージをインストール
関連パッケージのインストール
$ sudo apt install --no-install-recommends qemu-system-arm ipxe-qemu qemu-efi-aarch64 qemu-utils bridge-utils
VNCビューアが必要
仮想ブリッジ br0 の作成
eth0 とブリッジした br0 に tap デバイスを接続して、外部から仮想マシンへの接続を可能とする。
/etc/network/interface に下記を追記
auto br0
iface br0 inet manual
bridge_ports eth0
/etc/dhcpcd.conf に下記を追記
denyinterfaces eth0
interface br0
static ip_address=192.168.xx.xx/24
static routers=192.168.xx.xx
static domain_name_servers=192.168.xx.xx
OSを再起動して設定を反映する。
CD イメージをダウンロード
https://www.debian.org/CD/ より、arm64 ネットインストール版CDイメージをダウンロードする。
curl 等で http でダウンロードしてもよし。aria2c 等で bittorrent でダウンロードしてもよし。
インストールイメージからカーネル等をコピーする
iso イメージをマウントする。
$ sudo mount debian-12.0.0-arm64-netinst.iso /media/iso
コピーすべきカーネルと初期化RAMディスクのありかを確認する。
$ cat /media/iso/boot/grub/grub.cfg
適当に名前をつけてコピーする
$ cp -pi /media/iso/install.a64/vmlinuz vmlinuz.debian12-installer
$ cp -pi /media/iso/install.a64/initrd.gz initrd.debian12-installer
$ sudo umount /media/iso
インストール実行
仮想ディスクを作成
$ qemu-img create -f qcow2 debian-11.6.0-arm64-netinst.qcow2.base 16G
インストーラを機動
$ sudo qemu-system-aarch64 \
-machine virt \
-cpu host \
-m 1024 \
-enable-kvm \
-kernel vmlinuz.debian12-installer \
-initrd initrd.debian12-installer \
-drive file=debian-12.0.0-arm64-netinst.qcow2.base \
-cdrom debian-12.0.0-arm64-netinst.iso \
-net nic,macaddr=52:54:00:12:34:11 -net tap,ifname=tap1 -vnc 0.0.0.0:1
VNCビューアを実行して KVMホストの 5901ポートに接続する
QEMUコンソールが開いたら、Ctrl
+ Alt
+ 2
で画面をシリアルコンソールへ切り替える。
インストールは通常の手順で実行する。
インストール終了したら下記で仮想マシンを終了する。
- QEMUを実行したコマンドプロンプトに戻って、
Ctrl
+c
で終了する。 - または、
Ctr
l +Alt
+1
で QEMUターミナルに戻り、q
で終了する。
仮想ディスクからカーネル等をコピーする。
仮想ディスクをマウント
$ lsmod | grep nbd
$ sudo modprobe nbd
$ sudo qemu-nbd -c /dev/nbd0 debian-12.0.0-arm64-netinst.qcow2.base
$ sudo kpartx -av /dev/nbd0
$ sudo mount /dev/mapper/nbd0p1 /media/tmp
カーネルと初期化RAMディスクをコピー
$ cp -pi /media/tmp/vmlinuz vmlinuz.debian12
$ cp -pi /media/tmp/initrd.img initrd.debian12
アンマウント
$ sudo umount /media/tmp
$ sudo kpartx -dv /dev/nbd0
$ sudo qemu-nbd -d /dev/nbd0
$ sudo rmmod nbd
オーバーレイストレージイメージ作成
インストール完了直後のイメージをバッキングファイルとして、オーバーレイストレージイメージ作成する。
(こうすることで、いつでもインストール直後のまっさらな状態に戻すことができる)
$ qemu-img create -f qcow2 -b debian-12.0.0-arm64-netinst.qcow2.base -F qcow2 debian-12.0.0-arm64-netinst.qcow2 16G
仮想マシン起動
コピーしたカーネル、初期化RAMディスクで仮想マシンを起動する。
$ sudo qemu-system-aarch64 \
-machine virt \
-cpu host \
-m 1024 \
-enable-kvm \
-kernel vmlinuz.debian12 \
-initrd initrd.debian12 \
-append root=/dev/vda2 \
-drive file=debian-12.0.0-arm64-netinst.qcow2 \
-net nic,macaddr=52:54:00:12:34:11 -net tap,ifname=tap1 \
-vnc 0.0.0.0:1 \
-daemonize
VNCビューアを実行して KVMホストの 5901ポートに接続する
QEMUコンソールが開いたら、Ctrl
+ Alt
+ 2
で画面をシリアルコンソールへ切り替える。
$ ip a
ipアドレスが付与されていることを確認する。
$ su -
$ apt install --no-install-recommends openssh-server
他のホストからssh 接続をテストする。
接続できたら、VNCビューアは閉じてよい。
Raspberry Pi OS の KVM で Rocky Linux 9 を動かす
CD イメージをダウンロード
https://rockylinux.org/ja/download より、aarch64 の Minimal のイメージをダウンロードする
$ curl https://download.rockylinux.org/pub/rocky/9/isos/aarch64/Rocky-9.2-aarch64-minimal.iso -o Rocky-9.2-aarch64-minimal.iso
インストールイメージからカーネル等をコピーする
iso イメージをマウントする。
$ sudo mount Rocky-9.2-aarch64-minimal.iso /media/iso
コピーすべきカーネルと初期化RAMディスクのありかを確認する。
$ cat /media/iso/EFI/BOOT/grub.cfg
適当に名前をつけてコピーする
$ cp -pi /media/iso/images/pxeboot/vmlinuz vmlinuz.rocky-installer
$ cp -pi /media/iso/images/pxeboot/initrd.img initrd.rocky-installer
$ sudo umount /media/iso
インストール実行
仮想ディスクを作成
$ qemu-img create -f qcow2 Rocky-9.2-aarch64-minimal.qcow2.base 16G
インストーラを起動
$ qemu-system-aarch64 \
-machine virt \
-cpu host \
-m 1024 \
-enable-kvm \
-kernel vmlinuz.rocky-installer \
-initrd initrd.rocky-installer \
-append "inst.stage2=hd:LABEL=Rocky-9-2-aarch64-dvd ro" \
-drive file=Rocky-9.2-aarch64-minimal.qcow2.base \
-cdrom Rocky-9.2-aarch64-minimal.iso \
-net nic,macaddr=52:54:00:12:34:11 -net tap,ifname=tap1 -vnc 0.0.0.0:1 \
-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd --vga std
VNCビューアを実行して KVMホストの 5901ポートに接続する
QEMUコンソールが開いたら、Ctrl
+ Alt
+ 2
で画面をシリアルコンソールへ切り替える。
Xが起動しないメッセージが表示されるので、グラフィカルインストールのため、1 Start VNC を選択。VNC パスワードを指定する。
表示されたアドレスに VNC 接続すると、通常のインストーラの画面が表示される。
インストールは通常の手順で実行する。(LVMは使わない。KVMホストで対応しているファイルシステムを指定する)
インストール終了したら下記で仮想マシンを終了する。
- QEMUを実行したコマンドプロンプトに戻って、
Ctrl
+c
で終了する。 - または、
Ctrl
+Alt
+1
で QEMUターミナルに戻り、q
で終了する。
仮想ディスクからカーネル等をコピーする。
仮想ディスクをマウント
$ lsmod | grep nbd
$ sudo modprobe nbd
$ sudo qemu-nbd -c /dev/nbd0 Rocky-9.2-aarch64-minimal.base
$ sudo kpartx -av /dev/nbd0
$ sudo mount /dev/mapper/nbd0p2 /media/tmp
カーネルと初期化RAMディスクをコピー
$ cp -pi /media/tmp/boot/vmlinuz-5.14.0-284.11.1.el9_2.aarch64 vmlinuz.rocky9
$ sudo cp -pi /media/tmp/boot/initramfs-5.14.0-284.11.1.el9_2.aarch64.img initramfs.rocky9
アンマウント
$ sudo umount /media/tmp
$ sudo kpartx -dv /dev/nbd0
$ sudo qemu-nbd -d /dev/nbd0
$ sudo rmmod nbd
オーバーレイストレージイメージ作成
インストール完了直後のイメージをバッキングファイルとして、オーバーレイストレージイメージ作成する。
$ qemu-img create -f qcow2 -b Rocky-9.2-aarch64-minimal.qcow2.base -F qcow2 Rocky-9.2-aarch64-minimal.qcow2 16G
仮想マシン起動
コピーしたカーネル、初期化RAMディスクで仮想マシンを起動する。
$ qemu-system-aarch64 \
-machine virt \
-cpu host \
-m 1024 \
-enable-kvm \
-kernel vmlinuz.rocky9 \
-initrd initramfs.rocky9 \
-append "root=/dev/vda2" \
-drive file=Rocky-9.2-aarch64-minimal.qcow2 \
-net nic,macaddr=52:54:00:12:34:11 -net tap,ifname=tap1 \
-vnc 0.0.0.0:1 -daemonize
VNCビューアを実行して KVMホストの 5901ポートに接続する
QEMUコンソールが開いたら、Ctrl
+ Alt
+ 2
で画面をシリアルコンソールへ切り替える。
$ ip a
ipアドレスが付与されていることを確認する。
他のホストからssh 接続をテストする。
接続できたら、VNCビューアは閉じてよい。
[備考] LVMを利用した場合
カーネルのコピーがいろいろ面倒くさいので、いったんインストーラのカーネルで起動
$ qemu-system-aarch64 \
-machine virt \
-cpu host \
-m 1024 \
-enable-kvm \
-kernel vmlinuz.rocky-installer \
-initrd initrd.rocky-installer \
-append "root=/dev/mapper/rl-root ro rd.lvm.lv=rl/root rd.lvm.lv=rl/swap" \
-drive file=Rocky-9.2-aarch64-minimal.qcow2 \
-net nic,macaddr=52:54:00:12:34:11 -net tap,ifname=tap1 \
-vnc 0.0.0.0:1 -daemonize
カーネルをコピーする。
$ cp -pi /boot/vmlinuz-5.14.0-284.11.1.el9_2.aarch64 /tmp
$ cp -pi /boot/initramfs-5.14.0-284.11.1.el9_2.aarch64.img /tmp/
コピーしたカーネルで起動する。
$ qemu-system-aarch64 \
-machine virt \
-cpu host \
-m 1024 \
-enable-kvm \
-kernel vmlinuz.rocky9 \
-initrd initramfs.rocky9 \
-append "root=/dev/mapper/rl-root ro rd.lvm.lv=rl/root rd.lvm.lv=rl/swap" \
-drive file=Rocky-9.2-aarch64-minimal.qcow2 \
-net nic,macaddr=52:54:00:12:34:11 -net tap,ifname=tap1 \
-vnc 0.0.0.0:1 -daemonize
[トライ中] Raspberry Pi OS の KVM で Raspberry Pi OS を動かす
参考
環境
$ qemu-system-aarch64 -version
QEMU emulator version 3.1.0 (Debian 1:3.1+dfsg-8+deb10u7)
Copyright (c) 2003-2018 Fabrice Bellard and the QEMU Project developers
$ qemu-system-aarch64 -machine help | grep raspi
raspi2 Raspberry Pi 2
raspi3 Raspberry Pi 3
資材の取り出し
$ sudo kpartx -av ../iso/2023-05-03-raspios-bullseye-arm64-lite.img
add map loop0p1 (254:0): 0 524288 linear 7:0 8192
add map loop0p2 (254:1): 0 3571712 linear 7:0 532480
$ sudo mount /dev/mapper/loop0p1 /media/tmp
$ cp /media/tmp/kernel8.img .
$ cp /media/tmp/bcm2710-rpi-3-b.dtb .
$ sudo umount /media/tmp
$ sudo kpartx -dv ../iso/2023-05-03-raspios-bullseye-arm64-lite.img
del devmap : loop0p2
del devmap : loop0p1
loop deleted : /dev/loop0
イメージフォーマットの変更
$ qemu-img info ../iso/2023-05-03-raspios-bullseye-arm64-lite.img
image: ../iso/2023-05-03-raspios-bullseye-arm64-lite.img
file format: raw
virtual size: 2.0G (2101346304 bytes)
disk size: 1.3G
$ qemu-img convert -f raw -O qcow2 ../iso/2023-05-03-raspios-bullseye-arm64-lite.img 2023-05-03-raspios-bullseye-arm64-lite.qcow2
$ ls -ls ../iso/2023-05-03-raspios-bullseye-arm64-lite.img 2023-05-03-raspios-bullseye-arm64-lite.qcow2
1329416 -rw-r--r-- 1 pi pi 1361379328 Dec 3 05:12 2023-05-03-raspios-bullseye-arm64-lite.qcow2
1316172 -rw-r--r-- 1 pi pi 2101346304 Dec 3 05:03 ../iso/2023-05-03-raspios-bullseye-arm64-lite.img
$ qemu-img resize 2023-05-03-raspios-bullseye-arm64-lite.qcow2 16G
Image resized.
$ qemu-img info 2023-05-03-raspios-bullseye-arm64-lite.qcow2
image: 2023-05-03-raspios-bullseye-arm64-lite.qcow2
file format: qcow2
virtual size: 16G (17179869184 bytes)
disk size: 1.3G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false
ここまで。
以下みたいなコマンドで起動するらしいのだが、失敗している。そのうち調査する。
qemu-system-aarch64 \
-m 1024 \
-M raspi3 \
-kernel kernel8.img \
-dtb bcm2710-rpi-3-b.dtb \
-drive format=qcow2,file=2023-05-03-raspios-bullseye-arm64-lite.qcow2 \
-append "console=ttyAMA0 root=/dev/mmcblk0p2 rw rootwait rootfstype=ext4 dwc_otg.fiq_fsm_enable=0 bcm2708_fb.fbwidth=1280 bcm2708_fb.fbheight=720" \
-device usb-net,netdev=net0,mac=52:54:00:12:34:11 -netdev tap,id=net0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown,ifname=tap1 \
-vnc 0.0.0.0:1 -daemonize
Raspberry Pi OS の KVM で FreeBSD を動かす
CD イメージをダウンロード
https://www.freebsd.org/where/ より aarch64 の Boot Only の iso イメージをダウンロードする
$ curl https://download.freebsd.org/releases/arm64/aarch64/ISO-IMAGES/14.1/FreeBSD-14.1-RELEASE-arm64-aarch64-bootonly.iso -o FreeBSD-14.1-RELEASE-arm64-aarch64-bootonly.iso
インストール実行
仮想ディスクを作成
$ qemu-img create -f qcow2 FreeBSD-14.1-RELEASE-arm64-aarch64-bootonly.qcow2.base 16G
インストーラを起動して、コマンドラインコンソールでインストールを実行する。
$ sudo qemu-system-aarch64 -machine virt -cpu host -enable-kvm -nographic \
-drive file=FreeBSD-14.1-RELEASE-arm64-aarch64-bootonly.iso,media=cdrom -boot c \
-device virtio-blk,drive=sda -drive id=sda,if=none,format=qcow2,file=FreeBSD-14.1-RELEASE-arm64-aarch64-bootonly.qcow2.base \
-device virtio-net,netdev=net0,mac=52:54:00:12:34:12 -netdev tap,id=net0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown,ifname=tap2 \
-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd \
-vnc 0.0.0.0:2 -m 2048
インストールができたら shutdown -p now で停止する。
オーバーレイストレージイメージ作成する。
$ qemu-img create -f qcow2 -b FreeBSD-14.1-RELEASE-arm64-aarch64-bootonly.qcow2.base -F qcow2 FreeBSD-14.1-RELEASE-arm64-aarch64-bootonly.qcow2 16G
仮想マシン起動
作成したオーバーレイストレージイメージで仮想マシンを起動する。
$ sudo qemu-system-aarch64 -machine virt -cpu host -enable-kvm -daemonize \
-device virtio-blk,drive=sda -drive id=sda,if=none,format=qcow2,file=FreeBSD-14.1-RELEASE-arm64-aarch64-bootonly.qcow2 \
-device virtio-net,netdev=net0,mac=52:54:00:12:34:12 -netdev tap,id=net0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown,ifname=tap2 \
-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd \
-vnc 0.0.0.0:2 -m 2048
[別解] 公式のQCOWイメージを利用する
https://www.freebsd.org/where/ より aarch64 の Boot Only の qcow2 イメージをダウンロードする
$ curl -s https://download.freebsd.org/releases/VM-IMAGES/14.1-RELEASE/aarch64/Latest/FreeBSD-14.1-RELEASE-arm64-aarch64.qcow2.xz -o FreeBSD-14.1-RELEASE-arm64-aarch64.qcow2.xz
ダウンロードしたファイルを展開
$ xz -dc FreeBSD-14.1-RELEASE-arm64-aarch64.qcow2.xz > FreeBSD-14.1-RELEASE-arm64-aarch64.qcow2
$ qemu-img info FreeBSD-14.1-RELEASE-arm64-aarch64.qcow2
image: FreeBSD-14.1-RELEASE-arm64-aarch64.qcow2
file format: qcow2
virtual size: 6.03 GiB (6476595200 bytes)
disk size: 3.26 GiB
cluster_size: 65536
Format specific information:
compat: 0.10
compression type: zlib
refcount bits: 16
展開したファイルで起動する
$ sudo qemu-system-aarch64 -machine virt -cpu host -enable-kvm -daemonize \
-device virtio-blk,drive=sda -drive id=sda,if=none,format=qcow2,file=FreeBSD-14.1-RELEASE-arm64-aarch64.qcow2 \
-device virtio-net,netdev=net0,mac=52:54:00:12:34:12 -netdev tap,id=net0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown,ifname=tap2 \
-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd \
-vnc 0.0.0.0:2 -m 2048
パスワード無しで root ユーザでログインできる。