Ntp

CentOS 7 - timedatectl 如何在沒有 NTP 的情況下同步時間和日期?

  • May 16, 2019

我正在為類似 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 的情況。

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"/>

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;

}

引用自:https://serverfault.com/questions/967493