ntpd가 작동하나요?

ntpd가 작동하나요?

내 컴퓨터에서 실행하고 있지만 ntpd제대로 작동하는지 잘 모르겠습니다. ntpd시간 서버에 대한 연결이 성공했는지, 커널 시간이 동기화되었는지 확인하기 위해 쿼리하려면 어떻게 해야 합니까 ?

답변1

ntpd작동하는지 확인하는 방법에는 여러 가지가 있습니다 .

  1. 사용하거나 ntpq -pDNS ntpq -pn조회를 건너뛰어 시간을 절약하세요.

    NTP의 실제 모습은 다음과 같습니다.

    host-a ~ # ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
     0.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
     1.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
     2.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
     3.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
    +mail.masters-of 144.76.76.107    3 u  975 1024  377   13.731   -0.737   2.552
    +ntp2.hetzner.de 124.216.164.14   2 u  232 1024  377   15.914   -0.650   0.854
    +rondra.lf-net.o 237.17.204.95    2 u 1020 1024  377   13.751   -0.557   4.292
    -funky.f5s.de    131.188.3.222    2 u  480 1024  377   15.730    2.082   4.377
    +stratum2-3.NTP. 129.70.137.82    2 u  742 1024  377   19.785   -0.366   7.498
    *mail.klausen.dk 193.79.237.14    2 u  173 1024  377   14.383   -0.513   2.066
    

    *동기화하려는 소스를 나타내는 연결된 실제 피어가 나열됩니다 . 출력에 대한 자세한 내용은 다음에서 확인할 수 있습니다.NTP 문서.

    없을 때는 다음과 같습니다.

    host-b ~ # ntpq -p
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
     0.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
     1.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
     2.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
     3.debian.pool.n .POOL.          16 p    -   64    0    0.000    0.000   0.000
    

    나열된 실제 피어가 없다는 점에 유의하십시오. 이는 일반적으로 ntpd방화벽이 연결을 차단하고 있기 때문에 피어에 연결할 수 없음을 나타냅니다.

    ntpq -p출력을 구문 분석해야 하기 때문에 스크립트 검사에는 적합하지 않으며 속도(호출당 30밀리초)는 괜찮지만 더 빠른 방법은 나중에 논의하겠습니다.

  2. 사용하고 계시다면 systemd사용하시면 됩니다 timedatectl status.

    NTP의 실제 모습은 다음과 같습니다(참고 System clock synchronized: yes).

    host-a ~ # timedatectl status 
                   Local time: Do 2021-04-22 13:29:20 CEST
               Universal time: Do 2021-04-22 11:29:20 UTC
                     RTC time: Do 2021-04-22 11:29:21
                    Time zone: Europe/Berlin (CEST, +0200)
    System clock synchronized: yes
                  NTP service: inactive
              RTC in local TZ: no
    

    없을 때의 모습은 다음과 같습니다(참고 System clock synchronized: no).

    host-b ~ # timedatectl status
                   Local time: Do 2021-04-22 13:29:53 CEST
               Universal time: Do 2021-04-22 11:29:53 UTC
                     RTC time: Do 2021-04-22 11:29:42
                    Time zone: Europe/Berlin (CEST, +0200)
    System clock synchronized: no
                  NTP service: inactive
              RTC in local TZ: no
    
    

    ( 자체 NTP 클라이언트를 NTP service참조하십시오 . 설치 시 실행되어서는 안 되므로 이는 예상된 결과입니다.)systemd-timesyncdsystemdntpdno

    timedatectl statussystemd-timedated요청 시에만 시작된 쿼리의 경우 첫 번째 호출에서 약 100밀리초의 작은 성능 저하가 발생합니다. 추가 호출에는 약 12밀리초가 걸립니다.

    systemd-timedatedadjtimex(2)시스템 호출은 커널을 쿼리하는 데 차례로 사용됩니다 . adjtimex(2)이 비트가 설정된 상태로 상태가 반환 되면 STA_UNSYNC시계가 동기화되지 않습니다. timedatectl이는 실제로 통신하는 것이 아니라 동기화 상태가 변경될 때마다 NTP 서비스에 의해 업데이트되는 ntpd커널에 저장된 비트를 쿼리한다는 것을 의미합니다 .ntpd

    timedatectl status관련 속성을 직접 쿼리할 수 있으므로 스크립팅에 적합합니다.

    host-a ~ # timedatectl show -p NTPSynchronized --value                          
    yes
    host-b ~ # timedatectl show -p NTPSynchronized --value
    no
    
  3. 직접 사용 adjtimex(2):

    이는 사용자에게 가장 친숙하지 않은 방법이지만 스크립팅의 경우 가장 빠릅니다. busybox데비안 버스터는 시스템 호출에 대한 간단한 래퍼 adjtimex역할을 하는 작은 프로그램을 제공합니다.adjtimex(2)

    NTP의 실제 모습은 다음과 같습니다.

    host-a ~ # busybox adjtimex
        mode:         0
    -o  offset:       -570098 us
    -f  freq.adjust:  857283 (65536 = 1ppm)
        maxerror:     478704
        esterror:     302
        status:       8193 (PLL)
    -p  timeconstant: 10
        precision:    1 us
        tolerance:    32768000
    -t  tick:         10000 us
        time.tv_sec:  1619092119
        time.tv_usec: 60467600
        return value: 0 (clock synchronized)
    

    존재하지 않을 때의 모습은 다음과 같습니다( 행 UNSYNC의 합계 참고 status).

    host-b ~ # busybox adjtimex
        mode:         0
    -o  offset:       0 us
    -f  freq.adjust:  2126708 (65536 = 1ppm)
        maxerror:     16000000
        esterror:     16000000
        status:       16449 (PLL | UNSYNC)
    -p  timeconstant: 7
        precision:    1 us
        tolerance:    32768000
    -t  tick:         10000 us
        time.tv_sec:  1619091984
        time.tv_usec: 307119
        return value: 5 (clock not synchronized)
    

    불행하게도 busybox adjtimex특정 필드만 인쇄하는 방법은 없는 것 같습니다. 반환 값은 실제로 반환되지 않고 인쇄될 뿐입니다. 이는 스크립팅을 위해 출력(예: )을 구문 분석해야 함을 의미합니다 busybox adjtimex | grep -q UNSYNC. 반면에 매우 빠른 속도(단 0.5밀리초)로 이를 보완합니다!

관련 정보