【Ubuntu】KVM+QEMUで仮想サーバーを構築する
インストール
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/
に設定ファイルを作成する
ファイル名はこの例と同じにする必要はなく、適当でも良い
(設定ファイルは辞書順でソートされるが今回の場合は気にしなくてよい)
[NetDev]
Name=br0
Kind=bridge
[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
は自分のホストのネットワークインターフェイス名で置き換える
[Match]
Name=eno1
[Network]
Bridge=br0
systemd-networkd
を再起動
設定が間違っているとsshで操作できなくなるので注意
sudo systemctl restart systemd-networkd
br0
が作られているか確認する
ip a
br0
の inet
のところが設定した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
を作成する
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