Skip to content

vSphere 克隆 Linux 虚拟机后无法启动?disk.EnableUUID 参数解决设备名漂移(Ubuntu 实测)

引言:一个常见的故障场景

你是否遇到过这样的情况:在 vSphere 上克隆或迁移了一台 Ubuntu 虚拟机后,系统突然无法启动,或者挂载的数据盘不见了?错误信息中常常出现 Gave up waiting for root deviceTimed out waiting for device dev-sdaX

究其根本,是 Linux 内核通过设备名(如 /dev/sda/dev/sdb)来识别磁盘,而 vSphere 默认不向虚拟机暴露稳定的磁盘 UUID。当虚拟机硬件配置变化(如添加/移除磁盘、改变控制器顺序)或进行克隆/迁移后,磁盘的 SCSI 顺序可能改变,导致原 /dev/sda 变成了 /dev/sdb,系统自然找不到正确的根文件系统。

本文将介绍如何通过一个 vSphere 高级配置参数 disk.EnableUUID,从根本上解决这个问题。

解决的问题

问题说明
克隆后无法启动克隆虚拟机时,磁盘的 SCSI 节点号可能重新分配,导致 fstab 中的 /dev/sda1 指向错误的设备。
设备名漂移添加或移除虚拟磁盘后,/dev/sda/dev/sdb 的对应关系可能变化。
应用依赖设备标识某些应用(如数据库、Oracle ASM、ZFS)直接读取磁盘 UUID 来识别成员盘,若无此参数将无法正常工作。
自动化运维困难Ansible、Terraform 等工具若依赖固定的磁盘标识,在环境不一致时会失败。

开启 disk.EnableUUID = TRUE 后,vSphere 会为每个虚拟磁盘生成一个固定不变的 UUID,并通过 VMware Tools 传递给 Guest OS,使其在 /dev/disk/by-uuid//dev/disk/by-id/ 路径下可见且稳定。

工作原理简述

  • 未开启该参数:Linux 内核只能看到设备名(如 sda),无法获得底层的 VMware 虚拟磁盘 UUID。
  • 开启该参数后:VMware Tools 将磁盘 UUID 写入 scsi 设备的 sysfs 属性中,系统内核可以利用该信息生成持久化的 by-uuid 和 by-id 符号链接。

如何开启:vSphere Web Console 操作步骤

  1. 关闭虚拟机(部分版本允许在线修改,但建议关机操作)。

  2. 在 vSphere Client 中,右键点击虚拟机 → 编辑设置

  3. 切换到 虚拟机选项 标签页 → 展开 高级 → 点击 配置参数 旁的 编辑配置

  4. 点击 添加参数,输入:

    • 名称:disk.EnableUUID
    • 值:TRUE

    TIP

    如果该参数已存在但值为 FALSE,修改为 TRUE 即可。

  5. 点击 确定 保存,然后 开启虚拟机

验证方法

方法一:检查 by-uuid 目录

在 Ubuntu 虚拟机内执行:

bash
ls -l /dev/disk/by-uuid/

开启前可能为空或不包含虚拟磁盘的 UUID;开启后应看到类似:

lrwxrwxrwx 1 root root 10 Jun 11 10:00 12345678-9abc-def0-1234-56789abcdef0 -> ../../sda1

方法二:检查 by-id 目录

bash
ls -l /dev/disk/by-id/

开启成功后会出现类似 wwn-0x6000c29...scsi-36000c29... 的持久化标识。

方法三:使用 blkid 命令

bash
sudo blkid

输出中应包含磁盘分区的 UUID。

方法四:查看 SCSI 设备属性(最底层验证)

bash
cat /sys/block/sda/device/vpd_pg83

开启成功后会显示磁盘的 WWN(World Wide Name)信息。

在 fstab 中使用 UUID 实现永久挂载

验证 UUID 生效后,修改 /etc/fstab 将设备名替换为 UUID:

  1. 查看目标分区的 UUID:

    bash
    blkid /dev/sda1
  2. 编辑 /etc/fstab

    bash
    sudo vim /etc/fstab

    将类似 /dev/sda1 /boot ext4 defaults 0 2 的行改为:

    UUID=12345678-9abc-def0-1234-56789abcdef0 /boot ext4 defaults 0 2
  3. 重新加载 fstab 并测试:

    bash
    sudo mount -a

注意事项与常见问题

问题解决方案
开启参数后虚拟机内部仍看不到 UUID确保已安装并运行 VMware Tools(open-vm-tools)。执行 systemctl status open-vm-tools 检查。
克隆虚拟机后 UUID 会变吗?会变。每次克隆或从模板部署时,vSphere 会生成新的磁盘 UUID。这恰好是期望行为:避免不同虚拟机磁盘 UUID 冲突。
能否在不关机的情况下添加参数?vSphere 6.7 及以上版本支持在线修改部分参数,disk.EnableUUID 通常需要重启虚拟机才能生效。
Windows 虚拟机需要吗?不需要。Windows 使用磁盘签名(Disk Signature)识别磁盘,不受此参数影响。
对性能有影响吗?无。该参数仅影响信息暴露方式,不改变 I/O 路径。

总结

在 vSphere 环境中,为 Ubuntu(及其他 Linux 发行版)虚拟机开启 disk.EnableUUID = TRUE 是一个极低成本、高收益的配置变更。它能有效避免因设备名漂移导致的启动失败、挂载错误等问题,是构建可靠虚拟化基础设施的佳实践之一。

一句话建议:从今天起,对所有 Linux 虚拟机默认开启 disk.EnableUUID,并在 /etc/fstab 中使用 UUID 进行挂载——这将为你节省大量排障时间。

延伸阅读

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