KVMによる仮想基盤サーバの構築と仮想マシンの作成 (CnetOS 8)
Contents
はじめに
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から仮想マシンを管理するためのcockpit
とcockpit-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件のコメントがあります。