AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1077601
Accepted
Baranikumar Venkatesan
Baranikumar Venkatesan
Asked: 2021-09-15 21:16:47 +0800 CST2021-09-15 21:16:47 +0800 CST 2021-09-15 21:16:47 +0800 CST

在不知道产品中使用的ntp客户端的情况下,如何查看系统时间是否与NTP服务器同步?

  • 772

在不知道产品中使用的NTP客户端的情况下,如何查看系统时间是否与NTP服务器同步?我正在开发一个可以在容器或独立系统中运行的应用程序。我的应用程序要求在尝试执行某些操作之前确保系统时间同步。但是,即使在主机操作系统中使用了一个或另一个 NTP 客户端,也不能保证 NTP/chrony 包的可用性在容器中可用。

所以我正在寻找一种统一的方式来知道系统时间是否同步?

synchronization ntp
  • 3 3 个回答
  • 685 Views

3 个回答

  • Voted
  1. Best Answer
    John Mahowald
    2021-09-16T09:12:22+08:002021-09-16T09:12:22+08:00

    通用计算上的应用程序无法在所有情况下都知道时间同步在它们运行的​​主机上是如何工作的。在容器中,您看不到也无法连接到主机上运行的 chronyd 或 ntpd,但这可以很好地保持时间。或者依赖主机时间同步的 VM 来宾,也不可见。进一步使一般答案变得困难,NTP 实现比您想象的要多:chrony、ntp、ntpsec、openntpd、w32tm。

    通常记录正确时间的重要性就足够了。

    在某些平台上,对 ntpd 启动的依赖是相对简单的。在 RHEL 上,等待时间同步 systemctl enable chrony-wait并添加到您的 systemd 单元

    After=time-sync.target
    Requires=time-sync.target
    

    然而,有些应用程序具有严格的时间要求。我能想到的最苛刻的是时间戳权威,其中一个索赔标准要求不到一秒的偏移量,否则什么也不能签发。这种激进的响应意味着应用程序会进行自己的时间检查。

    也许捆绑一个 SNTP 客户端,它检查应用程序中的 NTP 偏移量,与可配置的 NTP 服务器。无法检查 ntpd 是否正常运行,但无论时间同步如何对主机起作用,都可以检查偏移量。

    • 2
  2. Matthew Ife
    2021-09-16T00:24:13+08:002021-09-16T00:24:13+08:00

    有两种方法可以做到这一点。

    如果您正在运行的容器具有完整的 systemd 实现,那么timedatectl程序可以通知您主机是否已同步。

    内部管理的方式是通过与systemd-timedated守护进程对话的 dbus。它正在执行一个系统调用:adjtimex从中可以获取数据,指示正在完成的内核中调整的当前状态(如果有的话)。

    因此,在没有完整实现的情况下自己执行此操作的第二种方法是使用adjtimex()系统调用。

    内核不希望在时间报告中出现时间跳跃(或者更糟糕的是,时间倒退),因为它实现了时间偏差,在几个小时的过程中会纠正系统时间(完成每秒增加或延迟几毫秒,直到调整完成)。

    adjtimexNTP 系统通常使用系统调用来更改时钟面临的当前偏差,以使其与真正的时钟源正确同步——但它也可用于获取时钟源偏差的当前状态。因此,它使您能够窥探内核关于正在执行什么同步的想法(如果有的话)。

    手册页adjtimex提供了一些与您所要求的内容相关的有趣部分:

           The  buf.status  field  is a bit mask that is used to set and/or retrieve status bits associated with the NTP implementation.  Some bits in the mask
           are both readable and settable, while others are read-only.
    ...
           STA_UNSYNC (read-write)
                  Clock unsynchronized.
    

    和

    RETURN VALUE
           On success, adjtimex() and ntp_adjtime() return the clock state; that is, one of the following values:
    ...
           TIME_ERROR  The system clock is not synchronized to a reliable server.  This value is returned when any of the following holds true:
    
                       *  Either STA_UNSYNC or STA_CLOCKERR is set.
    
                       *  STA_PPSSIGNAL is clear and either STA_PPSFREQ or STA_PPSTIME is set.
    
                       *  STA_PPSTIME and STA_PPSJITTER are both set.
    
                       *  STA_PPSFREQ is set and either STA_PPSWANDER or STA_PPSJITTER is set.
    
                       The symbolic name TIME_BAD is a synonym for TIME_ERROR, provided for backward compatibility.
    

    因此,如果您没有完全成熟的容器,仍然可以获取这些数据。我写了一个简单的程序,它将通过adjtimexC 获取内核倾斜的状态。例如,您可以编译它gcc -o timex timex.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    
    #include <sys/timex.h>
    
    /* Written for https://serverfault.com/questions/1077601/how-to-check-whether-the-system-time-is-synchronised-to-ntp-server-without-knowi */
    
    void test_status(
        int st) 
    {
      if (st & STA_PLL)
        printf("Phase locked loop\n");
      if (st & STA_PPSFREQ)
        printf("Pulse per second frequency discipline\n");
      if (st & STA_FLL)
        printf("PPS Time discipline\n");
      if (st & STA_INS)
        printf("Insert leap second and end-of-day\n");
      if (st & STA_DEL)
        printf("Delete leap second and end-of-day\n");
      if (st & STA_UNSYNC)
        printf("Clock is not syncronized\n");
      if (st & STA_FREQHOLD)
        printf("Hold frequency\n");
      if (st & STA_PPSSIGNAL)
        printf("Valid PPS signal is present\n");
      if (st & STA_PPSJITTER)
        printf("PPS signal jitter exceeded\n");
      if (st & STA_PPSWANDER)
        printf("PPS Signal wander exceeded\n");
      if (st & STA_PPSERROR)
        printf("PPS signal calibration error\n");
      if (st & STA_CLOCKERR)
        printf("Clock hardware fault\n");
    
      if (st & STA_NANO)
        printf("Nanosecond resolution\n");
      else
        printf("Microsecond resolution\n");
    
      if (st & STA_MODE)
        printf("Frequency locked loop\n");
      else
        printf("Phase locked loop\n");
    }
    
    int main() {
      struct timex tx = {};
      tx.modes = ADJ_OFFSET_SS_READ;
      int err = adjtimex(&tx);
    
      switch(err) {
        case -1:
          printf("Time error: %s\n", strerror(errno));
        break;
    
        case TIME_WAIT:
          printf("Leap second insert/delete completed\n");
        break;
    
        case TIME_INS:
          printf("Leap second to be added next UTC day\n");
        break;
    
        case TIME_DEL:
          printf("Leap second to be deleted next UTC day\n");
        break;
    
        case TIME_OOP:
          printf("Leap second insertion in progress\n");
        break;
    
        case TIME_ERROR:
          printf("Error getting time\n");
        break;
    
        case TIME_OK:
          printf("Time OK\n");
        break;
    
        default:
          printf("Time default: %x (%d)\n", err, err);
        break;
      }
    
      test_status(tx.status);
      exit(0);
    }
    

    在未同步的系统上运行:

    $ ./timex 
    Error getting time
    Clock is not syncronized
    Microsecond resolution
    Phase locked loop
    

    在未同步的同一主机上的容器中运行:

    # podman run -v /tmp/timex/timex:/timex  docker.io/gammabytehosting/rockylinux /timex
    Error getting time
    Clock is not syncronized
    Microsecond resolution
    Phase locked loop
    

    在主机系统中设置要同步的时间:

    # systemctl start chronyd
    # chronyc sources
    210 Number of sources = 9
    MS Name/IP address         Stratum Poll Reach LastRx Last sample               
    ===============================================================================
    ^* _gateway            2   6     7     1  +5568ns[ -720ms] +/-   32ms
    # ./timex 
    Time OK
    Microsecond resolution
    Phase locked loop
    

    在同一主机上的容器中执行相同的编程检查:

    # podman run -v /tmp/timex/timex:/timex  docker.io/gammabytehosting/rockylinux /timex
    Time OK
    Microsecond resolution
    Phase locked loop
    

    我尚未测试的时间命名空间可能存在一些问题(尽管它们确实非常新),以查看它们adjtimex在单独的上下文中是否不同或尊重(请参阅man 7 time_namespaces),但从我读过的内容来看,它可能仍然可以工作 - - 我会留给你决定。

    • 1
  3. n00b
    2021-09-15T23:20:20+08:002021-09-15T23:20:20+08:00

    如何查看系统时间是否与NTP服务器同步?

    没有。

    我的应用程序要求在尝试执行某些操作之前确保系统时间同步

    设置正确的运行环境不是应用程序的责任,这取决于系统及其管理员。

    应用程序依赖于系统返回的日期/时间。那个时间是“正确”还是“错误”;应用程序通常无法知道这一点。它只会使用该系统日期/时间。

    如果您有一个客户端-服务器模型,那么当交易因为(极端)日期/时间偏移而被拒绝时提供有用的错误消息会很好。
    请注意,这种偏移的存在并不能告诉您客户端是在错误的时钟上,还是在服务器上,或两者兼而有之。

    • -1

相关问题

  • 文件复制到分支机构

  • 在本地同步 FTP 文件夹

  • 在 Windows Server 环境中跨 LAN 或 FTP 自动同步/备份文件?

  • 网络文件同步工具

  • 允许跨平台同步的密码管理器[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve