KVM 建置 RHEL9 虛擬機筆記

這篇是在 RHEL 宿主機上用 KVM / libvirt 管理虛擬機的操作紀錄,涵蓋建立、網路除錯、資源監控到完整刪除。原始設計是為了跑 OpenShift 實驗環境,不過這些指令和觀念拿來管理任何 VM 都適用。


環境準備:ISO 與權限

KVM / libvirt 在 RHEL 上對路徑SELinux 非常敏感,ISO 沒放對地方就會出現 Permission denied 或 Anaconda 讀不到安裝來源。標準做法是統一放進 /var/lib/libvirt/images/

1
2
3
4
5
6
7
8
# 移至 libvirt 標準目錄
sudo mv /home/hazel/rhel9.7-boot.iso /var/lib/libvirt/images/

# 修正 qemu 使用者的讀取權限
sudo chown qemu:qemu /var/lib/libvirt/images/rhel9.7-boot.iso

# 修正 SELinux 標籤(這步沒做,啟動必報 Permission Denied)
sudo restorecon -Rv /var/lib/libvirt/images/

建立虛擬機

--location 搭配 --extra-args 做 Headless 安裝(不開圖形介面,走 serial console):

1
2
3
4
5
6
7
8
9
10
sudo virt-install \
--name rhel9-lab \
--memory 2048 \
--vcpus 2 \
--disk size=10,format=qcow2,bus=virtio \
--network network=host-bridge \
--os-variant rhel9.7 \
--location /var/lib/libvirt/images/rhel9.7-boot.iso \
--graphics none \
--extra-args 'console=ttyS0,115200n8 serial inst.text inst.dns=8.8.8.8'

透過參數指定 DNS 目前還沒找到完美解法,這邊先用 inst.dns=8.8.8.8 暫時帶過,之後再研究。


RHEL 安裝選單:SRE 視角的重點整理

Anaconda 的安裝選單項目很多,但真正值得停下來想清楚的只有幾個。

Time settings:最重要的是時區與 NTP。多台 VM 時區不統一,日誌對齊會很痛苦。建議統一設 Asia/TaipeiUTC,擇一就好,別混用。

Software selection:永遠優先選 Minimal Install。不裝多餘的東西,Attack Surface 小,啟動也快。

Installation Destination(磁碟分區):RHEL 預設使用 LVM,這讓你之後可以在不關機的情況下線上擴展空間,對維運很重要。實驗環境 10GB 先跑,不夠再加。

Kdump:Kernel Panic 時把記憶體狀態寫成 dump 檔,是分析「為什麼當機」的唯一線索。Lab 可以關掉省空間,生產環境必開。

Network / Hostname:安裝時就定好 Hostname,不要留預設的 localhost,之後在叢集裡要識別哪台機器會很痛。


隱藏的分流選單(Bottom Tabs)

virt-install console 裡,畫面下方會看到 1:main* 2:shell 3:log 4:storage-log——這是 Anaconda 內建的 tmux,可以在安裝中途切換視窗:

Tab 用途
1:main 正在操作的安裝選單
2:shell 互動式 Bash Shell,安裝出錯時切來這裡下 ip addrping 除錯
3:log 核心日誌與安裝程式執行訊息
4:storage-log 磁碟分割、掛載相關的底層訊息

切換方式:Ctrl + b 後放開再按數字(tmux 預設),或 Ctrl + Alt + a 後按數字。


網路除錯 SOP

安裝程式出現 Error checking software selection 時,大多是 VM 連不到外網、DNS 有問題、或 Host 轉發被擋。依序確認三個層面:

1. VM 內部(TTY2 Shell)

Ctrl + a(或 Ctrl + Alt + a)後按 2 進入 Shell:

1
2
3
4
5
6
7
8
# 確認是否拿到正確 IP
ip addr show enp1s0

# 測試外網連通性
ping 8.8.8.8

# 測試 DNS 解析
ping google.com

2. 宿主機層面

1
2
3
4
5
# 開啟 IP 轉發(沒開的話封包出不去)
sudo sysctl -w net.ipv4.ip_forward=1

# 暫時關閉 Firewalld 確認是否被擋(僅排障用,確認後記得開回來)
sudo systemctl stop firewalld

3. Anaconda 設定

安裝來源:mirror.stream.centos.org/9-stream/BaseOS/x86_64/os/(選 https)

網路設定:手動指定 DNS = 8.8.8.8,並記得勾選 [x] Apply configuration


磁碟與資源監控

1
2
3
4
5
6
7
8
# 查看 qcow2 實際佔用的物理空間
ls -lh /var/lib/libvirt/images/rhel9-lab.qcow2

# 查看虛擬容量 vs 實際分配
sudo qemu-img info /var/lib/libvirt/images/rhel9-lab.qcow2

# 即時查看 Block 裝置資訊
sudo virsh domblkinfo rhel9-lab --device vda --human

後續管理

1
2
3
4
5
6
7
8
# 設定隨宿主機開機自動啟動
sudo virsh autostart rhel9-lab

# 手動啟動
sudo virsh start rhel9-lab

# 重新連入 console
sudo virsh console rhel9-lab

乾淨刪除

實驗結束要完整回收空間,兩步搞定:

1
2
3
4
5
# 強制關機
sudo virsh destroy rhel9-lab

# 一次清除:XML 定義 + 硬碟檔 + UEFI 變數 + snapshot metadata
sudo virsh undefine rhel9-lab --remove-all-storage --nvram --snapshots-metadata

--remove-all-storage 會直接物理刪除 qcow2 檔,確認要刪再跑,沒有後悔機會。