# 使用 KVM + Kickstart 部署 Rocky Linux 虛擬機
## 概述
本文將學習如何使用 KVM (Kernel-based Virtual Machine) 結合 Kickstart 自動化工具,快速建立一個可以透過帳號密碼登入的 Rocky Linux 測試虛擬機。
## 為什麼需要這個教學?
#### 重複性工作的困擾
在企業環境或個人學習中,經常需要快速建立測試環境。傳統的手動安裝方式不僅耗時,還容易因人為操作產生配置不一致的問題:
* 頻繁建立和銷毀測試環境 - 每次手動安裝要花 20-30 分鐘
* 確保多個虛擬機配置的一致性 - 人工操作容易出錯
* 快速部署標準化的系統環境 - 批次部署時效率低落
* 自動化測試和持續整合流程 - CI/CD 需要可重複的環境
#### 閒置資源
此外,當伺服器的硬體資源有閒置時,透過 KVM 虛擬化技術可以:
* 避免資源浪費:一台配置較高的伺服器(如 64GB RAM、16 核心)如果只跑單一系統,可能只使用了 20-30% 的資源
* 降低硬體成本:不需要為每個應用或測試環境購買獨立的物理機器
## 什麼是 KVM (Kernel-based Virtual Machine)
Linux 內核的虛擬化模組,結合 `qemu-kvm` 虛擬化模擬器和 `libvirt` 管理層,提供虛擬化解決方案。
### KVM 架構圖
```
┌─────────────────────────────────────────┐
│ 👤 管理員 │
│ 使用 virt-manager / virsh │
└──────────────────┬──────────────────────┘
│
┌──────────────────▼──────────────────────┐
│ 📋 libvirt (管理層) │
│ "虛擬機的管家" │
│ • 建立/啟動/停止虛擬機 │
│ • 管理網路和儲存 │
└──────────────────┬──────────────────────┘
│
┌──────────────────▼──────────────────────┐
│ 🖥️ QEMU-KVM (虛擬化層) │
│ "虛擬電腦製造機" │
│ • 模擬硬體(磁碟、網卡、顯示卡) │
│ • 呼叫 KVM 執行虛擬機 │
└──────────────────┬──────────────────────┘
│
┌──────────────────▼──────────────────────┐
│ ⚡ KVM (Linux 核心模組) │
│ "CPU 加速器" │
│ • 讓虛擬機直接用 CPU 執行 │
│ • 接近原生速度(90%+) │
└──────────────────┬──────────────────────┘
│
┌──────────────────▼──────────────────────┐
│ 💻 物理硬體 │
│ CPU (Intel VT-x / AMD-V) │
│ 記憶體 / 硬碟 / 網卡 │
└─────────────────────────────────────────┘
```
## 什麼是 Kickstart
### Kickstart
Red Hat 系統的自動化安裝工具,透過預先定義的配置檔案,實現自動化的系統安裝過程。
* 傳統安裝:需要點擊或輸入多次,ex. 選擇語言、時區、分區、密碼...,耗時 25 分鐘
* Kickstart 安裝:預先寫好配置,按下啟動後就能讓系統開始執行安裝流程
### Kickstart 架構圖
```
┌─────────────────────────────────────────────────────────────┐
│ Kickstart 自動化安裝流程 │
└─────────────────────────────────────────────────────────────┘
準備階段 安裝階段 完成階段
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ │ │ │ │ │
│ 1. 建立 │ │ 3. 讀取 │ │ 5. 完成 │
│ ks.cfg │─────▶│ ks.cfg │─────▶│ 自動重啟 │
│ 配置檔 │ │ 自動安裝 │ │ 系統就緒 │
│ │ │ │ │ │
└─────────────┘ └─────────────┘ └─────────────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ │ │ │
│ 2. 注入到 │ │ 4. 無人值守│
│ 安裝媒體 │ │ 完全自動化 │
│ (ISO/網路) │ │ │
│ │ │ │
```
### Kickstart 配置檔案 (ks.cfg) 結構
```
┌─────────────────────────────────────────────────────────┐
│ ks.cfg 檔案結構 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 📝 系統設定區 │ │
│ │ • 語言、鍵盤、時區 │ │
│ │ • root 密碼、使用者帳號 │ │
│ │ • 防火牆、SELinux │ │
│ ├─────────────────────────────────────────────────┤ │
│ │ lang en_US.UTF-8 │ │
│ │ keyboard us │ │
│ │ timezone Asia/Taipei │ │
│ │ rootpw --iscrypted $6$... │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 🌐 網路設定區 │ │
│ │ • 靜態 IP 或 DHCP │ │
│ │ • 主機名稱 │ │
│ │ • DNS 伺服器 │ │
│ ├─────────────────────────────────────────────────┤ │
│ │ network --bootproto=static │ │
│ │ --ip=192.168.1.100 │ │
│ │ --netmask=255.255.255.0 │ │
│ │ network --hostname=myserver │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 💾 磁碟分區區 │ │
│ │ • 清除現有分區 │ │
│ │ • 建立新分區 (/boot, /, swap) │ │
│ │ • LVM 設定 │ │
│ ├─────────────────────────────────────────────────┤ │
│ │ clearpart --all --initlabel │ │
│ │ part /boot --size=1024 │ │
│ │ part / --size=20480 --fstype=xfs │ │
│ │ part swap --size=2048 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 📦 套件安裝區 │ │
│ │ • 選擇要安裝的軟體群組 │ │
│ │ • 額外套件 │ │
│ ├─────────────────────────────────────────────────┤ │
│ │ %packages │ │
│ │ @core │ │
│ │ @base │ │
│ │ vim │ │
│ │ wget │ │
│ │ %end │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 🔧 安裝後腳本區 (選用) │ │
│ │ • 自訂配置 │ │
│ │ • 安裝額外軟體 │ │
│ ├─────────────────────────────────────────────────┤ │
│ │ %post │ │
│ │ echo "安裝完成!" > /root/install.log │ │
│ │ systemctl enable httpd │ │
│ │ %end │ │
│ └─────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
```
ks.cfg 就像是「安裝說明書」,只需要寫一次,之後就能重複使用,確保每次安裝完全一致!
## 準備工作
了解核心技術後,開始準備實作環境。按照以下檢查清單,確保所有前置條件都已就緒。
#### 硬體需求
- [ ] CPU 支援虛擬化(Intel VT-x 或 AMD-V)
- [ ] 確定可用記憶體
- [ ] 確定可用硬碟空間
#### 系統需求
```bash
# 檢查 CPU 虛擬化支援
grep -E -c '(vmx|svm)' /proc/cpuinfo
>>>
輸出 > 0 表示支援
lscpu | grep Virtualization
>>>
Virtualization: VT-x # Intel
Virtualization: AMD-V # AMD
# 檢查 KVM 模組
lsmod | grep kvm
>>>
kvm_intel 348160 0
kvm 970752 1 kvm_intel
irqbypass 16384 1 kvm
```
#### OS
``` bash
# 安裝 Rocky Linux 9.6 最小安裝 ISO 為例
mkdir -p /data/kvm/image
# rocky linux iso 檔網址參考: https://rockylinux.org/zh-TW/download
wget -P /data/kvm/image https://download.rockylinux.org/pub/rocky/10/isos/x86_64/Rocky-10.0-x86_64-minimal.iso
# 確定是否下載
ls -lh /data/kvm/image/Rocky-9.6-x86_64-minimal.iso
```
#### 安裝 KVM 虛擬化環境
```bash
# 安裝核心套件
# qemu-kvm: KVM 虛擬化核心
# libvirt: 虛擬化管理 API
# virt-install: 命令列安裝工具
# virt-manager: 圖形化管理工具(選用)
# bridge-utils: 網路橋接工具
dnf install -y qemu-kvm libvirt virt-install virt-manager bridge-utils
# 啟動並啟用 libvirt 服務
systemctl enable --now libvirtd
# 驗證安裝
virsh version
```
## 建立 Kickstart 配置檔
環境準備完成後,接下來是編寫 Kickstart 配置檔,這個檔案將定義虛擬機的所有安裝參數。
#### 建立工作目錄
首先,為我們的測試虛擬機建立專屬目錄:
```bash
mkdir -p /data/kvm/test
cd /data/kvm/test
```
目錄結構建議:建議為每個虛擬機建立獨立目錄,方便管理配置檔、磁碟映像和日誌。
#### 編寫 kickstart file
建立 ks.cfg, 完整配置檔內容(請根據你的實際環境調整):
```bash
# ============================================
# Rocky Linux Kickstart 自動安裝配置檔
# ============================================
#系統安裝設定
cdrom # 使用光碟安裝
text # 文字模式安裝
lang en_US.UTF-8 # 語系
keyboard us # 鍵盤配置
timezone Asia/Taipei --utc # 時區
timesource --ntp-server=<your ntp server>
# --------------------------------------------
# 網路與主機設定
# 重要:請根據你的實際網路環境修改以下參數
# --------------------------------------------
network --device=link \
--bootproto=static \
--ip=192.168.122.100 \
--netmask=255.255.255.0 \
--gateway=192.168.122.1 \
--nameserver=8.8.8.8 \
--noipv6 \
--activate
network --hostname=test
# --------------------------------------------
# 使用者設定
# 請務必修改密碼!
# --------------------------------------------
# 設定 root 密碼
rootpw --plaintext <root_password>
# 建立一般使用者並加入 wheel 群組(可使用 sudo)
user --name=testr-user --groups=wheel --plaintext --password=<test_user_password>
# --------------------------------------------
# 系統服務
# --------------------------------------------
services --enabled=sshd,chronyd
# --------------------------------------------
# 磁碟分割設定
# --------------------------------------------
bootloader --location=mbr
clearpart --all --initlabel
autopart --type=lvm
reboot
# --------------------------------------------
# 套件安裝
# --------------------------------------------
%packages
@^minimal-environment # 最小化安裝環境
qemu-guest-agent # QEMU 客戶端代理(改善虛擬機效能)
%end
# --------------------------------------------
# 安裝後執行腳本
# 這個區塊會在系統安裝完成後自動執行
# --------------------------------------------
%post --log=/root/ks-post.log
# 安裝 EPEL 儲存庫
dnf install -y epel-release
# 安裝必要套件
dnf install -y cloud-utils-growpart
# 啟用服務
systemctl enable qemu-guest-agent
# SSH 設定:允許密碼登入,禁止 root 直接登入
sed -ri 's/^#?PasswordAuthentication .*/PasswordAuthentication yes/' /etc/ssh/sshd_config
sed -ri 's/^#?PermitRootLogin .*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
systemctl restart sshd
echo "Kickstart finished (STATIC IP)" > /root/kickstart.log
%end
```
* 務必修改 <root_password> 和 <test_user_password>
* 網路設定說明
* 如果使用 libvirt 預設網路(default),閘道通常是 192.168.122.1
* IP 範圍通常是 192.168.122.2-254
## 建立虛擬機
配置檔準備完成後,現在我們可以開始建立虛擬機了!這一步會自動完成所有安裝流程。
```bash
cd /data/kvm/test #在ks.cfg地位置
virt-install \
--name test \
--ram 8192 \
--vcpus 4 \
--disk path=/data/kvm/test/test.qcow2,size=100,format=qcow2 \
--location /data/kvm/image/Rocky-9.6-x86_64-minimal.iso \
--network network=default,model=virtio \
--graphics none \
--initrd-inject=/data/kvm/test/ks.cfg \
--extra-args="inst.ks=file:/ks.cfg console=ttyS0" \
--autostart 2>&1 | tee ./virt-install.log
```
參數說明
| 參數 | 說明 | 備註 |
| ----------------- | --------------- | ------------------ |
| `--name test` | 虛擬機名稱 | 用於 `virsh` 命令管理 |
| `--ram 8192` | 記憶體大小(MB) | 8192 = 8GB |
| `--vcpus 4` | CPU 核心數量 | 根據需求調整 |
| `--disk` | 虛擬硬碟設定 | `qcow2` 格式支援快照 |
| `--location` | ISO 映像檔路徑 | 安裝來源 |
| `--network` | 網路設定 | 使用 `virtio` 驅動效能最佳 |
| `--graphics none` | 不使用圖形介面 | 透過文字 console 安裝 |
| `--initrd-inject` | 注入 Kickstart 檔案 | ⚠️ 關鍵步驟! |
| `--extra-args` | 核心啟動參數 | 告訴安裝程式 `ks.cfg` 位置 |
| `--autostart` | 開機自動啟動 | 宿主機重啟時自動啟動此 VM |
| `2>&1 \| tee` | 記錄安裝日誌 | 方便除錯 |
### 安裝過程觀察
執行命令後,你會看到類似以下的輸出:
```
Starting install...
Retrieving file vmlinuz... | 10 MB 00:00:01
Retrieving file initrd.img... | 85 MB 00:00:08
Allocating 'test.qcow2' | 100 GB 00:00:00
Creating domain...
[ 0.000000] Booting Linux...
[ 0.123456] Starting installer...
[ 1.234567] Running Kickstart installation...
```
#### 如何知道安裝完成?
當看到虛擬機自動重啟
或者使用 `virsh list` 看到狀態變為 running
日誌檔案停止更新
## 驗證虛擬機設定
* 安裝完成後,讓我們確認虛擬機的基本資訊:
```bash
virsh dominfo test
```
* 測試 SSH 連線
測試是否能成功連線到虛擬機
```bash
# 使用我們在 ks.cfg 中建立的使用者登入
ssh test-user@192.168.122.100
```
## 虛擬機日常管理
虛擬機建立完成後,你需要掌握這些基本操作指令來管理它。
#### 查看與監控
```bash
# 列出所有虛擬機(包含關機的)
virsh list --all
# 查看虛擬機詳細資訊
virsh dominfo test
```
#### 網路管理
```bash
# 查看虛擬網路列表
virsh net-list
# 查看虛擬機網路介面
virsh domiflist test
```
#### 電源管理
```bash
# 正常關機(需要 VM 內部配合,較安全)
virsh shutdown test
# 啟動虛擬機
virsh start test
# 重新啟動
virsh reboot test
# 強制關機(類似拔電源,不建議常用)
virsh destroy test
```
#### 虛擬機生命週期管理
```bash
# 停止虛擬機(會保留設定)
virsh destroy test
# 刪除虛擬機定義(不會刪除磁碟檔案)
virsh undefine test
# 刪除虛擬機並移除所有儲存
virsh undefine test --remove-all-storage
# clone 虛擬機
virt-clone \
--original test \
--name test-clone \
--file /data/kvm/test/test-clone.qcow2
```
#### console 連線
當 SSH 無法連線時,可以使用 console 直接進入虛擬機:
```bash
# 連接到虛擬機的文字 console
virsh console test
```
## 進階操作:磁碟擴充
隨著使用時間增長,你可能需要為虛擬機增加磁碟空間。以下是完整的擴充流程。
1. 主機端操作
```bash
# 關機虛擬機
virsh shutdown test
# 等待虛擬機完全關閉
virsh list --all
# 確認 State 為 shut off
# 方法一,方法二的前提是主機端有多餘的磁碟空間
# 方法一: 擴充磁碟 (+20GB)
qemu-img resize /data/kvm/test/test.qcow2 +20G
# 方法二: 或指定總大小
qemu-img resize /data/kvm/test/test.qcow2 120G
# 檢查磁碟資訊
qemu-img info /data/kvm/test/test.qcow2
# 重新啟動虛擬機
virsh start test
```
2. 虛擬機內操作
SSH 登入虛擬機後,執行以下操作:
```
# 登入虛擬機
ssh test-user@192.168.122.100
# 切換到 root(或使用 sudo)
sudo -i
# 查看目前磁碟狀況
lsblk
>>>
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 120G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 99G 0 part
├─rl_test-root 253:0 0 97G 0 lvm /
└─rl_test-swap 253:1 0 2G 0 lvm [SWAP]
```
開始擴充:
```bash
# 步驟 1:擴充分割區(假設是 /dev/vda2)
growpart /dev/vda 2
# 步驟 2:查看 LVM 結構
pvs # 查看實體磁碟區
vgs # 查看磁碟區群組
lvs # 查看邏輯磁碟區
# 步驟 3:擴充實體磁碟區
pvresize /dev/vda2
# 步驟 4:擴充邏輯磁碟區(擴充 root 分區)
# 使用所有可用空間
lvextend -l +100%FREE /dev/rl_test/root
# 步驟 5:擴充檔案系統
# 對於 XFS 檔案系統(Rocky Linux 預設)
xfs_growfs /
```
驗證擴充結果
```
lsblk
df -h
```
REF:
* [KVM 官網](https://linux-kvm.org/page/Main_Page)