📋 问题描述

在使用 VMware 虚拟机时,我们经常需要创建快照来保存系统的特定状态。但是,当我们从指定快照恢复启动后,虚拟机的系统时间会自动同步到当前真实时间,而不是我们期望的快照时刻的时间。

典型场景:

  • 测试软件在不同时间的行为
  • 验证许可证过期后的功能
  • 复现特定时间点的问题
  • 教学演示需要固定时间环境

为了解决这个问题,我们需要禁用 VMware 的时间同步功能,并设置固定的启动时间。

🔧 解决方案

步骤 1:关闭 Windows 网络时间同步

首先,进入虚拟机内的 Windows 系统,关闭从网络自动同步时间的功能:

  1. 右键点击任务栏右下角的时间
  2. 选择”调整日期/时间”
  3. 关闭”自动设置时间”选项

关闭网络时间同步

注意:此步骤确保操作系统不会主动从网络时间服务器同步时间。

步骤 2:修改 VMware 配置文件

找到虚拟机的配置文件(.vmx 文件),通常位于虚拟机所在目录,文件名与虚拟机名称相同。

2.1 禁用时间同步

.vmx 文件末尾添加以下配置:

time.synchronize.continue = "FALSE"
time.synchronize.restore = "FALSE"
time.synchronize.resume.disk = "FALSE"
time.synchronize.shrink = "FALSE"
time.synchronize.tools.startup = "FALSE"

配置说明:

  • time.synchronize.continue:禁用持续的时间同步
  • time.synchronize.restore:禁用从快照恢复时的时间同步
  • time.synchronize.resume.disk:禁用从磁盘恢复时的时间同步
  • time.synchronize.shrink:禁用磁盘收缩时的时间同步
  • time.synchronize.tools.startup:禁用 VMware Tools 启动时的时间同步

2.2 设置固定启动时间

添加以下配置来设置虚拟机启动时的初始时间:

rtc.startTime = "1780252200"

参数说明:

  • rtc.startTime:设置虚拟机 RTC(实时时钟)的启动时间
  • 后面的数字是 Unix 时间戳(从 1970年1月1日 00:00:00 UTC 开始的秒数)

2.3 获取时间戳

你需要将期望的时间转换为 Unix 时间戳。可以使用以下在线工具:

示例:

  • 2026-05-30 12:30:00 → 1780252200
  • 2025-01-01 00:00:00 → 1735689600
  • 2024-12-25 08:00:00 → 1735113600

步骤 3:创建新快照

完成配置文件修改后:

  1. 保存并关闭 .vmx 文件
  2. 启动虚拟机(此时时间应该为你设置的时间)
  3. 验证时间是否正确
  4. 创建一个新的快照,保存这个状态

现在,每次从这个快照恢复时,虚拟机的时间都会保持在你设定的时刻。

⚙️ 高级配置选项

仅禁用特定场景的时间同步

如果你不需要完全禁用时间同步,可以只禁用特定场景:

# 仅禁用快照恢复时的时间同步
time.synchronize.restore = "FALSE"

# 保持其他时间同步功能启用
time.synchronize.continue = "TRUE"

使用 BIOS 时间而非主机时间

bios.forceSetupOnce = "FALSE"
rtc.useLocalTime = "TRUE"

禁用 VMware Tools 时间同步

如果安装了 VMware Tools,还需要在虚拟机内部禁用:

Windows 虚拟机:

  1. 打开注册表编辑器(regedit
  2. 导航到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VMMEMCTL
  3. 创建或修改 DWORD 值:DisableTimeSync = 1

Linux 虚拟机:
编辑 /etc/vmware-tools/tools.conf

[timeSync]
enable = false

❓ 常见问题

Q1: 修改配置后时间仍然同步怎么办?

A: 请检查以下几点:

  1. 确认虚拟机已完全关闭(不是挂起状态)
  2. 确认 .vmx 文件已正确保存
  3. 尝试删除 .lck 锁定文件夹后重新启动
  4. 检查 VMware Tools 是否启用了时间同步

Q2: 如何恢复时间同步功能?

A: 将配置文件中的所有 FALSE 改回 TRUE,或删除这些配置行:

time.synchronize.continue = "TRUE"
time.synchronize.restore = "TRUE"
time.synchronize.resume.disk = "TRUE"
time.synchronize.shrink = "TRUE"
time.synchronize.tools.startup = "TRUE"

Q3: 时间戳计算错误导致时间不对?

A:

  1. 确认使用的是 秒级 Unix 时间戳(10位数字)
  2. 注意时区差异,时间戳是基于 UTC 时间的
  3. 使用在线工具验证时间戳是否正确

Q4: 可以在运行时动态修改时间吗?

A: 不建议在虚拟机运行时修改 .vmx 文件。正确的做法是:

  1. 关闭虚拟机
  2. 修改配置文件
  3. 重新启动虚拟机

Q5: 这个配置会影响性能吗?

A: 不会影响性能。禁用时间同步只是阻止 VMware 自动调整虚拟机时间,对 CPU、内存和磁盘性能没有任何影响。

💡 使用建议

  1. 测试环境专用:此配置主要用于测试和开发环境,生产环境建议保持时间同步以确保日志和认证的准确性

  2. 记录时间戳:建议在文档中记录你使用的时间戳对应的实际时间,方便后续维护

  3. 定期验证:定期检查虚拟机时间是否符合预期,特别是在更新 VMware 版本后

  4. 备份配置:修改 .vmx 文件前,建议先备份原文件

  5. 结合快照管理:可以为不同的测试场景创建多个快照,每个快照对应不同的时间点

📌 注意事项

⚠️ 重要提醒:

  • 禁用时间同步可能导致某些依赖准确时间的应用程序出现问题
  • SSL/TLS 证书验证可能因时间不准确而失败
  • Kerberos 认证等安全协议需要准确的时间同步
  • 日志文件的时间戳可能与实际时间不符,排查问题时需注意
  • 仅在有明确需求时才禁用时间同步,测试完成后建议恢复

🔗 相关资源