# 使用 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 系統的自動化安裝工具,透過預先定義的配置檔案,實現無人值守的系統安裝過程。 * 傳統安裝:需要點擊 30+ 次,選擇語言、時區、分區、密碼...,耗時 25 分鐘 * Kickstart 安裝:預先寫好配置,按下啟動後就能去喝咖啡,12 分鐘後回來系統已經安裝完成 ### 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 # 克隆虛擬機 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)