virt-manager(Virtual Machine Manager)の導入

リモートから対象サーバ内でVMを管理するためvirt-managerを導入

virt-managerとlibvirt, QEMU, KVMとの関係

名前 役割 どこで動く? 重要ポイント
virt-manager 管理ツール(GUI) ユーザー空間(デスクトップアプリ) ユーザーが使う窓口
libvirt 仮想マシン管理 API (ミドルウェア) ユーザー空間 + デーモン常駐 実際の VM 制御を担当
QEMU 仮想マシン実行エンジン ユーザー空間 VM を作成・起動する
KVM ハードウェア仮想化支援(カーネルモジュール) カーネル空間 CPU/メモリの高速実行

GUI

$ sudo apt-get install virt-manager

CLIでのKVM + QEMU + libvirt環境構築する場合

$ sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst

libvirtdデーモン自動起動確認

$ 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 Tue 2025-06-17 05:54:30 UTC; 1min 37s ago
TriggeredBy: ● libvirtd-ro.socket
             ● libvirtd.socket
             ● libvirtd-admin.socket
       Docs: man:libvirtd(8)
             https://libvirt.org/
   Main PID: 16462 (libvirtd)
      Tasks: 22 (limit: 32768)
     Memory: 10.3M (peak: 11.7M)
        CPU: 310ms
     CGroup: /system.slice/libvirtd.service
             ├─11952 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
             ├─11953 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
             └─16462 /usr/sbin/libvirtd --timeout 120

Jun 17 05:54:30 hp-elitedesk systemd[1]: Starting libvirtd.service - libvirt legacy monolithic daemon...
Jun 17 05:54:30 hp-elitedesk systemd[1]: Started libvirtd.service - libvirt legacy monolithic daemon.
Jun 17 05:54:30 hp-elitedesk dnsmasq[11952]: read /etc/hosts - 12 names
Jun 17 05:54:30 hp-elitedesk dnsmasq[11952]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 names
Jun 17 05:54:30 hp-elitedesk dnsmasq-dhcp[11952]: read /var/lib/libvirt/dnsmasq/default.hostsfile

管理ユーザをlibvirtグループに追加(再ログインで有効)

$ sudo usermod -aG libvirt $USER

libvirtの管理コマンドは基本 virsh , virt-install で行います。

$ virsh list --all
 Id   Name          State
-----------------------------
 5    ubuntu24.04   running

$ virsh domblklist ubuntu24.04
 Target   Source
-----------------------------------------------------
 vda      /var/lib/libvirt/images/ubuntu24.04.qcow2
 sda      -

$ virsh pool-list
 Name      State    Autostart
-------------------------------
 default   active   yes

ベースVM、クローンVMの作成

ホストPC

まず、ホストPCで以下の準備をします。

libguestfs-toolsのインストール

  • 概要: 仮想マシンイメージ(ディスクイメージ)を操作・編集するためのツール群。
  • 用途: 仮想マシンを起動せずに、イメージファイルの中身(ファイルシステム、設定ファイル、パーティションなど)を直接操作できる。
$ sudo apt install libguestfs-tools

SSH鍵の導入(後でクローン用に)

$ ssh-keygen -t ed25519
# → ~/.ssh/id_ed25519.pub を作成

ベースVM

ベースとなるVMには、Ubuntu24.04サーバ(openssh-server)をインストール、一度起動して必要なパッケージやシステムデーモンを有効(起動)にしておきます。

SSHサーバを起動、パッケージの更新

$ sudo systemctl start ssh
$ sudo apt update && sudo apt upgrade -y

ホストネームの変更

$ sudo nano /etc/hostname ---> node001
$ sudo nano /etc/hosts ----> 127.0.1.1 node001

cloud-initによるVM起動時の設定を排除

$ sudo systemctl disable cloud-init

Netplanの設定は残るのでこのままでいいが名称を変更

$ sudo mv /etc/netplan/50-cloud-init.yaml /etc/netplan/base-net.yaml

ベースVMを起動した状態でホストから公開鍵を登録(例)

$ ssh-copy-id -i ~/.ssh/id_ed25519.pub k8sadmin@ベースVMのIP

snapの削除

Ubuntuサーバインストール時にdockerのインストールを指定した場合、snap版がインストールされます。k3sのインストールスクリプトでは、コンテナランタイムcontainerdがaptコマンドでインストールされるため、snap及びdockerは不要。必要であれば別途aptコマンドでインストール。

# 1. snap版docker停止
$ sudo systemctl stop snap.docker.dockerd.service
$ sudo snap stop docker

# 2. snapパッケージ削除
$ sudo snap remove docker
$ sudo snap remove core22
$ sudo snap remove snapd

# 3. apt系snapd削除
$ sudo apt purge snapd
$ sudo apt autoremove --purge

# 4. 残存ディレクトリ削除
$ sudo rm -rf /snap /var/snap /var/lib/snapd /var/cache/snapd

# 5. 念のため再起動
$ sudo reboot

ホストPC

ベースVMをシャットダウン後、virt-sysprep実行

virt-sysprep

  • 概要: 仮想マシンのイメージを「クローン用に初期化」するツール(libguestfs-tools に含まれることが多い)。
  • 用途: 仮想マシンの複製を作る前に、ホスト固有情報を削除・初期化する。
  • 初期化する内容の例:
    • ホスト名のリセット
    • SSH ホスト鍵の削除
    • ログの削除
    • 一時ファイルの削除
    • ユーザーパスワードのリセット など

VM確認

$ virsh list --all
 Id   Name          State
-----------------------------
 5    ubuntu24.04   running

VMで一意であるべき設定の初期化(ベースのVMのみ)
注) machine-idが一意でないとクローンVMで同じIPが割当てられてしまいます。

$ sudo virt-sysprep -d ubuntu24-template --operations logfiles,machine-id,udev-persistent-net

注) ベースのVMを起動して内容を変更した場合、シャットダウンしてホストで上記のコマンドを必ず実行して下さい。

これをベースにvirt-managerか以下のコマンドでVM作成

$ virt-clone --original ubuntu24.04 --name master-node --auto-clone
$ virt-clone --original ubuntu24.04 --name worker-node001 --auto-clone
$ virt-clone --original ubuntu24.04 --name ubuntu-nfs --auto-clone

クローンVMでSSHサーバが起動していない場合
virt-managerのコンソールでステータスをチェック

$ sudo systemctl status ssh

enableにして起動

$ sudo systemctl enable ssh
$ sudo systemctl start ssh

ネットワーク設定はNetplanが担っていますが、machine-idが同じ状態でクローンVMを作成すると同じIPが割当てられてしまいます。

$ sudo nano /etc/netplan/50-cloud-init.yaml
network:
  version: 2
  ethernets:
    enp1s0:
      dhcp4: yes

固定IPにする場合

network:
  version: 2
  ethernets:
    enp1s0:
      dhcp4: no
      addresses:
        - 192.168.122.101/24
      gateway4: 192.168.122.1
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]

変更内容を適用

$ sudo netplan apply

ホストネームもVM毎に変更が必要です。

$ sudo nano /etc/hostname ---> node002
$ sudo nano /etc/hosts ----> 127.0.1.1 node002

IPv6対応仮想ネットワーク作成

注)

  • IPv6 : fdxx:xxxx:xxxx:1::0/80
  • VMには静的IPを付与するためDHCPはチェックしないこと。

日付とマシンIDの組合せからsha1sumを出力し、下位10桁にfdを付けてプレフィックスを作成:fdxx:xxxx:xxxx:1::0/80

$ date +%s%N
$ cat /var/lib/dbus/machine-id
$ printf 17505052557732482504064e439xxxxxxxxxxxxxx | sha1sum

VMのボリューム変更

ホストPCでの作業

対象VMを停止

$ sudo virsh shutdown master-node

ボリュームの確認

10GB増加する場合

$ sudo qemu-img resize /var/lib/libvirt/images/master-node.qcow2 +10G

VMでの作業

ディスク状況確認

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sr0     11:0    1 1024M  0 rom  
vda    253:0    0   20G  0 disk 
├─vda1 253:1    0    1M  0 part 
└─vda2 253:2    0   10G  0 part /

パーティション拡張

$ sudo growpart /dev/vda 2
CHANGED: partition=2 start=4096 old: size=20965376 end=20969471 new: size=41938911 end=41943006

ファイルシステム拡張 (ext4なら resize2fs)

$ sudo resize2fs /dev/vda2
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/vda2 is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3
The filesystem on /dev/vda2 is now 5242363 (4k) blocks long.

ディスク状況確認

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sr0     11:0    1 1024M  0 rom  
vda    253:0    0   20G  0 disk 
├─vda1 253:1    0    1M  0 part 
└─vda2 253:2    0   20G  0 part /

NFS (Network File System)-VM

KubernetesのPVとして利用するためのNFS専用VMを別途用意します。

NFSサーバー構築

インストールと共有ディレクトリの作成・権限設定

$ sudo apt install nfs-kernel-server
$ sudo mkdir -p /mnt/nfs_share
$ sudo chown nobody:nogroup /mnt/nfs_share

エクスポート設定を追加

$ sudo nano /etc/exports
/mnt/nfs_share *(rw,sync,no_subtree_check,no_root_squash)

NFSエクスポートを再読込・再起動

$ sudo exportfs -a
$ sudo systemctl restart nfs-kernel-server

クライアントとなるVMにはNFSクライアントをインストール

$ sudo apt install nfs-common

クライアントVMから動作確認(ボリュームマウント)

$ sudo mount -t nfs <NFSサーバのIP>:/mnt/nfs_share /mnt

アンマウント

$ sudo umount /mnt