目錄

自定義 QCOW2 映像檔

virt-customize 是 libguestfs 生態系的離線映像客製化工具,可安裝套件、修改設定與注入 SSH 公鑰。本文示範 QCOW2 格式;離線是指不啟動目標 VM,不代表安裝套件時不需要網路。

使用前提

  • 以下範例使用 RHEL 9 x86_64 主機與同架構的 RHEL 9 映像,主機已啟用適用的 BaseOS/AppStream 套件庫。
  • 修改前必須完全關閉 VM,且不可與其他工具同時修改同一映像。
  • 工具會直接修改指定映像,應先建立工作副本。
  • 主機與映像內的套件來源分別管理;RHEL 映像不會自動繼承主機的訂閱。

安裝與準備

在具備可用套件庫的主機安裝工具,並記錄版本:

1
2
3
4
5
sudo dnf install -y guestfs-tools libguestfs-xfs qemu-img
virt-customize --version
rpm -q guestfs-tools libguestfs
qemu-img convert -f qcow2 -O qcow2 ./base.qcow2 ./custom.qcow2
IMAGE=./custom.qcow2

base.qcow2 是準備好的來源映像,custom.qcow2 必須使用尚未存在的新檔名。以下指令於同一個 Shell 執行,皆修改工作副本。

常用操作

1. 設定 root 密碼

需要密碼登入時才設定。事先安全建立權限為 0600 的密碼檔,第一行放置密碼,且不要納入版本控制:

1
virt-customize -a "$IMAGE" --root-password file:./root-password.txt

不要直接使用 password:root;命令列明文密碼可能出現在程序列表與 Shell 歷史中。

2. 執行特定指令

--run-command 在 appliance 的 chroot 環境內執行,不是完整啟動目標 VM。需要正常開機環境的工作,可使用 --firstboot-command。

1
virt-customize -a "$IMAGE" --run-command 'mkdir -p /opt/bootstrap'

3. 上傳自訂套件庫

以下假設主機已有有效的 custom.repo,且來源適用於目標 OS、具備必要的存取權限。不要直接覆寫 RHSM 管理的 redhat.repo。

1
2
3
4
virt-customize -a "$IMAGE" \
  --upload ./custom.repo:/etc/yum.repos.d/custom.repo \
  --chown 0:0:/etc/yum.repos.d/custom.repo \
  --chmod 0644:/etc/yum.repos.d/custom.repo

4. 安裝特定套件

使用映像內的套件管理器與套件庫,透過 appliance 連線取得套件。RHEL 須有可用且符合授權的內容來源;若安裝 htop,通常還需要 EPEL。

1
virt-customize -a "$IMAGE" --install vim-enhanced,git,wget

5. 設定時區

1
virt-customize -a "$IMAGE" --timezone Asia/Taipei

6. 注入 SSH 公鑰

範例中的 admin 必須已存在於映像內。若帳號由 cloud-init 首次開機時建立,應改由 cloud-init 設定金鑰。注入金鑰不會自動放寬 SSH 登入政策。

1
virt-customize -a "$IMAGE" --ssh-inject admin:file:./id_ed25519.pub

7. SELinux 與開機驗證

新版工具預設自動處理 SELinux 標籤,通常不必額外指定 --selinux-relabel;現行上游已將它列為相容性空操作,實際行為請查閱安裝版本的手冊。

首次開機可能需要重新標記 SELinux。若使用 cloud-init,還應確認其密碼、SSH 與時區設定是否影響客製化結果。在啟動後的 VM 內檢查:

1
2
3
timedatectl
rpm -q vim-enhanced git wget
getenforce

除上述檢查外,還應實際測試 SSH 登入、所需服務,並確認是否出現 SELinux 拒絕紀錄。