Appearance
跨主机克隆导致 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 三台机器逐一执行以下操作:
- 关闭虚拟机:确保虚拟机处于完全关机状态(非挂起)。
- 记录现有硬盘信息:在“编辑设置”中,记下每块数据盘的大小(如 16GB)和当前的 SCSI 节点(如 SCSI 0:1, 0:2 等)。
- 移除硬盘(极其关键的一步):
- 选中需要清理的硬盘,点击“移除”。
- 警告:弹出的对话框中,绝对不要勾选“从数据存储中删除文件”,选择“仅从虚拟机移除”。
- 依次移除所有数据盘。
- 重新添加硬盘:
- 点击“添加新设备” -> “硬盘”。
- 选择“现有硬盘 (Existing Hard Disk)”。
- 浏览数据存储,找到刚才被移除的
.vmdk文件(如xxx_1-000002.vmdk)。 - 选中并确定。
- 恢复 SCSI 节点:确保重新添加后的硬盘,其 SCSI 节点(如 SCSI 0:1)与原来完全一致。
- 保存并开机: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确认两点:
- WWN 唯一:三台机器上的所有数据盘 WWN 必须全部唯一,不再重复。
- 盘符正确:确认
/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 确认所有数据盘均无分区和文件系统信息,处于干净的裸盘状态。
经验总结与避坑指南
- 跨主机克隆需谨慎:直接复制虚拟机文件夹或跨主机克隆,会导致虚拟硬件标识(MAC 地址、磁盘 WWN、UUID)完全一致。
- 正确使用 OVF 导出导入:如果必须通过模板部署,建议使用 OVF/OVA 格式,并在导出/导入向导中勾选“重新生成 UUID”相关的选项。
- 避免挂载旧 VMDK:在部署新虚拟机时,建议直接添加全新的空白虚拟磁盘,而不是去挂载从其他主机复制过来的旧
.vmdk文件,这样能从源头上避免 UUID/WWN 冲突问题。 - 安装前必清理:任何分布式存储集群(如 Ceph)在失败重装前,务必对裸盘进行彻底的
wipefs和sgdisk --zap-all操作。
按照上述流程操作后,硬件标识唯一且磁盘干净,重新下发集群安装命令,即可顺利跨过磁盘识别这一关。
