🎩

KVM構築

2024/12/22に公開

主要パッケージ

パッケージ名 説明
libvirt 仮想マシンを管理するための基盤となるツール
qemu-kvm Linux 上で仮想化環境を提供するハイパーバイザ
virt-install 仮想マシンをコマンドラインから作成・管理するツール
cockpit-machines Webブラウザから仮想マシンを簡単に作成・管理できるGUIツール

環境


# uname -a
Linux pigukvm 4.18.0-553.32.1.el8_10.x86_64 #1 SMP Wed Dec 11 16:33:48 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

ハイパーバイザー設定


▽ モジュール・パッケージインストール
# dnf module -y install virt ///仮想化ツールのセットを含むモジュール(libvirt,qemu-kvm)
# dnf install -y virt-install cockpit-machines

▽ モジュール確認
# lsmod | grep kvm
kvm_intel             348160  0         ///Intel プロセッサ用の KVM モジュール
kvm                   970752  1 kvm_intel      ///KVM の基本モジュール
irqbypass              16384  1 kvm            ///割り込み処理の最適化モジュール

▽ KVM ハードウェア要件の検証
# 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) 
  QEMU: 確認中 for secure guest support                                    : 警告 (Unknown if this platform has Secure Guest support)

///警告対応
IOMMU は、I/O デバイスの仮想化を支援する技術。
弊環境だと Intel VT-d(Intel Virtualization Technology for Directed I/O)にて以下を支援する。
このため設定を有効化しておく。
・ネットワークカードの直接利用(ネットワーク I/O の最適化)
・ストレージデバイスの仮想マシンへの割り当て

secure guest support は、データの暗号化や、ホストとゲスト間のセキュリティ隔離をする技術。
弊環境だと Intel TDX(Trusted Domain Extensions)にて実現する。
仮想環境毎に顧客提供する場合は必要となりそうだが、今回は利用者が私だけのため不要。

▽ IOMMUの有効化
# cp -ip /etc/default/grub{,_`date +%Y%m%d`bk}
# ls -l /etc/default/grub{,_`date +%Y%m%d`bk}
///追加でselinux,ipv6も無効化する
# vi /etc/default/grub
# diff /etc/default/grub{,_`date +%Y%m%d`bk}
6c6
< GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rl-swap rd.lvm.lv=rl/root rd.lvm.lv=rl/swap selinux=0 ipv6.disable=1 intel_iommu=on"
---
> GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rl-swap rd.lvm.lv=rl/root rd.lvm.lv=rl/swap"
///grub.cfgは環境によってPathが異なる。指定するPathを誤ると起動できなくなるため要注意
# grub2-mkconfig -o /boot/efi/EFI/rocky/grub.cfg
# systemctl reboot

///再ログインし、適用後の確認をする
# getenforce
# ip a
# virt-host-validate
→IOMMUが"警告"から"成功"になっていること

▽ 必要サービスの有効化
# systemctl enable --now libvirtd.service ; systemctl status libvirtd.service
# systemctl enable --now cockpit.socket ; systemctl status cockpit.socket
///cockpitはソケットユニット経由でサービスユニットを都度起動し、リソースを有効活用する

▽ ゲストOS用のIOS準備
# mkdir /iso ; cd /iso
# dnf install -y wget
# wget https://ftp.iij.ad.jp/pub/linux/rocky/8.10/isos/x86_64/Rocky-8.10-x86_64-minimal.iso
# ls -l Rocky-8.10-x86_64-minimal.iso

仮想マシン作成

▽ CockpitのWebコンソールへ接続

https://IPアドレス:9090/

▽ ブリッジ作成

左ペインにある「ネットワーキング」- 「ブリッジの追加」をクリックする。

「ens160」にチェックし、「追加」ボタンをクリックする。

「bridge0」が追加されていること。

▽ 仮想マシン作成

左ペインにある「仮想マシン」- 「仮想マシンの作成」をクリックする。

仮想マシンの各項目を設定後、「作成して実行する」をクリックする。

項目 設定値
名前 任意
インストールタイプ ローカルインストールメディア
インストールソース /iso/Rocky-8.10-x86_64-minimal.iso
オペレーティングシステム Rocky Linux 8 (Green Obsidian)
ストレージ qcow2ボリュームの新規作成
ストレージの制限 10GiB
メモリ 2GiB

仮想マシンの状態が「VM作成中」から「Running」になること

▽ 仮想マシンにOSインストール

「名前」欄の仮想マシン名をクリックする。

「コンソール」-「展開」をクリックする。

通常のインストール作業を実施する。
再起動後、コンソール画面からログインし、「ip a」コマンドでIPアドレスを確認する。

仮想マシン設定

ハイパーバイザーからゲストOSに操作する。


▽コンソール接続設定

# ssh ゲストOSのIPアドレス
# cp -ip /etc/default/grub{,_`date +%Y%m%d`bk}
# ls -l /etc/default/grub{,_`date +%Y%m%d`bk}
///コンソール接続できるように設定する。追加でselinux,ipv6も無効化する。
# vi /etc/default/grub
# diff /etc/default/grub{,_`date +%Y%m%d`bk}
6c6
< GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rl-swap rd.lvm.lv=rl/root rd.lvm.lv=rl/swap selinux=0 ipv6.disable=1 console=ttyS0,115200n8r"
---
> GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rl-swap rd.lvm.lv=rl/root rd.lvm.lv=rl/swap selinux=0 ipv6.disable=1 console=tty0 console=ttyS0,115200n8r"

/// コンソール設定
console=ttyS0,115200n8r
ttyS0:シリアルポート
115200: ボーレート(通信速度)
n: パリティなし
8: データビット数が8ビット
r: Raw モードで通信し、CR をそのまま処理

# grub2-mkconfig -o /boot/grub2/grub.cfg
# systemctl reboot

# virsh list --all
 Id   名前         状態
---------------------------
 2    pigugeust1   実行中

# virsh console pigugeust1
piguoguest1 login:

Discussion