Open3

[記事未満] Raspberry Pi OS の KVM を利用する

mnodmnod

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 で終了する。
  • または、Ctrl + 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ビューアは閉じてよい。

mnodmnod

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
mnodmnod

[トライ中] Raspberry Pi OS の KVM で Raspberry Pi OS を動かす

参考
https://hiro20180901.com/2023/04/24/raspberry-pi-os-64-bit-runs-qemu-720-vritual-machine/

環境

$ 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