适用环境:
- PVE 或 LXC 宿主环境
- 安装分区方案为 LVM(Logical Volume Manager)+ XFS 文件系统
- 输出 qcow2 模板文件
1. 创建 qcow2 磁盘
qemu-img create -f qcow2 /var/lib/libvirt/images/RockyLinux9-Template.qcow2 20G
qcow2 支持稀疏分配,不会一次性占满空间。
2. virt-install 安装 Rocky Linux 9
virt-install \ --name=RockyLinux9-Template \ --ram=4096 \ --vcpus=2 \ --disk path=/var/lib/libvirt/images/RockyLinux9-Template.qcow2,format=qcow2,bus=virtio \ --os-variant=rocky9 \ --network network=default,model=virtio \ --graphics vnc \ --location=http://download.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os/ \ --extra-args="inst.ks=http://<你的kickstart> console=ttyS0"
Kickstart 或手动分区要求:
-
分区使用 LVM,例如:
-
pv
→vg_rocky
→lv_root
(挂载/
) +lv_swap
- 根分区使用 XFS(默认)
3. 安装完成后必须 clean shutdown
不要 virsh destroy!
在虚拟机内执行:
sync poweroff
保证 LVM+XFS 日志完全写盘。
4. 清理模板(virt-sysprep)
virt-sysprep -a /var/lib/libvirt/images/RockyLinux9-Template.qcow2 \ --enable bash-history,logfiles,net-hostname,net-hwaddr,ssh-userdir,customize
会清理:
- 主机名
- 网卡 MAC
- SSH host keys
- 历史日志
5. 检查 LVM + XFS 一致性
这里是关键!
因为我们是 LVM + XFS,必须先激活 VG,然后对 LV 做 xfs_repair
。
进入 virt-rescue
virt-rescue -a /var/lib/libvirt/images/RockyLinux9-Template.qcow2
系统会给一个 shell,按步骤执行:
5.1 激活 VG
lvm vgscan lvm vgchange -ay
比如卷组名是
rl
或rocky_vg
,你会看到/dev/mapper/rl-root
这样的 LV。
5.2 修复 XFS
xfs_repair -v /dev/mapper/<VG名>-root
如果日志损坏无法恢复:
xfs_repair -L /dev/mapper/<VG名>-root
-L
会丢弃未写入日志数据,但能修复文件系统。
5.3 检查其他 LV
如果 /home
、/var
等单独挂载并使用 XFS,也需要逐个修复:
xfs_repair -v /dev/mapper/<VG名>-home
修复完后 exit
退出 virt-rescue。
6. 压缩并优化 qcow2 模板
qemu-img convert -O qcow2 -c \ /var/lib/libvirt/images/RockyLinux9-Template.qcow2 \ /var/lib/libvirt/images/RockyLinux9-Template-clean.qcow2
7. 克隆或分发模板
克隆:
virt-clone --original RockyLinux9-Template --name RockyLinux9-VM1 --file /var/lib/libvirt/images/RockyLinux9-VM1.qcow2
8. LVM + XFS 镜像打包注意事项
- 绝对不要 destroy 强制关机,要
poweroff
。 - 如果必须强制关机或快照,打包前用
virt-rescue
跑一次:
lvm vgscan lvm vgchange -ay xfs_repair -v /dev/mapper/<VG名>-root
- 如果需要快速打包,可以在虚拟机内部先冻结文件系统:
xfs_freeze -f / sync xfs_freeze -u /
然后再 virsh suspend 或 qemu-img convert。
关键总结
- LVM + XFS 模板镜像比直接分区更容易出问题,因为需要先激活 VG 再修复 XFS。
- 模板打包前必须经过:
- clean shutdown
- virt-sysprep 清理
- virt-rescue 激活 LVM + xfs_repair
这样做可以彻底避免第二次启动报错 Structure needs cleaning
。