KVMのインストール
ハードウェアの確認
バーチャルマシン(VM)をインストールするには最低限CPUがVT-x(Intel)又はSVM(AMD)に対応している必要があります。今回使用するIntelのNUCはPentiumN3700を搭載しており、IntelサイトにてVT-xに対応していることを確認出来ます。
仮想化パッケージのインストール
パッケージのインストールをしてから、ホストマシンの仮想化支援機能の確認を行います。VT-xに対応していなかったり、BIOS設定でOFFにしている場合はここでエラーとなります。
[root@server hoge]# dnf -y module install virt [root@server hoge]# 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 : 警告 (No ACPI DMAR table found, IOMMU either disabled in BIOS or not supported by this hardware platform) QEMU: 確認中 for secure guest support : 警告 (Unknown if this platform has Secure Guest support)
警告にあるIOMMUはCPUがVT-d(Intel)又はAMD-Viに対応していない場合に出るようですが、問題ありません。"secure guest"の部分はIntel製CPUだと出るようです。
GRUB2設定ファイルの編集
ハードウェアがVT-d(Intel)又はAMD-Viに対応している場合は、IOMMUをONするように設定ファイルを編集します。今回のハードウェアは対応していないのでこの手順は飛ばしています。
[root@server hoge]# cat /etc/default/grub
設定ファイルの変更内容はIntel製CPUの場合はGRUB_CMDLINE_LINUXの末尾に"intel_iommu=on"を追記します。AMD製CPUの場合、"amd_iommu=on"を追記します。
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="crashkernel=auto resume=/dev/mapper/cs-swap rd.lvm.lv=cs/root rd.lvm.lv=cs/swap rhgb quiet intel_iommu=on" GRUB_DISABLE_RECOVERY="true" GRUB_ENABLE_BLSCFG=true
次に、GRUB2の設定ファイルを実行します。その後、再起動を行います。
[root@server hoge]# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Adding boot menu entry for EFI firmware configuration done [root@server hoge]# reboot
サービスの起動
ここまで設定が完了したら、サービスの起動と自動起動設定を行います。
[root@server hoge]# systemctl start libvirtd [root@server hoge]# systemctl enable libvirtd
cockpitのインストール
cockpitとは
ブラウザからマシンの操作を可能にするツールです。今回は仮想マシンのOSインストールはcockpit上から行うために使用します。ここでインストールと起動、自動起動設定をしておきます。
[root@server hoge]# dnf -y install virt-install cockpit cockpit-machines [root@server hoge]# systemctl start cockpit.socket [root@server hoge]# systemctl enable cockpit.socket
firewallの設定も変更しておきます。
[root@server hoge]# firewall-cmd --add-service=cockpit --zone=home --permanent [root@server hoge]# firewall-cmd --reload
ここで"--zone=home"としている部分については、都度環境に合わせる必要があります。nucは有線と無線2つのNICが搭載されていますが、今回は有線側を"public"、無線側を"home"として設定しています。SSH通信は"home"側から行っています。
cockpitによる通信の確認
ブラウザ(FireFoxが無難)にて"http://[ホストアドレス]:9090"にアクセスするとcockpitからホストマシンの状態確認や操作が可能になります。Linux系のブラウザから接続するツールはChrome等だと動作しないことがあるため、FireFoxで利用するのがおすすめです。
cockpitの警告
初回接続時は警告が出ますが、詳細設定から接続の継続が可能です。2回目以降はそのまま接続出来ます。
OSインストール用メディアの準備
centOS-stream8インストールディスクをダウンロード
OSインストールディスクをダウンロードします。今回はダウンロードしながらインストールするbootタイプのディスクを利用します。
[root@server hoge]# mkdir /iso [root@server hoge]# curl -L -o /iso/centos8stream.iso http://ftp.riken.jp/Linux/centos/8-stream/isos/x86_64/CentOS-Stream-8-x86_64-20210506-boot.iso
しばらく待つとダウンロードが完了します。
ブリッジ接続のセットアップ
ネットワーク構成
最終的には外部からはホストマシンと仮想マシンが独立している状態を目指します。現状のネットワークを確認すると仮想化ツールインストール時に外部への通信のみを可能なvirbr0が自動作成されていますが、これだけでは不十分なので、新たなブリッジインターフェースを作成します。
[root@server hoge]# nmcli d DEVICE TYPE STATE CONNECTION virbr0 bridge 接続済み (外部) virbr0 wlp2s0 wifi 接続済み *****-*****-5G enp3s0 ethernet 接続済み enp3s0 p2p-dev-wlp2s0 wifi-p2p 切断済み -- lo loopback 管理無し -- virbr0-nic tun 管理無し --
構成例
ブリッジインターフェースを構成する対象は有線の"enp3s0"とします。現状と変更後の設定は下記のようにしました。
~現在の"enp3s0"の設定~
IPアドレス:192.168.***.20
デフォルトGW:192.168.***.1
~変更後の"enp3s0"の設定~
IPアドレス:192.168.***.21
デフォルトGW:192.168.***.1
~変更後の仮想マシンNICの設定~
IPアドレス:192.168.***.22
デフォルトGW:192.168.***.1
以上の構成を行うために新規ブリッジインターフェイスbr0を作成し、元のenp3s0を削除した後、enp3s0をbr0に含める形で再登録します。注意点としてenp3s0を使用してSSH通信をしていた場合、削除した段階(又はリブートした時)で通信が途切れます。今回はSSHはwlp2s0を使用しているため、その心配はありません。
[root@server hoge]# nmcli connection add type bridge autoconnect yes con-name br0 ifname br0 [root@server hoge]# nmcli connection modify br0 ipv4.addresses 192.168.***.21/24 ipv4.method manual [root@server hoge]# nmcli connection modify br0 ipv4.gateway 192.168.***.1 [root@server hoge]# nmcli connection modify br0 ipv4.dns 8.8.8.8 [root@server hoge]# nmcli connection del enp3s0 [root@server hoge]# nmcli connection add type bridge-slave autoconnect yes con-name enp3s0 ifname enp3s0 master br0 [root@server hoge]# reboot
再起動後に通信設定に間違いが無いか確認のために、192.168.***.21に対してSSH接続を試みて、問題無ければ設定完了です。
新規仮想マシンの作成
新規仮想マシンのスペック
今回はcentOS-stream8を導入予定です。インストール時は若干大きめのリソースを用意して後で調整することにします。
~主な設定内容~
OS種類:centos-stream8
仮想CPU数:1
RAM:2048MB
ストレージ:15GB
ネットワークインターフェース:br0
利用可能なOS種類は下記コマンドで確認出来ます。
[root@server hoge]# osinfo-query os
新規仮想マシンの作成
設定値どおりの仮想マシンを作成します。
[root@server hoge]# VM_NAME="compute-vm01" [root@server hoge]# virt-install \ --name ${VM_NAME} \ --hvm --arch x86_64 --os-type linux\ --os-variant centos-stream8 \ --vcpus 1 --ram 2048 \ --disk path=/var/lib/libvirt/images/${VM_NAME}.img,format=qcow2,size=15 --network bridge=br0 \ --graphics vnc,keymap=ja \ --noautoconsole \ --location /iso/centos8stream.iso
エラーが無ければ無事に作成されました。確認してみます。
[root@server hoge]# virsh list Id 名前 状態 ----------------------------- 1 compute-vm01 実行中 [root@server hoge]# virsh domiflist compute-vm01 インターフェース 種類 ソース モデル MAC ------------------------------------------------------------------ - bridge br0 virtio 52:54:00:1e:f6:b5
以上で仮想マシン作成は完了です。
仮想マシンのセットアップ
cockpit上でのセッティング
cockpitにてアクセスします。FireFoxにて"https://192.168.***.21"にアクセスするとログイン画面となるため、rootでログインします。"仮想マシン"項目を確認すると、作成した仮想マシンが既に起動状態かもしれんせん。私の環境ではbootマシンの設定が上手く行えていなかったのかbootエラーとなっていました。そこで、コマンド又はブラウザから強制終了します。
[root@server hoge]# virsh shutdown compute-vm01
bootディスクを選択して起動
cockpitからbootディスクに"/iso/centos8stream.iso"を指定して起動します。この時、起動順序を
①仮想ハードウェア
②bootディスク
としておけば、OSインストール後の再起動時に仮想ハードディスクから起動してくれます。
OSインストール
cockpitのVNCコンソールから通常のOSインストールと同じように操作出来ます。
以上でセットアップ完了です。SSH通信の設定を行えばターミナルから接続出来るようになります。cockpitは便利ですがセキュリティ的には弱い気がするので、インターネット環境からの接続はFirewallでブロックしておいた方が無難です。私はローカルエリアからの接続のみ許可しています。
Typoです。
[root@localhost mkimura]# firewakk-cmd –reload
bash: firewakk-cmd: コマンドが見つかりませんでした…
[root@localhost mkimura]# firewall-cmd –reload
ご指摘ありがとうございます。修正しました。