Debian11 で Libvirt(KVM)
環境について
Debian11の環境で、Libvirt を通じて、KVM の操作をしてみます。
インストール
関連するパッケージをインストールします。
(NAT を使わない場合、dnsmasq は不要かもしれません。)
# apt install --no-install-recommends libvirt-clients libvirt-daemon-system virtinst dnsmasq
確認
バージョンを確認します。
# virsh version
Compiled against library: libvirt 7.0.0
Using library: libvirt 7.0.0
Using API: QEMU 7.0.0
Running hypervisor: QEMU 5.2.0
デフォルトの接続先を確認します。
下記の時は、以後 --connect qemu:///system
オプションを明示的に指定する必要はありません。
# virsh uri
qemu:///system
ストレージプール
ストレージプールを確認します。
初期状態ではストレージプールはありません。
# virsh pool-list
Name State Autostart
---------------------------
Debian で Libvirt を利用する場合、 /var/lib/libvirt/images
ディレクトリが自動で作成されるので、
こちらをデフォルトのストレージプールとして設定してみます。
ストレージプールを作成後、利用するためには、スタートさせる必要があります。
# virsh pool-define-as default dir --target /var/lib/libvirt/images/
Pool default defined
# virsh pool-start default
Pool default started
# virsh pool-list
Name State Autostart
-------------------------------
default active no
次回、自動でスタートさせるためには、自動スタートの設定が必要です。
# virsh pool-autostart default
Pool default marked as autostarted
# virsh pool-list
Name State Autostart
-------------------------------
default active yes
xml の内容を確認します。
# virsh pool-dumpxml default
<pool type='dir'>
<name>default</name>
<uuid>9d4a9d2c-ed01-425c-9b8b-ec1c6b744a6b</uuid>
<capacity unit='bytes'>15791431680</capacity>
<allocation unit='bytes'>4877070336</allocation>
<available unit='bytes'>10914361344</available>
<source>
</source>
<target>
<path>/var/lib/libvirt/images</path>
<permissions>
<mode>0711</mode>
<owner>0</owner>
<group>0</group>
</permissions>
</target>
</pool>
仮想ネットワークの管理
仮想ネットワークを確認します。
初期状態では default がありますが、起動していません。
# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------
default inactive no yes
# virsh net-dumpxml default
<network>
<name>default</name>
<uuid>b00d5f3b-e209-4ff3-aaeb-08a9f6314255</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:c6:88:fe'/>
<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>
Open vSwitch の仮想ブリッジ ovsbr0
を使用するために以下の内容の xml を作成します。
<network>
<name>ovs</name>
<forward mode='bridge'/>
<bridge name='ovsbr0'/>
<virtualport type='openvswitch'/>
<portgroup name='untag' default='yes'/>
<portgroup name='vlan10'>
<vlan>
<tag id='10'/>
</vlan>
</portgroup>
</network>
作成した xml を利用して、仮想ネットワークを定義します。
# virsh net-define ovs.xml
Network ovs defined from ovs.xml
# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------
default inactive no yes
ovs inactive no yes
# virsh net-dumpxml ovs
<network>
<name>ovs</name>
<uuid>95a00202-557e-4780-82e8-3f489ddd1da4</uuid>
<forward mode='bridge'/>
<bridge name='ovsbr0'/>
<virtualport type='openvswitch'/>
<portgroup name='untag' default='yes'>
</portgroup>
<portgroup name='vlan10'>
<vlan>
<tag id='10'/>
</vlan>
</portgroup>
</network>
作成した仮想ネットワークを利用するためには、起動する必要があります。
# virsh net-start ovs
Network ovs started
# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------
default inactive no yes
ovs active no yes
次回以降、自動で起動させるためには、自動起動設定をします。
# virsh net-autostart ovs
Network ovs marked as autostarted
# virsh net-list --all
Name State Autostart Persistent
----------------------------------------------
default inactive no yes
ovs active yes yes
仮想マシンの起動
インストールメディアを用意します。
# mkdir /var/lib/libvirt/images/isos
# ln -s /home/user/Rocky-9.1-x86_64-minimal.iso /var/lib/libvirt/images/isos/Rocky-9.1-x86_64-minimal.iso
# ls -lR /var/lib/libvirt/images
/var/lib/libvirt/images:
total 4
drwxr-xr-x 2 root root 4096 Feb 13 18:29 isos
/var/lib/libvirt/images/isos:
total 0
lrwxrwxrwx 1 root root 39 Feb 13 18:29 Rocky-9.1-x86_64-minimal.iso -> /home/user/Rocky-9.1-x86_64-minimal.iso
およそ以下のようなコマンドで、仮想マシンのインストールを開始します。
# virt-install --virt-type kvm --name rockylinux --cdrom Rocky-9.1-x86_64-minimal.iso --os-variant rhel9.0 --disk size=10 --network network=ovs --memory 1024 --graphics vnc,listen=0.0.0.0,port=5900
WARNING Requested memory 1024 MiB is less than the recommended 1536 MiB for OS rhel9.0
WARNING Unable to connect to graphical console: virt-viewer not installed. Please install the 'virt-viewer' package.
WARNING No console to launch for the guest, defaulting to --wait -1
Starting install...
Allocating 'rockylinux.qcow2' | 10 GB 00:00:01
Domain is still running. Installation may be in progress.
Waiting for the installation to complete.
仮想マシンを起動すると、tap デバイスが作成されて、仮想ブリッジに割り当てられています。
# ovs-vsctl show
537967ba-2d48-46f4-9ab8-bb3116153289
Bridge ovsbr0
Port ens4
Interface ens4
Port ovsbr0
Interface ovsbr0
type: internal
Port vnet0
Interface vnet0
ovs_version: "2.15.0"
# ip link show vnet0
10: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master ovs-system state UNKNOWN mode DEFAULT group default qlen 1000
link/ether fe:54:00:80:60:76 brd ff:ff:ff:ff:ff:ff
ストレージプール default のボリュームを確認します。
# virsh vol-list default
Name Path
--------------------------------------------------------------
isos /var/lib/libvirt/images/isos
rockylinux.qcow2 /var/lib/libvirt/images/rockylinux.qcow2
virt-install 実行時に作成されたボリューム rockylinux.qcow2 を確認します。
# virsh vol-info /var/lib/libvirt/images/rockylinux.qcow2
Name: rockylinux.qcow2
Type: file
Capacity: 10.00 GiB
Allocation: 1.34 GiB
# virsh vol-dumpxml /var/lib/libvirt/images/rockylinux.qcow2
<volume type='file'>
<name>rockylinux.qcow2</name>
<key>/var/lib/libvirt/images/rockylinux.qcow2</key>
<source>
</source>
<capacity unit='bytes'>10737418240</capacity>
<allocation unit='bytes'>1440272384</allocation>
<physical unit='bytes'>10739318784</physical>
<target>
<path>/var/lib/libvirt/images/rockylinux.qcow2</path>
<format type='qcow2'/>
<permissions>
<mode>0600</mode>
<owner>64055</owner>
<group>64055</group>
</permissions>
<timestamps>
<atime>1676364544.476000000</atime>
<mtime>1676364327.712000000</mtime>
<ctime>1676364327.712000000</ctime>
<btime>0</btime>
</timestamps>
<compat>1.1</compat>
<features>
<lazy_refcounts/>
</features>
</target>
</volume>
ボリュームの作成
default
ストレージプールに qcow2 フォーマットの、容量10GBのボリュームを作成します。
# virsh vol-create-as default rockylinux_vdb.qcow2 10GB --format qcow2 --allocation 0
Vol rockylinux_vdb.qcow2 created
# virsh vol-list default
Name Path
----------------------------------------------------------------------
isos /var/lib/libvirt/images/isos
rockylinux.qcow2 /var/lib/libvirt/images/rockylinux.qcow2
rockylinux_vdb.qcow2 /var/lib/libvirt/images/rockylinux_vdb.qcow2
# virsh vol-info /var/lib/libvirt/images/rockylinux_vdb.qcow2
Name: rockylinux_vdb.qcow2
Type: file
Capacity: 9.31 GiB
Allocation: 196.00 KiB
# virsh vol-dumpxml /var/lib/libvirt/images/rockylinux_vdb.qcow2
<volume type='file'>
<name>rockylinux_vdb.qcow2</name>
<key>/var/lib/libvirt/images/rockylinux_vdb.qcow2</key>
<source>
</source>
<capacity unit='bytes'>10000000000</capacity>
<allocation unit='bytes'>0</allocation>
<physical unit='bytes'>10000000000</physical>
<target>
<path>/var/lib/libvirt/images/rockylinux_vdb.qcow2</path>
<format type='raw'/>
<permissions>
<mode>0600</mode>
<owner>0</owner>
<group>0</group>
</permissions>
<timestamps>
<atime>1676364968.448000000</atime>
<mtime>1676364968.432000000</mtime>
<ctime>1676364968.432000000</ctime>
<btime>0</btime>
</timestamps>
</target>
</volume>
アタッチ
作成したボリュームを仮想マシンにアタッチします。
アタッチ前後の状態を比較するために、いったん現状の状態の xml を取得します。
# virsh dumpxml rockylinux > before.xml
ボリュームを仮想マシンにアタッチします。
# virsh attach-disk rockylinux /var/lib/libvirt/images/rockylinux_vdb.qcow2 vdb --subdriver qcow2
Disk attached successfully
# virsh dumpxml rockylinux | diff -u - before.xml
--- - 2023-02-14 04:09:52.813796808 -0500
+++ before.xml 2023-02-14 04:04:11.268000000 -0500
@@ -67,14 +67,6 @@
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</disk>
- <disk type='file' device='disk'>
- <driver name='qemu' type='qcow2'/>
- <source file='/var/lib/libvirt/images/rockylinux_vdb.qcow2' index='4'/>
- <backingStore/>
- <target dev='vdb' bus='virtio'/>
- <alias name='virtio-disk1'/>
- <address type='pci' domain='0x0000' bus='0x07' slot='0x00' function='0x0'/>
- </disk>
<disk type='file' device='cdrom'>
<driver name='qemu'/>
<target dev='sda' bus='sata'/>
アタッチしたとき、仮想マシンのシスログには下記のようなメッセージが出力されます。
[23234.383960] pcieport 0000:00:02.6: pciehp: Slot(0-6): Attention button pressed
[23234.390474] pcieport 0000:00:02.6: pciehp: Slot(0-6) Powering on due to button press
[23234.397926] pcieport 0000:00:02.6: pciehp: Slot(0-6): Card present
[23234.398460] pcieport 0000:00:02.6: pciehp: Slot(0-6): Link Up
[23234.624674] pci 0000:07:00.0: [1af4:1042] type 00 class 0x010000
[23234.633946] pci 0000:07:00.0: reg 0x14: [mem 0x00000000-0x00000fff]
[23234.635238] pci 0000:07:00.0: reg 0x20: [mem 0x00000000-0x00003fff 64bit pref]
[23234.645689] pci 0000:07:00.0: BAR 4: assigned [mem 0xfc000000-0xfc003fff 64bit pref]
[23234.646621] pci 0000:07:00.0: BAR 1: assigned [mem 0xfdc00000-0xfdc00fff]
[23234.647211] pcieport 0000:00:02.6: PCI bridge to [bus 07]
[23234.647816] pcieport 0000:00:02.6: bridge window [io 0x7000-0x7fff]
[23234.658811] pcieport 0000:00:02.6: bridge window [mem 0xfdc00000-0xfddfffff]
[23234.660599] pcieport 0000:00:02.6: bridge window [mem 0xfc000000-0xfc1fffff 64bit pref]
[23234.663712] virtio-pci 0000:07:00.0: enabling device (0000 -> 0002)
[23234.689168] virtio_blk virtio5: [vdb] 19531250 512-byte logical blocks (10.0 GB/9.31 GiB)
アタッチしたボリュームの利用
仮想マシン側では、vdb として認識されています。
通常のLinuxでの操作と同じように、パーティション作成、ファイルシステム作成、マウントして利用します。
# ls -l /dev/vd*
brw-rw----. 1 root disk 252, 0 Feb 13 21:42 /dev/vda
brw-rw----. 1 root disk 252, 1 Feb 13 21:42 /dev/vda1
brw-rw----. 1 root disk 252, 2 Feb 13 21:42 /dev/vda2
brw-rw----. 1 root disk 252, 16 Feb 14 04:08 /dev/vdb
# parted /dev/vdb print
Error: /dev/vdb: unrecognised disk label
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 10.0GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:
# parted /dev/vdb mklabel msdos
Information: You may need to update /etc/fstab.
# parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 10.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
# parted /dev/vdb mkpart primary 0% 100%
Information: You may need to update /etc/fstab.
# parted /dev/vdb print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 10.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 9999MB 9998MB primary
# mkfs -t ext4 /dev/vdb1
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 2440960 4k blocks and 610800 inodes
Filesystem UUID: 942322b6-ca7d-4e8a-abe4-ebbbeca69cec
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
# mount /dev/vdb1 /mnt
# df /mnt
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vdb1 9508032 24 9003432 1% /mnt
デタッチ
アタッチしたボリュームを仮想マシンから取り外す際は、まず最初に仮想マシン側でアンマウントします。
# umount /mnt
アンマウントしたら取り外します。
# virsh detach-disk rockylinux vdb --print-xml
<disk type="file" device="disk">
<driver name="qemu" type="qcow2"/>
<source file="/var/lib/libvirt/images/rockylinux_vdb.qcow2" index="4"/>
<target dev="vdb" bus="virtio"/>
<alias name="virtio-disk1"/>
<address type="pci" domain="0x0000" bus="0x07" slot="0x00" function="0x0"/>
</disk>
# virsh detach-disk rockylinux vdb
Disk detached successfully
仮想マシンのシスログには下記のようなメッセージが出力されます。
[23863.541774] pcieport 0000:00:02.6: pciehp: Slot(0-6): Attention button pressed
[23863.542365] pcieport 0000:00:02.6: pciehp: Slot(0-6): Powering off due to button press
ボリュームの削除
不要なボリュームは下記で削除ができます。
# virsh vol-delete /var/lib/libvirt/images/rockylinux_vdb.qcow2
Vol /var/lib/libvirt/images/rockylinux_vdb.qcow2 deleted
# virsh vol-list default
Name Path
--------------------------------------------------------------
isos /var/lib/libvirt/images/isos
rockylinux.qcow2 /var/lib/libvirt/images/rockylinux.qcow2
Discussion