Skip to content

跨主机克隆导致 Ceph 磁盘 WWN 冲突的排查与解决 ​

跨主机克隆导致 Ceph 磁盘 WWN 冲突示意图

背景与问题现象 ​

在基于 OVF 模板或直接跨 ESXi 主机复制文件夹的方式批量部署虚拟机时,遇到了一个经典的底层存储标识冲突问题。

现象描述: 在使用 lsblk 命令检查节点磁盘信息时,发现新部署的节点(如 192.168.8.235、.236、.237)上,所有的 16GB 数据盘的 WWN(World Wide Name)完全一致。

text
# 192.168.8.235 节点输出示例
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0   16G  0 disk
├─sdb1   8:17   0  100M  0 part
...

通过查看磁盘 WWN 可以更直观地看到冲突:

bash
# 查看磁盘 WWN 信息
for disk in /dev/sd{b,c,d,e,f}; do
    echo -n "$disk: "
    /lib/udev/scsi_id --whitelisted --device=$disk
done

输出结果中,三台机器上的对应磁盘 WWN 完全一致,例如均为 wwn-0x6000c2964f24f32d82a275484614e171。

对比正常集群: 作为对比,之前正常部署的 192.168.3.x 集群,每台机器的每块盘 WWN 都是唯一的。

根本原因: 由于虚拟机是跨主机部署(直接复制 .vmdk 文件或未经处理地克隆),虚拟磁盘底层的 UUID 和 WWN 被原封不动地带到了新节点上。Ceph 等分布式存储在扫描磁盘时,无法区分这些具有相同硬件标识的磁盘到底属于哪个节点,从而直接导致集群初始化失败。

解决思路 ​

核心原则:不要试图在 Linux 操作系统内部去修改 WWN/Serial。 这些标识是由虚拟化平台(ESXi)通过虚拟 SCSI 控制器直接传递给操作系统的。正确的做法是在 vSphere UI 中强制重新生成。

VMware 的虚拟磁盘 WWN 是绑定在 .vmdk 底层配置中的。只要将磁盘从虚拟机配置中移除,再重新挂载给该虚拟机,VMware 就会重新生成一个唯一的 WWN 和 Serial。

具体操作步骤 ​

第一步:通过“移除并重新添加”重新生成 WWN ​

针对 192.168.8.235、.236、.237 三台机器逐一执行以下操作:

  1. 关闭虚拟机:确保虚拟机处于完全关机状态(非挂起)。
  2. 记录现有硬盘信息:在“编辑设置”中,记下每块数据盘的大小(如 16GB)和当前的 SCSI 节点(如 SCSI 0:1, 0:2 等)。
  3. 移除硬盘(极其关键的一步):
  • 选中需要清理的硬盘,点击“移除”。
  • 警告:弹出的对话框中,绝对不要勾选“从数据存储中删除文件”,选择“仅从虚拟机移除”。
  • 依次移除所有数据盘。
  1. 重新添加硬盘:
  • 点击“添加新设备” -> “硬盘”。
  • 选择“现有硬盘 (Existing Hard Disk)”。
  • 浏览数据存储,找到刚才被移除的 .vmdk 文件(如 xxx_1-000002.vmdk)。
  • 选中并确定。
  1. 恢复 SCSI 节点:确保重新添加后的硬盘,其 SCSI 节点(如 SCSI 0:1)与原来完全一致。
  2. 保存并开机:VMware 在重新挂载这些 VMDK 时,会自动为它们分配全新的、唯一的 WWN。

补充技巧

如果在 UI 中反复移除重加后,Linux 系统内查看 WWN 依然没变,可以尝试将整个 SCSI 控制器也一并移除并重新添加,这能强制 ESXi 重新枚举整个总线并生成全新的 WWN。

第二步:验证 WWN 唯一性 ​

重新开机后,登录操作系统,再次查看磁盘 WWN:

bash
# 查看所有数据盘的 WWN
for disk in /dev/sd{b,c,d,e,f}; do
    echo -n "$disk: "
    /lib/udev/scsi_id --whitelisted --device=$disk
done

确认两点:

  1. WWN 唯一:三台机器上的所有数据盘 WWN 必须全部唯一,不再重复。
  2. 盘符正确:确认 /dev/sdb 到 /dev/sdf 的映射大小一致(均为 16.0GiB),避免盘符顺序错乱。

第三步:彻底清理磁盘残留数据 ​

由于之前集群安装失败过,磁盘上极有可能残留了 Ceph 的 LVM 结构、分区表或文件系统签名。必须在每台机器上执行清理,否则即使 WWN 变了,重新安装依然会报错。

危险操作提示

执行以下命令前,请务必通过 lsblk 确认盘符(如 /dev/sdb - /dev/sdf)确实是你的裸数据盘,切勿作用于系统盘!

bash
# 假设 sdb 到 sdf 是你的 5 块数据盘
for disk in /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf; do
    echo "Cleaning $disk ..."
    # 擦除文件系统
    wipefs -a $disk
    # 擦除分区表
    sgdisk --zap-all $disk
    # 擦除 Ceph 可能留下的 LVM 或磁盘头部
    dd if=/dev/zero of=$disk bs=1M count=100 status=progress
done

清理完成后,再次运行 lsblk 确认所有数据盘均无分区和文件系统信息,处于干净的裸盘状态。

经验总结与避坑指南 ​

  1. 跨主机克隆需谨慎:直接复制虚拟机文件夹或跨主机克隆,会导致虚拟硬件标识(MAC 地址、磁盘 WWN、UUID)完全一致。
  2. 正确使用 OVF 导出导入:如果必须通过模板部署,建议使用 OVF/OVA 格式,并在导出/导入向导中勾选“重新生成 UUID”相关的选项。
  3. 避免挂载旧 VMDK:在部署新虚拟机时,建议直接添加全新的空白虚拟磁盘,而不是去挂载从其他主机复制过来的旧 .vmdk 文件,这样能从源头上避免 UUID/WWN 冲突问题。
  4. 安装前必清理:任何分布式存储集群(如 Ceph)在失败重装前,务必对裸盘进行彻底的 wipefs 和 sgdisk --zap-all 操作。

按照上述流程操作后,硬件标识唯一且磁盘干净,重新下发集群安装命令,即可顺利跨过磁盘识别这一关。

最后更新2026/10/20 16:20
如果你觉得这篇文章有帮助,或者想聊聊技术、工作,欢迎通过下面方式联系我:
contact fishfinal