【Ubuntu】Linux KVMとCockpitで仮想サーバを構築する
はじめに
自宅で構築したサーバの台数が増えてきたため、KVM(Kernel-based Virtual Machine)とCockpitを使用して仮想サーバを構築し1つのサーバに統合することにしました。
KVMを使用すると1つの物理サーバ上に複数の仮想マシンを構築し、稼働させることができます。
目標
- KVMをインストールする
- Cockpitをインストールする
- Cockpit上でネットワーク設定を行えるようにする
- ブリッジ接続の有効化
- 仮想マシン管理用のCockpitプラグインを導入する
- 仮想マシンを作成する
- ホストOSのNICとゲストOSの仮想NICをブリッジ接続する
構築環境
- ハードウェア
- CPU:intel i7 14700KF
- メモリ:DDR4 32GB
- ストレージ:SSD 1TB
- OS
- Ubuntu 24.04 LTS
構築手順
Ubunutu 24をインストールした状態から始めるものとします
参考:
事前作業・確認
パッケージ情報を更新する
$ sudo apt update
仮想化対応CPUか確認
#0以外の数字が出力されればOK
$ egrep -c '(vmx|svm)' /proc/cpuinfo
56
パーティションを拡張する
Ubuntu24では搭載したストレージの容量に限らず、
デフォルトで100GBしか割り当てられないようなのでパーティションを広げます。
# パーティションの状態を確認
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1 259:0 0 931.5G 0 disk
tqnvme0n1p1 259:1 0 1G 0 part /boot/efi
tqnvme0n1p2 259:2 0 2G 0 part /boot
mqnvme0n1p3 259:3 0 928.5G 0 part
mqubuntu--vg-ubuntu--lv 252:0 0 100G 0 lvm /
$ sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
Size of logical volume ubuntu-vg/ubuntu-lv changed from 100.00 GiB (25600 extents) to <928.46 GiB (237685 extents).
Logical volume ubuntu-vg/ubuntu-lv successfully resized.
# パーティションが拡張されたことを確認
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1 259:0 0 931.5G 0 disk
tqnvme0n1p1 259:1 0 1G 0 part /boot/efi
tqnvme0n1p2 259:2 0 2G 0 part /boot
mqnvme0n1p3 259:3 0 928.5G 0 part
mqubuntu--vg-ubuntu--lv 252:0 0 928.5G 0 lvm /
ファイルシステムに追随させる
# ディスク容量を確認
$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 3.2G 1.7M 3.2G 1% /run
efivarfs 192K 99K 89K 53% /sys/firmware/efi/efivars
/dev/mapper/ubuntu--vg-ubuntu--lv 98G 11G 82G 12% /
tmpfs 16G 0 16G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 16G 0 16G 0% /run/qemu
/dev/nvme0n1p2 2.0G 96M 1.7G 6% /boot
/dev/nvme0n1p1 1.1G 6.2M 1.1G 1% /boot/efi
tmpfs 3.2G 16K 3.2G 1% /run/user/1000
$ sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/mapper/ubuntu--vg-ubuntu--lv is mounted on /; on-line resizing required
old_desc_blocks = 13, new_desc_blocks = 117
The filesystem on /dev/mapper/ubuntu--vg-ubuntu--lv is now 243389440 (4k) blocks long.
# ディスク容量が拡張されていることを確認
$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 3.2G 1.7M 3.2G 1% /run
efivarfs 192K 99K 89K 53% /sys/firmware/efi/efivars
/dev/mapper/ubuntu--vg-ubuntu--lv 914G 11G 865G 2% /
tmpfs 16G 0 16G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 16G 0 16G 0% /run/qemu
/dev/nvme0n1p2 2.0G 96M 1.7G 6% /boot
/dev/nvme0n1p1 1.1G 6.2M 1.1G 1% /boot/efi
tmpfs 3.2G 16K 3.2G 1% /run/user/1000
KVMのインストール
必要サービスをインストールする
$ sudo apt install -y qemu-kvm virt-manager libvirt-daemon-system virtinst libvirt-clients bridge-utils
仮想化デーモンを有効化する
$ sudo systemctl enable --now libvirtd
$ sudo systemctl start libvirtd
# ステータスがActiveになっていればOK
$ sudo systemctl status libvirtd
● libvirtd.service - libvirt legacy monolithic daemon
Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; preset: enabled)
Active: active (running) since Sat 2024-08-24 03:28:49 UTC; 19s ago
TriggeredBy: ● libvirtd-admin.socket
● libvirtd-ro.socket
● libvirtd.socket
Docs: man:libvirtd(8)
https://libvirt.org/
Main PID: 12233 (libvirtd)
Tasks: 20 (limit: 32768)
Memory: 7.1M (peak: 9.4M)
CPU: 95ms
CGroup: /system.slice/libvirtd.service
mq12233 /usr/sbin/libvirtd --timeout 120
Aug 24 03:28:49 kvm-server systemd[1]: Starting libvirtd.service - libvirt legacy monolithic daemon...
Aug 24 03:28:49 kvm-server systemd[1]: Started libvirtd.service - libvirt legacy monolithic daemon.
KVMグループにユーザを追加する
$ sudo usermod -aG kvm $USER
$ sudo usermod -aG libvirt $USER
# 所属グループにkvmとlibvirtが含まれていればOK
$ groups $USER
<ログイン中のユーザ名> : <ログイン中のユーザ名> adm cdrom sudo dip plugdev kvm lxd libvirt
Cockpitのインストール
Cockpitをインストールする
$ sudo apt install cockpit -y
# 再起動した時も自動でCockpitが立ち上がるようにする
$ sudo systemctl enable cockpit.socket
$ sudo systemctl start cockpit.socket
# ステータスがActiveになっていればOK
$ sudo systemctl status cockpit.socket
● cockpit.socket - Cockpit Web Service Socket
Loaded: loaded (/usr/lib/systemd/system/cockpit.socket; enabled; preset: enabled)
Active: active (running) since Sat 2024-08-24 04:07:26 UTC; 2min 38s ago
Triggers: ● cockpit.service
Docs: man:cockpit-ws(8)
Listen: [::]:9090 (Stream)
Tasks: 0 (limit: 38226)
Memory: 2.5M (peak: 4.8M)
CPU: 20ms
CGroup: /system.slice/cockpit.socket
Aug 24 04:07:26 kvm-server systemd[1]: Starting cockpit.socket - Cockpit Web Service Socket...
Aug 24 04:07:26 kvm-server systemd[1]: Listening on cockpit.socket - Cockpit Web Service Socket.
Webコンソールにアクセスする
https://{サーバのIPアドレス}:9090/ にアクセスすると下記の画面が表示されます。
先ほど作業していたユーザでログインします。
ネットワーク管理をCockpit上で行えるよう設定変更
netplanの設定変更
ネットワーク管理をnetplanからNetworkManager経由に変更し、
Cockpit上で管理を行えるようにします
# 設定変更前にバックアップを取得
$ sudo cp /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.bak
$ sudo vi /etc/netplan/50-cloud-init.yaml
network:
ethernets:
(NIC名):
addresses:
- (セットアップ時のIPアドレス)
nameservers:
addresses:
- (セットアップ時のDNSサーバIPアドレス)
search: []
routes:
- to: default
via: (セットアップ時のデフォルトゲートウェイ)
version: 2
wifis: {}
network:
# ethernets:
# (NIC名):
# addresses:
# - (セットアップ時のIPアドレス)
# nameservers:
# addresses:
# - (セットアップ時のDNSサーバIPアドレス)
# search: []
# routes:
# - to: default
# via: (セットアップ時のデフォルトゲートウェイ)
renderer: NetworkManager
version: 2
# wifis: {}
version以外の設定をコメントアウトし、renderer: NetworkManager
を追加します。
設定変更反映
netplanで固定IPアドレスを割り当てていた場合、
rebootするまでnetplanの設定が残り続けるため再起動する。
IPアドレス設定がNetworkManager経由に変更されたタイミングで
DHCPでアドレスが割り当てられるようになるため、
これ以降の手順は物理サーバにアクセスして行うか、
ルータ側でDHCPの固定IPアドレス割り当ての設定を行っておきましょう。
$ sudo netplan generate
$ sudo reboot
$ sudo systemctl restart NetworkManager
$ sudo systemctl status NetworkManager
● NetworkManager.service - Network Manager
Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; preset: enabled)
Active: active (running) since Sat 2024-08-24 06:01:57 UTC; 1h 18min ago
Docs: man:NetworkManager(8)
Main PID: 1062 (NetworkManager)
Tasks: 4 (limit: 38226)
Memory: 21.4M (peak: 37.5M)
CPU: 824ms
CGroup: /system.slice/NetworkManager.service
mq1062 /usr/sbin/NetworkManager --no-daemon
Aug 24 06:02:33 kvm-server NetworkManager[1062]: <info> [1724479353.0126] dhcp4 (enp0s31f6): state changed new lease, a>
Aug 24 06:02:33 kvm-server NetworkManager[1062]: <info> [1724479353.1655] dhcp4 (enp0s31f6): state changed new lease, a>
Aug 24 06:02:33 kvm-server NetworkManager[1062]: <info> [1724479353.1660] policy: set 'Wired connection 1' (enp0s31f6) >
Aug 24 06:02:33 kvm-server NetworkManager[1062]: <info> [1724479353.1717] device (enp0s31f6): state change: ip-config ->
Aug 24 06:02:33 kvm-server NetworkManager[1062]: <info> [1724479353.1972] device (enp0s31f6): state change: ip-check ->>
Aug 24 06:02:33 kvm-server NetworkManager[1062]: <info> [1724479353.1975] device (enp0s31f6): state change: secondaries>
Aug 24 06:02:33 kvm-server NetworkManager[1062]: <info> [1724479353.1980] manager: NetworkManager state is now CONNECTE>
Aug 24 06:02:33 kvm-server NetworkManager[1062]: <info> [1724479353.1985] device (enp0s31f6): Activation: successful, d>
Aug 24 06:02:33 kvm-server NetworkManager[1062]: <info> [1724479353.1992] manager: NetworkManager state is now CONNECTE>
Aug 24 06:02:33 kvm-server NetworkManager[1062]: <info> [1724479353.1996] manager: startup complete
これでCockpitからネットワーク管理を行えるようになります。
固定IPアドレスの設定
IPアドレスが割り当てられているNICの設定変更を行います。
ゲートウェイやDNSサーバの設定は環境によりますが、
特に分からなければ下記の設定を投入します。
設定の変更を行い、変更後のIPアドレスから管理コンソールにアクセスします。
ブリッジ接続の有効化
インターフェースからブリッジの追加へ移動します。
IPアドレスを設定したNICにチェックを入れます。
NIC名がbridge0に変わります。
仮想マシン管理用のCockpitプラグインを導入する
コンソールにアクセスして下記コマンドを実行します。
$ sudo apt install cockpit-machines
CockpitにアクセスするとVirtual machinesが追加されてます。
仮想マシンを作成する
仮想マシンの作成からゲストOSを立ち上げてみます。
無事ゲストOSを立ち上げることができました。
これでCockpit上で仮想マシンを管理することができるようになりました。
おわりに
物理サーバ1台で複数のサーバを立ち上げられるようになったので、
検証用にサッと仮想サーバを立ち上げたり、DNSやメールサーバ等のサービスごとにサーバを分けてミニインフラを構築してみたり、色々と面白い使い方ができそうです。
しばらくはこれで遊んでみたいと思います。
Discussion