🏗️

【Ubuntu】KVM+QEMUで仮想サーバーを構築する

2024/03/31に公開

インストール

sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst libosinfo-bin

ブリッジの作成 (netplan)

systemd-networkdを直接設定するよりも、netplanを使ったほうがいいらしい !!

↓ Netplanバージョンはこちらの記事にまとめました

次の 「ブリッジの作成(systemd-networkd)」は無視して進んでください

ブリッジの作成 (systemd-networkd)

ブリッジ接続では、ホストと同じネットワークに接続したのと同じ形になるので外部からの接続ができる

NAT接続では外から内への接続はできないので注意

# systemd-networkdが動いているか確認
# Active: active (running) となっていればよい
sudo systemctl status systemd-networkd

# ホストのネットワークインターフェイスを調べる
ip a

/etc/systemd/network/に設定ファイルを作成する
ファイル名はこの例と同じにする必要はなく、適当でも良い
(設定ファイルは辞書順でソートされるが今回の場合は気にしなくてよい)

/etc/systemd/network/br0.netdev
[NetDev]
Name=br0
Kind=bridge
/etc/systemd/network/br0.network
[Match]
Name=br0

[Network]
# 好きなDNSを設定する(複数可)
DNS=8.8.8.8
DNS=1.1.1.1
# 固定IPアドレスを設定
Adress=192.168.3.110/24
# ip r でデフォルトゲートウェイを調べておく(default via の後ろのアドレス)
Gateway=192.168.3.1

eno1 は自分のホストのネットワークインターフェイス名で置き換える

/etc/systemd/network/eno1.network
[Match]
Name=eno1

[Network]
Bridge=br0

systemd-networkdを再起動
設定が間違っているとsshで操作できなくなるので注意

sudo systemctl restart systemd-networkd

br0が作られているか確認する

ip a

br0inet のところが設定したIPアドレスになっていればOK

出力
---省略---
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 5a:6d:16:55:01:81 brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.110/24 brd 192.168.3.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 2400:2411:c6e1:5800:586d:16ff:fe55:181/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 86166sec preferred_lft 14166sec
    inet6 fe80::586d:16ff:fe55:181/64 scope link
       valid_lft forever preferred_lft forever
---省略---

うまく行かないときは /run/systemd/network/ にあるファイルを削除してみる

辞書順で優先度が決まるため、先程作成した設定ファイルよりも/run/systemd/network/にある元の設定ファイルが優先されている可能性がある

virbr0というインターフェイスができていたので削除しておく

sudo ip link delete virbr0

libvirtで仮想マシンを作成

kvmをCPUのアクセラレータとして使用し、qemuでマシンをエミュレートする
qemuは基本的にlibvirtを通して操作する

libvirtdサービスの起動&有効化

sudo systemctl enable --now libvirtd

ユーザーをグループに追加

一般ユーザがlibvirtデーモンにアクセスできるようにするために、ユーザーをlibvirtグループに追加する

# user-name はlibvirtを使用するユーザ名で置き換える
sudo gpasswd -a user-name libvirt

デフォルトのURIを設定する

~/.config/libvirt/libvirt.confを作成する

~/.config/libvirt/libvirt.conf
uri_default = "qemu:///system"

確認

# qemu:///system となれば良い
virsh uri

ストレージプールの作成

仮想ディスク(ボリューム)を保存しておく場所としてストレージプールを作成する

ストレージプールを確認する
まだ作成していないのでなにもないはず

virsh pool-list --all

ディレクトリ作成

ストレージプール用のディレクトリを作成する

sudo mkdir -p /home/libvirt/images/iso/

権限の設定

ストレージプールを作成するディレクトリは、libvirt-qemuユーザーがアクセスできる必要がある

libvirt-poolユーザーグループを作成し、libvirtを使用するユーザーとlibvirt-qemuユーザーを所属させる

sudo groupadd libvirt-pool
sudo gpasswd -a <your_user_name> libvirt-pool
sudo gpasswd -a libvirt-qemu libvirt-pool

ディレクトリの所有グループをlibvirt-poolにする

sudo chown -R root:libvirt-pool /home/libvirt/

ストレージプール作成

ストレージプールを定義する

# virsh pool-define-as <name> <type> --target <path>
virsh pool-define-as default dir --target /home/libvirt/images/

プールの起動&自動起動設定

virsh pool-start default
# auto-start ではないことに注意(autostart)
virsh pool-autostart default

確認

virsh pool-list --all
出力
 Name      State    Autostart
-------------------------------
 default   active   yes

プールの削除

プールの停止→削除(間違えた場合)

# 停止
virsh pool-destroy <pool-name>
# 削除
virsh pool-undefine <pool-name>

仮想マシンの作成

isoファイルをダウンロード

インストール用のisoファイルをダウンロードして~/libvirt/images/iso/に配置する
libvirt-qemuがアクセスできるよう再度権限を設定する

sudo chown -R root:libvirt-pool /home/libvirt/

仮想マシンのインストール(作成)

virt-install コマンドでVMを作成する

virt-install \
--name ubuntu-vm \
--memory 2048 \
--vcpus 2 \
--network bridge=br0 \
--disk size=32 \
--location /home/libvirt/images/iso/ubuntu22.04.iso,initrd=casper/initrd,kernel=casper/vmlinuz \
--os-variant ubuntu22.04 \
--noautoconsole \
--extra-args console=ttyS0,115200n8
オプション 説明
name 仮想マシンの名前
memory 割り当てるメモリサイズ(MiB)
vcpus 仮想CPUの数
network ネットワークインターフェイスを指定 bridge=br0
disk 仮想ディスクを指定 サイズ(GiB) すでに存在するボリュームも指定可
location OSインストール用のisoファイルを指定
os-variant OSの種類 osinfo-query osコマンドで一覧表示
noautoconsole 作成後に自動でコンソールを開かない
extra-args `virsh console <vm-name> で接続するのに必要

起動確認

virsh list
出力
 Id   Name          State
-----------------------------
 4    ubuntu-vm     running

自動起動(ホスト起動時)

自分の場合は仮想マシンをホストへのSSH踏み台サーバーとして使用しているので必須

# virsh autostart <vm-name>
virsh autostart ubuntu-vm

接続

コンソールで接続してOSのインストールを行う
SSHサーバーを設定しておくとSSH接続できるようになる

virsh console ubuntu-vm

SSHの設定: 自宅サーバーのSSH/UFW設定
       踏み台sshサーバーを使うための設定

完成!

かんせいした

Discussion