Debian11 で KVM
環境について
Debian11の環境で、KVM のインストール、仮想マシンの作成をしてみます。
インストール
APTパッケージでインストールします。
# apt install --no-install-recommends qemu-kvm qemu-utils
仮想マシンの作成
ここでは例として、Rocky Linux 9.1 の仮想マシンを作成します。
仮想マシンの導入には Rocky-9.1-x86_64-minimal.iso を利用します。
仮想ディスク作成
# qemu-img create -f qcow2 Rocky-9.1-x86_64-minimal.qcow2 8G
Formatting 'Rocky-9.1-x86_64-minimal.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=8589934592 lazy_refcounts=off refcount_bits=16
# ls -ls Rocky-9.1-x86_64-minimal.qcow2
196 -rw-r--r-- 1 root root 196736 Feb 13 04:55 Rocky-9.1-x86_64-minimal.qcow2
仮想ブリッジ
通常だとLinux標準ブリッジを利用するところですが、ここでは Open vSwitch を利用します。
作成については https://zenn.dev/mnod/articles/c67fe726fb635b を参照
なお、Rocky-9.1-x86_64-minimal.iso からのインストールでは、ネットワークを利用したダウンロードは発生しません。
# ovs-vsctl show
537967ba-2d48-46f4-9ab8-bb3116153289
Bridge ovsbr0
Port ens4
Interface ens4
Port ovsbr0
Interface ovsbr0
type: internal
ovs_version: "2.15.0"
# ip addr show ovsbr0
5: ovsbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
link/ether 26:bb:9f:9d:ab:44 brd ff:ff:ff:ff:ff:ff
inet 10.2.0.242/24 brd 10.2.0.255 scope global ovsbr0
valid_lft forever preferred_lft forever
inet6 fe80::24bb:9fff:fe9d:ab44/64 scope link
valid_lft forever preferred_lft forever
仮想マシン起動
およそ以下のようなオプションで仮想マシンを起動します。
# kvm -m 1024 -cpu host -vnc :0 -boot order=d \
-device virtio-blk,drive=sda -drive id=sda,if=none,file=Rocky-9.1-x86_64-minimal.qcow2,format=qcow2 \
-device virtio-net,netdev=net0 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
-cdrom Rocky-9.1-x86_64-minimal.iso
コンソール画面を表示するには、vncビューアで 5900 ポートに接続します。
インストーラの画面が表示されるので、通常通りインストールを実施します。
インストール完了後、再起動すると、再度インストールメディアのGRUBメニューが表示されます。
kvm を起動したシェルで ctrl + c
することで、仮想マシンを終了させます。
仮想ブリッジへの tap デバイスの接続
前後しますが、上記コマンドで仮想マシンを起動すると、tap デバイスが作成されます。
script=no
とした場合、仮想ブリッジへの割り当ては手動で実施する必要があります。
# ip link show tap0
6: tap0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master ovs-system state DOWN mode DEFAULT group default qlen 1000
link/ether ca:b3:cb:fb:1d:92 brd ff:ff:ff:ff:ff:ff
# ovs-vsctl show
537967ba-2d48-46f4-9ab8-bb3116153289
Bridge ovsbr0
Port ens4
Interface ens4
Port ovsbr0
Interface ovsbr0
type: internal
ovs_version: "2.15.0"
作成された tap デバイスを仮想ブリッジに割り当てます。
# ovs-vsctl add-port ovsbr0 tap0
# ovs-vsctl show
537967ba-2d48-46f4-9ab8-bb3116153289
Bridge ovsbr0
Port tap0
Interface tap0
Port ens4
Interface ens4
Port ovsbr0
Interface ovsbr0
type: internal
ovs_version: "2.15.0"
tap デバイスをリンクアップさせます。
# ip link set tap0 up
# ip link show tap0
6: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ovs-system state UNKNOWN mode DEFAULT group default qlen 1000
link/ether ca:b3:cb:fb:1d:92 brd ff:ff:ff:ff:ff:ff
tap デバイス割り当て・解除スクリプト
仮想マシン起動時の tap デバイス割り当て、仮想マシン停止時の tap デバイス割り当ての解除をスクリプトにすることができます。
tap デバイス割り当て用と、tap デバイス割り当ての解除のスクリプトを用意します。
ここでは /usr/local/bin で作成していますが、/etc 直下に置くのが一般的なようです。
# ls -l /usr/local/bin/ovs*.sh
-rwxr-xr-x 1 root root 80 Feb 13 15:16 /usr/local/bin/ovs-ifdown.sh
-rwxr-xr-x 1 root root 78 Feb 13 15:16 /usr/local/bin/ovs-ifup.sh
#!/bin/sh
switch='ovsbr0'
ip link set $1 down
ovs-vsctl del-port ${switch} $1
#!/bin/sh
switch='ovsbr0'
ip link set $1 up
ovs-vsctl add-port ${switch} $1
インストール済み仮想マシン起動
--cdrom
オプションを外します。
また、上で作成したスクリプトを、 script
downscript
でそれぞれ指定します。
# kvm -m 1024 -cpu host -vnc :0 \
-device virtio-blk,drive=sda -drive id=sda,if=none,file=Rocky-9.1-x86_64-minimal.qcow2,format=qcow2 \
-device virtio-net,netdev=net0 -netdev tap,id=net0,ifname=tap0,script=/usr/local/bin/ovs-ifup.sh,downscript=/usr/local/bin/ovs-ifdown.sh
仮想マシン起動後に、ホストOS側で確認すると、仮想ブリッジに tap が割り当てられて、リンクがアップしています。
# ovs-vsctl show
537967ba-2d48-46f4-9ab8-bb3116153289
Bridge ovsbr0
Port ens4
Interface ens4
Port ovsbr0
Interface ovsbr0
type: internal
Port tap0
Interface tap0
ovs_version: "2.15.0"
# ip link show tap0
9: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ovs-system state UNKNOWN mode DEFAULT group default qlen 1000
link/ether ca:b3:cb:fb:1d:92 brd ff:ff:ff:ff:ff:ff
仮想マシンをシャットダウン後に確認すると、仮想ブリッジから tap デバイスの割り当てが解除されています。
# ovs-vsctl show
537967ba-2d48-46f4-9ab8-bb3116153289
Bridge ovsbr0
Port ens4
Interface ens4
Port ovsbr0
Interface ovsbr0
type: internal
ovs_version: "2.15.0"
#
Discussion