# 使用 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)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.