适用环境:

* PVE 或 LXC 宿主环境
* 安装分区方案为 **LVM(Logical Volume Manager)+ XFS 文件系统**
* 输出 qcow2 模板文件

---

## **1. 创建 qcow2 磁盘**

```bash
qemu-img create -f qcow2 /var/lib/libvirt/images/RockyLinux9-Template.qcow2 20G
```

> qcow2 支持稀疏分配,不会一次性占满空间。

---

## **2. virt-install 安装 Rocky Linux 9**

```bash
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!**
在虚拟机内执行:

```bash
sync
poweroff
```

保证 LVM+XFS 日志完全写盘。

---

## **4. 清理模板(virt-sysprep)**

```bash
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**

```bash
virt-rescue -a /var/lib/libvirt/images/RockyLinux9-Template.qcow2
```

系统会给一个 shell,按步骤执行:

### **5.1 激活 VG**

```bash
lvm vgscan
lvm vgchange -ay
```

> 比如卷组名是 `rl` 或 `rocky_vg`,你会看到 `/dev/mapper/rl-root` 这样的 LV。

### **5.2 修复 XFS**

```bash
xfs_repair -v /dev/mapper/<VG名>-root
```

如果日志损坏无法恢复:

```bash
xfs_repair -L /dev/mapper/<VG名>-root
```

> `-L` 会丢弃未写入日志数据,但能修复文件系统。

### **5.3 检查其他 LV**

如果 `/home`、`/var` 等单独挂载并使用 XFS,也需要逐个修复:

```bash
xfs_repair -v /dev/mapper/<VG名>-home
```

修复完后 `exit` 退出 virt-rescue。

---

## **6. 压缩并优化 qcow2 模板**

```bash
qemu-img convert -O qcow2 -c \
  /var/lib/libvirt/images/RockyLinux9-Template.qcow2 \
  /var/lib/libvirt/images/RockyLinux9-Template-clean.qcow2
```

---

## **7. 克隆或分发模板**

克隆:

```bash
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` 跑一次:

   ```bash
   lvm vgscan
   lvm vgchange -ay
   xfs_repair -v /dev/mapper/<VG名>-root
   ```
3. 如果需要快速打包,可以在虚拟机内部先冻结文件系统:

   ```bash
   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`。