适用环境:

  • 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,例如:

  • pvvg_rockylv_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

比如卷组名是 rlrocky_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 镜像打包注意事项

  1. 绝对不要 destroy 强制关机,要 poweroff
  2. 如果必须强制关机或快照,打包前用 virt-rescue 跑一次:
lvm vgscan
lvm vgchange -ay
xfs_repair -v /dev/mapper/<VG名>-root
  1. 如果需要快速打包,可以在虚拟机内部先冻结文件系统:
xfs_freeze -f /
sync
xfs_freeze -u /

然后再 virsh suspend 或 qemu-img convert。


关键总结

  • LVM + XFS 模板镜像比直接分区更容易出问题,因为需要先激活 VG 再修复 XFS。
  • 模板打包前必须经过:
  1. clean shutdown
  2. virt-sysprep 清理
  3. virt-rescue 激活 LVM + xfs_repair

这样做可以彻底避免第二次启动报错 Structure needs cleaning


  • 无标签