KVMによる仮想基盤サーバの構築と仮想マシンの作成 (CnetOS 8)

はじめに

CentOS 8に同梱されているLinux KVM(以下KVM)を使用した仮想基盤サーバの構築について勉強してみました。
VMware社のvSphere(ESXi)と比較すると、ユーザインターフェースの違いやパラメータの多さで若干とっつきにくいところがありますが、慣れてしまえばCLIベースでスムーズに仮想マシンを構築できそうです。

[2021/5/5追記]
RHEL 8を使用した記事を書きました。本記事でうまくいかなかったWebコンソールでのネットワーク設定ができるようになっています。
KVMによる仮想基盤サーバの構築と仮想マシンの作成 (RHEL 8)

前提条件

以下の前提条件で検証しています。

  • OS: CentOS 8.0
  • 仮想基盤ソフトウェア(主要ソフトウェア)
    • qemu-kvm: 2.12.0 (OS同梱版)
    • libvirt-daemon: 4.5.0 (OS同梱版)
    • virt-install: 2.0.0 (OS同梱版)
    • cockpit: 185.1 (OS同梱版)
  • 各手順はroot権限を持つユーザで実施

OSは、CentOSインストールDVDのISOファイルから「最小限のインストール」を選択しインストールを行いました。
バージョン情報は以下の通りです。

# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)

# uname -r
4.18.0-80.el8.x86_6

ネットワーク構成は、以下の通りです。
ブリッジインターフェースを使用して、仮想マシンをホストマシンと同じネットワークに所属させています。

必要パッケージのインストール

DNFのモジュール機能を使用して、仮想環境パッケージ一式であるvirtをインストールします。併せて、仮想マシンのOSインストールを行うツールであるvirt-install、WebUIから仮想マシンを管理するためのcockpitcockpit-machinesもインストールします。

# dnf -y module install virt
# dnf -y install virt-install cockpit cockpit-machines

ホストマシンの仮想化支援機能の設定

仮想化支援機能の確認

以下のコマンドを実行し、ホストマシンの仮想化支援機能の確認を行います。

# virt-host-validate
  QEMU: 確認中 for hardware virtualization                                 : 成功
  QEMU: 確認中 if device /dev/kvm exists                                   : 成功
  QEMU: 確認中 if device /dev/kvm is accessible                            : 成功
  QEMU: 確認中 if device /dev/vhost-net exists                             : 成功
  QEMU: 確認中 if device /dev/net/tun exists                               : 成功
  QEMU: 確認中 for cgroup 'memory' controller support                      : 成功
  QEMU: 確認中 for cgroup 'memory' controller mount-point                  : 成功
  QEMU: 確認中 for cgroup 'cpu' controller support                         : 成功
  QEMU: 確認中 for cgroup 'cpu' controller mount-point                     : 成功
  QEMU: 確認中 for cgroup 'cpuacct' controller support                     : 成功
  QEMU: 確認中 for cgroup 'cpuacct' controller mount-point                 : 成功
  QEMU: 確認中 for cgroup 'cpuset' controller support                      : 成功
  QEMU: 確認中 for cgroup 'cpuset' controller mount-point                  : 成功
  QEMU: 確認中 for cgroup 'devices' controller support                     : 成功
  QEMU: 確認中 for cgroup 'devices' controller mount-point                 : 成功
  QEMU: 確認中 for cgroup 'blkio' controller support                       : 成功
  QEMU: 確認中 for cgroup 'blkio' controller mount-point                   : 成功
  QEMU: 確認中 for device assignment IOMMU support                         : 警告 (No ACPI DMAR table found, IOMMU either disabled in BIOS or not supported by this hardware platform)

上記の例では、IOMMUに関する警告が表示されました。IOMMUは、物理PCIデバイスを仮想マシンでそのまま使用できるPCIパススルーと呼ばれる仮想化支援機能で使用する技術です。警告の原因は、以下が挙げられます。

  • CPU / マザーボードがIOMMU(Intel VT-d / AMD-Vi)に対応していない
  • BIOS / UEFIで上記設定が有効化されていない
  • カーネルのIOMMU機能が有効化されていない

IOMMUが使用できなくても仮想マシンの作成は可能ですが、可能であれば有効化しておくのが望ましいです。
BIOS / UEFIの設定については、ホストマシンのマザーボードのマニュアルを参照してください。
カーネルのIOMMU機能を有効化する場合は、ブートローダの設定を変更します。viなどのテキストエディタでGRUB2の設定ファイルを開きます。

# vi /etc/default/grub

変更箇所は以下の通りです。CPUがIntel製の場合、GRUB_CMDLINE_LINUXの末尾にintel_iommu=onを追記します。CPUがAMD製の場合は、amd_iommu=onを追記します。

GRUB_CMDLINE_LINUX="resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"
↓
GRUB_CMDLINE_LINUX="resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet intel_iommu=on"

以下のコマンドを実行し、変更したGRUB2の設定ファイルから、GRUB2が実際に使用する別の設定ファイルを作成します。その後、OSの再起動を行います。

# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Adding boot menu entry for EFI firmware configuration
done

# reboot

サービスの起動

以下のコマンドを実行し、仮想基盤サービスを提供するlibvirtdサービスの自動起動設定と起動を行います。

# systemctl enable --now libvirtd
Created symlink /etc/systemd/system/multi-user.target.wants/libvirtd.service → /usr/lib/systemd/system/libvirtd.service.
Created symlink /etc/systemd/system/sockets.target.wants/virtlockd.socket → /usr/lib/systemd/system/virtlockd.socket.
Created symlink /etc/systemd/system/sockets.target.wants/virtlogd.socket → /usr/lib/systemd/system/virtlogd.socket.

以下のコマンドを実行し、WebUI機能を提供するcockpitソケットの自動起動設定と起動を行います。
なお、systemctlの管理上cockpitはサービスユニットではなくソケットユニットなので、.socketをソケット名の末尾に付与して、ソケットユニットであることを明記する必要があります。

# systemctl enable --now cockpit.socket
Created symlink /etc/systemd/system/sockets.target.wants/cockpit.socket → /usr/lib/systemd/system/cockpit.socket.

OSインストール用ISOファイルの用意

仮想マシンにOSをインストールするためのISOファイルを用意します。今回は、CentOS 7.7(1908)のインストールDVDのISOファイルを/isoに保存します。
以下のコマンドを実行し、ISOファイルをダウンロードします。

# mkdir /iso
# curl -L -o /iso/centos77.iso http://ftp.riken.jp/Linux/centos/7.7.1908/isos/x86_64/CentOS-7-x86_64-DVD-1908.iso

ネットワークの設定

既存仮想ネットワークの確認

KVMをインストールすると、初期設定としてvirbr0という名前のブリッジインターフェースと、defaultという名前の仮想ネットワークが作成されます。defaultは、virbr0に接続されたNATルータとして動作し、内部でDHCPサーバが起動しています。

以下のコマンドで、仮想ネットワークの確認ができます。

# nmcli con | grep bridge                              TYPE      DEVICE     
virbr0   dffb02ec-554a-473e-b416-71334d164cbd  bridge    virbr0 

# virsh net-list 
 名前               状態     自動起動  永続
----------------------------------------------------------
 default              動作中  はい (yes)  はい (yes)

# virsh net-info default
名前:         default
UUID:           3628ed33-3904-4ec8-a91c-4fdc51059cee
起動中:      はい (yes)
永続:         はい (yes)
自動起動:   はい (yes)
ブリッジ:   virbr0

ブリッジインターフェースの作成

初期設定の仮想ネットワークdefaultはNATによるアウトバウンド通信が行えるものの、インバウンドの通信ができません。ホストマシンも含む、仮想ネットワークの外部から通信ができるように、新たにブリッジインターフェースをOS上に作成します。

以下のコマンドを実行し、ブリッジインターフェースを作成します。
ブリッジインターフェースにIPアドレスを設定するときは、物理インターフェースと被らないようにしておきます。
以下の例におけるパラメータ内容を列挙します。

  • インターフェース名: br0
  • ブリッジのSTP(スパニングツリー)設定: 無効
  • IPアドレス/サブネットマスク: 192.168.10.3/24
  • デフォルトゲートウェイ: 192.168.10.254
  • 名前解決先DNSサーバ: 8.8.8.8
  • インターフェースの自動起動設定: 有効
# nmcli con add type bridge con-name br0 ifname br0
# nmcli con mod br0 bridge.stp no
# nmcli con mod br0 ipv4.method manual ipv4.addresses "192.168.10.3/24" ipv4.gateway "192.168.10.254" ipv4.dns 8.8.8.8
# nmcli con mod br0 autoconnect yes

以下のコマンドを実行し、br0が作成されたことを確認します。

# nmcli con | grep bridge
br0                      bbe3f90a-58ba-4d69-8992-5ba493f5d604  bridge    br0        
virbr0                   dffb02ec-554a-473e-b416-71334d164cbd  bridge    virbr0 

作成したbr0の接続先として、物理インターフェースens192を追加します。

# nmcli con add type bridge-slave ifname ens192 master br0
接続 'bridge-slave-ens192' (88b08213-efbf-4584-9148-c55c284db87d) が正常に追加されました

以下のコマンドを実行し、今まで入力したブリッジインターフェースbr0の設定を反映します。

# nmcli con up br0
接続が正常にアクティベートされました (master waiting for slaves) (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/7)

物理インターフェースens192用のコネクション設定を削除します。SSHで設定対象ホストにリモート接続している場合、このタイミングで既存のIPアドレスが無効化されて接続が切断されるので注意してください。再接続するときは、ブリッジインターフェースbr0に設定したIPアドレスをSSHの接続先に指定します。

# nmcli con del ens192

仮想マシンの作成

仮想マシンの作成

仮想基盤の環境構築が完了したので、ホストマシン上に仮想マシンを作成します。
環境によって設定を変更する必要のあるオプションは、行末に#から始まるコメントを追記しているので参照してください。実際にコマンドを入力するときは、行末の#以降のコメントは入力しないでください。

# VM_NAME="compute-vm01"               # 仮想マシン名
# virt-install \    
--name ${VM_NAME} \
--hvm \
--arch x86_64 \
--os-type linux \
--os-variant centos7.0 \       # OSの種類を指定
--vcpus 2 \                    # CPU数を指定
--ram 2048 \                   # メモリ容量を指定
--disk path=/var/lib/libvirt/images/${VM_NAME}.img,format=qcow2,size=50 \ # ディスク容量を指定(size=xxGB)
--network bridge=br0 \         # ブリッジインターフェースを指定
--graphics vnc,keymap=ja \
--noautoconsole \
--location /iso/centos77.iso   # インストール用ISOファイルを指定

上記コマンドオプションのうち、--os-variantに指定可能なパラメータの一覧は、以下のコマンドで確認できます。短縮 IDの列をパラメータに指定してください。RHEL系Linuxであれば、メジャーバージョンまで合っていれば問題ありません。

# osinfo-query os
 短縮 ID            | 名前                                             | バージョン | ID                                      
----------------------+----------------------------------------------------+----------+-----------------------------------------
 alpinelinux3.5       | Alpine Linux 3.5                                   | 3.5      | http://alpinelinux.org/alpinelinux/3.5  
 alpinelinux3.6       | Alpine Linux 3.6                                   | 3.6      | http://alpinelinux.org/alpinelinux/3.6  
 alpinelinux3.7       | Alpine Linux 3.7                                   | 3.7      | http://alpine
(略)

以下のコマンドを実行し、仮想マシンが作成されたことを確認します。

# virsh list
 Id    名前                         状態
----------------------------------------------------
 8     compute-vm01                実行中

以下のコマンドを実行し、仮想マシンと同時に作成された仮想インターフェース(vnetx)が、ブリッジインターフェースbr0に接続されていることを確認します。

# virsh domiflist compute-vm01
インターフェース 種類     ソース  モデル   MAC
-------------------------------------------------------
vnet0      bridge     br0        virtio      52:54:00:6f:f6:ce

仮想マシンのOSインストール

仮想マシンの作成が完了したら、OSをインストールを進めます。前述のvirt-installコマンドにより、仮想マシン上でOSインストーラが起動しているので、CentOSのWebUI機能であるcockpitから、仮想ディスプレイを表示します。

作業端末のWebブラウザを起動し、以下のURLにアクセスします。

https://<ホストマシンのIPアドレス>:9090

「ユーザー名」、「パスワード」にrootユーザまたはroot権限を持つユーザの情報を入力し、「特権タスクにパスワードを再使用する」にチェックを入れます。「ログイン」を押下してログインします。

画面右側のペインの「仮想マシン」を押下します。

作成した仮想マシンの行頭「>」を押下します。

選択した仮想マシンに関するメニュータブが開くので、「Consoles」を押下します。
「Console Type」欄に「Graphics Console (VNC)」を選択すると、仮想マシンの仮想ディスプレイが表示されます。

仮想ディスプレイ上にマウスカーソルを合わせると、仮想マシン内の操作ができます。Webブラウザの画面サイズが狭い場合、仮想ディスプレイが見切れてしまうことがありますが、画面右端と下端をドラッグすることで画面をスクロールできます。
この後は、通常のCentOSのインストール手順を行えば、OSインストールは完了します。

備考

WebUI(cockpit)からも直接仮想マシンを作成できるのですが、検証中に仮想NICの設定でブリッジインターフェースを指定できない(メニューの選択肢が存在するもののグレーアウト状態)という問題が発生しました。そのため、今回の検証ではvirt-installコマンドでCLIから仮想マシンを作成しました。
cockpitの仮想マシン操作機能ではまだまだできないことが多く、発展途上な感触です。デスクトップ環境で利用できるvirt-managerはRHEL / CentOS 8では非推奨扱いのため、今後のcockpitの機能拡充に期待したいです。

KVMによる仮想基盤サーバの構築と仮想マシンの作成 (CnetOS 8)” に対して2件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です