🧛
Raspberry Pi OS で libvirt(KVM)
環境
https://zenn.dev/mnod/articles/55c1f3b953d2ef の環境で、Libvirt を通じて、KVM の操作をしてみます。
インストール
追加で必要なパッケージをインストールします。
$ sudo apt install --no-install-recommends libvirt0 libvirt-daemon-system libvirt-clients virtinst
利用する環境のバージョン
$ virsh version
Compiled against library: libvirt 9.0.0
Using library: libvirt 9.0.0
Using API: QEMU 9.0.0
Running hypervisor: QEMU 7.2.13
$ sudo virsh uri
qemu:///system
ストレージプール
初期状態では存在しないので作成する。
$ sudo virsh pool-list --all
Name State Autostart
---------------------------
$ sudo mkdir -p /media/work/libvirt/images
$ sudo virsh pool-define-as default dir --target /media/work/libvirt/images
Pool default defined
$ sudo virsh pool-list --all
Name State Autostart
---------------------------------
default inactive no
自動スタートの設定
$ sudo virsh pool-autostart default
Pool default marked as autostarted
$ sudo virsh pool-list --all
Name State Autostart
-------------------------------
default active yes
xmlの内容を確認
$ sudo virsh pool-dumpxml default
<pool type='dir'>
<name>default</name>
<uuid>540bfe27-9560-49cb-ba56-d65112a80937</uuid>
<capacity unit='bytes'>78176350208</capacity>
<allocation unit='bytes'>3104030720</allocation>
<available unit='bytes'>75072319488</available>
<source>
</source>
<target>
<path>/media/work/libvirt/images</path>
<permissions>
<mode>0755</mode>
<owner>0</owner>
<group>0</group>
</permissions>
</target>
</pool>
仮想ネットワークの管理
初期状態で default が存在する
$ sudo virsh net-list --all
Name State Autostart Persistent
----------------------------------------------
default inactive no yes
$ sudo virsh net-dumpxml default
<network>
<name>default</name>
<uuid>762f2838-3f25-4ffc-8086-67031fb37a42</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:6a:3c:7d'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
仮想ブリッジ br0 を利用したブリッジ接続をおこなうため、以下のファイルを作成
host-bridge.xml
<network>
<name>host-bridge</name>
<forward mode="bridge"/>
<bridge name="br0"/>
</network>
作成したファイルを利用して仮想ネットワークを定義。起動と自動起動設定を行う。
$ sudo virsh net-define host-bridge.xml
Network host-bridge defined from host-bridge.xml
$ sudo virsh net-start host-bridge
Network host-bridge started
$ sudo virsh net-autostart host-bridge
Network host-bridge marked as autostarted
$ sudo virsh net-list --all
Name State Autostart Persistent
--------------------------------------------------
default inactive no yes
host-bridge active yes yes
xml の内容を確認
$ sudo virsh net-dumpxml host-bridge
<network>
<name>host-bridge</name>
<uuid>e71bf706-5c05-45ee-9917-0907d5a2bf5c</uuid>
<forward mode='bridge'/>
<bridge name='br0'/>
</network>
仮想マシンの作成
ここでは例として、Debian12 の仮想マシンを作成します。
インストーラ実行
--boot
オプションで、カーネル、初期化RAMディスク、カーネルオプションを指定する。
(カーネル、初期化RAMディスクは、インストールCDイメージからコピーしたものを利用)
$ sudo virt-install --virt-type kvm \
--features acpi=off \
--connect qemu:///system \
--name debian-12.7.0-arm64 \
--os-variant debian11 \
--memory 1024 \
--cdrom debian-12.7.0-arm64-netinst.iso \
--boot kernel=debian-12.7.0-arm64-netinst.vmlinuz,initrd=debian-12.7.0-arm64-netinst.initrd.gz,kernel_args='root=/dev/vda1' \
--disk size=16 \
--network network=host-bridge \
--graphics vnc,listen=0.0.0.0,port=5900
なんやかんややった後のストレージプールを覗いてみる
$ sudo virsh pool-list --all
Name State Autostart
-------------------------------
default active yes
iso active yes
$ sudo virsh vol-list default
Name Path
-----------------------------------------------------------------------------------
debian-12.7.0-arm64.qcow2 /media/work/libvirt/images/debian-12.7.0-arm64.qcow2
$ sudo virsh vol-list iso
Name Path
------------------------------------------------------------------------------------------------
debian-12.7.0-arm64-netinst.initrd.gz /media/work/iso/debian-12.7.0-arm64-netinst.initrd.gz
debian-12.7.0-arm64-netinst.iso /media/work/iso/debian-12.7.0-arm64-netinst.iso
debian-12.7.0-arm64-netinst.vmlinuz /media/work/iso/debian-12.7.0-arm64-netinst.vmlinuz
ボリュームの確認
$ sudo virsh vol-info /media/work/libvirt/images/debian-12.7.0-arm64.qcow2
Name: debian-12.7.0-arm64.qcow2
Type: file
Capacity: 16.00 GiB
Allocation: 2.66 GiB
$ sudo virsh vol-dumpxml /media/work/libvirt/images/debian-12.7.0-arm64.qcow2
<volume type='file'>
<name>debian-12.7.0-arm64.qcow2</name>
<key>/media/work/libvirt/images/debian-12.7.0-arm64.qcow2</key>
<capacity unit='bytes'>17179869184</capacity>
<allocation unit='bytes'>2852315136</allocation>
<physical unit='bytes'>17182752768</physical>
<target>
<path>/media/work/libvirt/images/debian-12.7.0-arm64.qcow2</path>
<format type='qcow2'/>
<permissions>
<mode>0600</mode>
<owner>64055</owner>
<group>64055</group>
</permissions>
<timestamps>
<atime>1730701453.996149827</atime>
<mtime>1730702631.205532093</mtime>
<ctime>1730702631.841526170</ctime>
<btime>0</btime>
</timestamps>
<compat>1.1</compat>
<features>
<lazy_refcounts/>
</features>
</target>
</volume>
--features acpi=off
を指定したので、shutdown が効かない。destroy で強制停止する。
$ sudo virsh list
Id Name State
-------------------------------------
2 debian-12.7.0-arm64 running
$ sudo virsh destroy debian-12.7.0-arm64
Domain 'debian-12.7.0-arm64' destroyed
$ sudo virsh list --all
Id Name State
--------------------------------------
- debian-12.7.0-arm64 shut off
カーネルと初期化RAMディスクをコピー
qcow2イメージからカーネルと初期化RAMディスクをコピーする。
$ ls -l /media/work/libvirt/images/
total 2847196
-rw-r--r-- 1 root root 30520216 Nov 4 15:41 debian-12.7.0-arm64.initrd.img
-rw------- 1 root root 17182752768 Nov 4 16:05 debian-12.7.0-arm64.qcow2
-rw-r--r-- 1 root root 32692160 Oct 1 04:08 debian-12.7.0-arm64.vmlinuz
xml の書き換え
コピーしたカーネル、初期化RAMディスクを利用するようにxmlを書き換え。ついでにcd も外しておく。
$ sudo virsh dumpxml debian-12.7.0-arm64 | tee debian-12.7.0-arm64.xml
$ sudo EDITOR=/usr/bin/vim.tiny virsh edit debian-12.7.0-arm64
Domain 'debian-12.7.0-arm64' XML configuration edited.
$ sudo virsh dumpxml debian-12.7.0-arm64 | diff -u - debian-12.7.0-arm64.xml
--- - 2024-11-04 16:14:48.410993779 +0900
+++ debian-12.7.0-arm64.xml 2024-11-04 16:09:38.518176477 +0900
@@ -11,9 +11,9 @@
<vcpu placement='static'>2</vcpu>
<os>
<type arch='aarch64' machine='virt-7.2'>hvm</type>
- <kernel>/media/work/libvirt/images/debian-12.7.0-arm64.vmlinuz</kernel>
- <initrd>/media/work/libvirt/images/debian-12.7.0-arm64.initrd.img</initrd>
- <cmdline>root=/dev/vda2</cmdline>
+ <kernel>/media/work/iso/debian-12.7.0-arm64-netinst.vmlinuz</kernel>
+ <initrd>/media/work/iso/debian-12.7.0-arm64-netinst.initrd.gz</initrd>
+ <cmdline>root=/dev/vda1</cmdline>
<boot dev='hd'/>
</os>
<features>
@@ -32,6 +32,12 @@
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
</disk>
+ <disk type='file' device='cdrom'>
+ <driver name='qemu' type='raw'/>
+ <target dev='sda' bus='scsi'/>
+ <readonly/>
+ <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+ </disk>
<controller type='usb' index='0' model='qemu-xhci' ports='15'>
<address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
</controller>
仮想マシン起動
$ sudo virsh start debian-12.7.0-arm64
Domain 'debian-12.7.0-arm64' started
$ sudo virsh list --all
Id Name State
-------------------------------------
1 debian-12.7.0-arm64 running
Discussion