🎃

Debian11 で KVM

2023/02/18に公開

環境について

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 デバイス割り当て・解除スクリプト

https://ovs-istokes.readthedocs.io/en/latest/howto/kvm.html

仮想マシン起動時の 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
/usr/local/bin/ovs-ifdown.sh
#!/bin/sh

switch='ovsbr0'

ip link set $1 down
ovs-vsctl del-port ${switch} $1
/usr/local/bin/ovs-ifup.sh
#!/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"
#
GitHubで編集を提案

Discussion