自宅サーバ構築(KVMによる仮想基盤の構築 CnetOS 8)

2020年5月4日

CentOSインストール時に「仮想化ホスト」パッケージグループを選択したのですが
一応お作法通りにいちから確認していきます。

KVMサポートの確認

ハードウェアのサポート

「lscpu」「/proc/cpuinfo」のコマンドでCPUが仮想化支援機能を備えていてハードウェア仮想化に対応していることを確認します。

lscpu コマンドの場合

「仮想化: VT-x」、「フラグ:vmx」の文字列が対応していることを表します。(赤太字)
何も表示されない場合はハードウェア仮想化に対応していないことになります。

~]#  lscpu
アーキテクチャ:                      x86_64
CPU 操作モード:                      32-bit, 64-bit
バイト順序:                          Little Endian
CPU:                                 2
オンラインになっている CPU のリスト: 0,1
コアあたりのスレッド数:              1
ソケットあたりのコア数:              2
ソケット数:                          1
NUMA ノード数:                       1
ベンダー ID:                         GenuineIntel
CPU ファミリー:                      6
モデル:                              158
モデル名:                            Intel(R) Celeron(R) G4930 CPU @ 3.20GHz
ステッピング:                        11
CPU MHz:                             3200.357
CPU 最大 MHz:                        3200.0000
CPU 最小 MHz:                        800.0000
BogoMIPS:                            6384.00
仮想化:                          VT-x
L1d キャッシュ:                      32K
L1i キャッシュ:                      32K
L2 キャッシュ:                       256K
L3 キャッシュ:                       2048K
NUMA ノード 0 CPU:                   0,1
フラグ:                              fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust smep erms invpcid mpx rdseed smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d

「/proc/cpuinfo」ファイルを参照

cat /proc/cpuinfoをした場合表示が大きくなりすぎるのでgrepしています。

 ~]# grep -E --color=auto 'vmx|svm' /proc/cpuinfo
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust smep erms invpcid mpx rdseed smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust smep erms invpcid mpx rdseed smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1d
[root@kvm ~]#

カーネルのサポート

lsmodコマンド

kvm ハードウェア仮想化モジュールがロードされている場合、「kvm_intel」 か「kvm_amd」 が表示されます。

~]# lsmod | grep kvm
kvm_intel             290816  4
kvm                   761856  1 kvm_intel
irqbypass              16384  3 kvm
[root@kvm ~]#

必要なパッケージのインストールと確認

OSインストールの際、「仮想化ホスト」のパッケージを選択しましたが足りないパッケージがあるのでインストールします。

「anaconda-ks.cfg」ファイルを参照してOSインストール時の選択の確認

~]# cat anaconda-ks.cfg
#version=RHEL8
・
・中略
・
%packages
@^virtualization-host-environment

%end
・
・中略
・
~]#

最低限必要なパッケージのインストール
「libvirt」「libvirt」

~]# dnf -y install qemu-kvm libvirt virt-install
CentOS-8 - AppStream     [===                                 ]  6.2 kB/s | 4.3 kB     00:00    
CentOS-8 - Base     100% [====================================]  7.6 kB/s | 3.9 kB     00:00    
CentOS-8 - Extras   100% [====================================]  3.0 kB/s | 1.5 kB     00:00    
パッケージ qemu-kvm-15:2.12.0-88.module_el8.1.0+297+df420408.3.x86_64 は既にインストールされています。
パッケージ libvirt-4.5.0-35.3.module_el8.1.0+297+df420408.x86_64 は既にインストールされています。
依存関係が解決しました。
・
・中略
・
完了しました!
~]# 

KVM仮想化に関連するパッケージの一覧(2020/5/5時点)

青字が「仮想化ホスト」パッケージを選択することでインストールされていたもの
赤字が今回依存関係の解決も含め追加されたもの

~]# dnf list installed | grep -e kvm -e virt -e qemu
・
libvirt.x86_64                         4.5.0-35.3.module_el8.1.0+297+df420408  @AppStream
・
・中略
・
python3-libvirt.x86_64                 4.5.0-2.module_el8.1.0+248+298dec18      @AppStream
qemu-img.x86_64                        15:2.12.0-88.module_el8.1.0+297+df420408.3 @AppStream
qemu-kvm.x86_64                        15:2.12.0-88.module_el8.1.0+297+df420408.3 @AppStream
・
・中略
・
virt-install.noarch                    2.2.1-2.el8                              @AppStream
virt-manager-common.noarch             2.2.1-2.el8                              @AppStream
・
・中略
・

システムが仮想化ホストとして構成されていることを確認

「virt-host-validate」コマンドで表示される項目がすべて「成功」と表示されることを確認します。
「警告」と表示された場合は仮想マシンの作成はできますがパフォーマンスの問題に遭遇する可能性があります。
「失敗」と表示される項目があった場合は該当の問題を解消しないと仮想マシンを作成するときに失敗します。

~]# 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 'cpu' controller support : 成功
QEMU: 確認中 for cgroup 'cpuacct' controller support : 成功
QEMU: 確認中 for cgroup 'cpuset' controller support : 成功
QEMU: 確認中 for cgroup 'memory' controller support : 成功
QEMU: 確認中 for cgroup 'devices' controller support : 成功
QEMU: 確認中 for cgroup 'blkio' controller support : 成功
QEMU: 確認中 for device assignment IOMMU support : 成功
QEMU: 確認中 if IOMMU is enabled by kernel : 警告 (IOMMU appears to be disabled in kernel. Add intel_iommu=on to kernel cmdline arguments)
「IOMMU」の項目で警告が表示されました。
(IOMMUがカーネルで無効になっているようです。 intel_iommu = onをカーネルのコマンドライン引数に追加)

「IOMM」の警告なので仮想マシンの作成には問題になりませんが表示された対処を実施します。
~]# vi /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"                                                               #↓赤太字箇所を追加
GRUB_CMDLINE_LINUX="resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet intel_iommu=on"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true
~]#

grub2-mkconfig -o コマンドを実行して、grub.cfg ファイルを再構築

再起動して反映されることを確認します。

~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
done
~]# reboot

libvirtdサービスの有効化と即時起動

~]# systemctl enable --now libvirtd

libvirtについてよくわからない方は下記のサイトを参照してください。

「仮想マシン」管理ツールをCockpitに追加

cockpitで仮想マシンの管理を行うために「cockpit」に「cockpit-machines」を追加する。
(すでにCockpitは有効なのでインストールだけでメニューが表示されます。)

~]# dnf -y install cockpit-machines

Cockpitをインストールすればここから管理できるようになります。

ネットワークの構成

下記の3つの方法から「2.ブリッジネットワーク(別名「共有物理デバイス」)」を構成します。

  1. NATフォワーディング(別名「仮想ネットワーク」)
  2. ブリッジネットワーク(別名「共有物理デバイス」)
  3. ホストネットワークデバイスのPCIパススルー

ブリッジネットワーク(別名「共有物理デバイス」)による構成の作成

~]# nmcli con add type bridge con-name br0 ifname br0
接続 'br0' (00000000-0000-0000-0000-00000000000d) が正常に追加されました。
~]# nmcli con mod br0 bridge.stp no
~]# nmcli con mod br0 ipv4.method manual ipv4.addresses "192.168.0.10/24" ipv4.gateway "192.168.0.1" ipv4.dns 8.8.8.8
~]# nmcli con mod br0 autoconnect yes
~]# nmcli con
NAME    UUID                                  TYPE      DEVICE
br0     00000000-0000-0000-0000-00000000000d  bridge    br0
eno1    00000000-0000-0000-0000-00000000000c  ethernet  eno1
virbr0  00000000-0000-0000-0000-000000000004  bridge    virbr0
enp2s0  00000000-0000-0000-0000-000000000009  ethernet  --
vnet0   00000000-0000-0000-0000-000000000008  tun       --
~]# nmcli con add type bridge-slave ifname enp2s0 master br0
接続 'bridge-slave-enp2s0' (00000000-0000-0000-0000-00000000000b) が正常に追加されました。
~]# nmcli con up br0
接続が正常にアクティベートされました (master waiting for slaves) (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/18)
~]#

Cockpitから確認すると下記のようになります。
(Cockpitからも設定および変更ができます。)

仮想基盤の準備としてはここまで

Linux