CentOS 7 - timedatectl 如何在没有 NTP 的情况下同步时间和日期?

CentOS 7 - timedatectl 如何在没有 NTP 的情况下同步时间和日期?

我正在为类似 rsync 的实用程序创建自动化测试,我需要能够将其中一个测试的时钟调回 24 小时。但是,当我使用 timedatectl 设置时间和日期时,它们会在 15 秒后恢复到当前时间。

检查 timedatectl 状态我发现它没有运行 NTP:

# timedatectl status
      Local time: Wed 2019-05-15 23:24:17 EDT
  Universal time: Thu 2019-05-16 03:24:17 UTC
        RTC time: Wed 2019-01-16 02:13:40
       Time zone: America/New_York (EDT, -0400)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: yes
 Last DST change: DST began at
                  Sun 2019-03-10 01:59:59 EST
                  Sun 2019-03-10 03:00:00 EDT
 Next DST change: DST ends (the clock jumps one hour backwards) at
                  Sun 2019-11-03 01:59:59 EDT
                  Sun 2019-11-03 01:00:00 EST

我还检查了,NTPD 没有运行,也没有任何东西绑定到端口 123。

timedatectl 还有其他同步时间的方法吗?CentOS 7 测试机在 VirtualBox 映像下的 Docker 容器中运行,因此 Internet 连接受到一定限制。我还直接在 VirtualBox 上对 CentOS 进行测试,因此我还需要解决非 Docker 情况。

答案1

VBox Guest Additions 默认包含并启用与主机的时间同步。

您可以使用以下命令禁用此功能:

vboxmanage setextradata <vmname> "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" "1"

或者将以下行添加到 yourVM.vbox 文件中

<ExtraDataItem name="VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" value="1"/>

答案2

timedatectl 由 systemd 以特定频率调用,它会检查 /etc/adjtime、/usr/share/zoneinfo/、/etc/localtime 和许多其他文件来检查是否有任何可用信息,它有自己的逻辑来调整时钟而不使用 ntp。

static int context_write_data_timezone(Context *c) {
    _cleanup_free_ char *p = NULL;
    int r = 0;

    assert(c);

    if (isempty(c->zone)) {
            if (unlink("/etc/localtime") < 0 && errno != ENOENT)
                    r = -errno;

            return r;
    }

    p = strappend("../usr/share/zoneinfo/", c->zone);
    if (!p)
            return log_oom();

    r = symlink_atomic(p, "/etc/localtime");
    if (r < 0)
            return r;

    return 0;

}

相关内容