🐥

【Ubuntu】Linux KVMとCockpitで仮想サーバを構築する

2024/08/26に公開

はじめに

自宅で構築したサーバの台数が増えてきたため、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をインストールした状態から始めるものとします
参考:
https://qiita.com/ku_suke/items/269dfecec398187aed77

事前作業・確認

パッケージ情報を更新する

$ 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
変更前_50-cloud-init.yaml
network:
    ethernets:
        (NIC名):
            addresses:
            - (セットアップ時のIPアドレス)
            nameservers:
                addresses:
                - (セットアップ時のDNSサーバIPアドレス)
                search: []
            routes:
            -   to: default
                via: (セットアップ時のデフォルトゲートウェイ)
    version: 2
    wifis: {}
変更後_50-cloud-init.yaml
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