我正在为类似 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;
}