Điểm:2

làm cách nào để kiểm tra xem thời gian hệ thống có được đồng bộ hóa với máy chủ NTP hay không mà không cần biết ứng dụng khách ntp được sử dụng trong sản phẩm?

lá cờ cn

làm cách nào để kiểm tra xem thời gian hệ thống có được đồng bộ hóa với máy chủ NTP hay không mà không cần biết ứng dụng khách NTP được sử dụng trong sản phẩm? Tôi đang phát triển một ứng dụng dự kiến ​​sẽ chạy trong cả vùng chứa hoặc hệ thống độc lập. Ứng dụng của tôi có yêu cầu đảm bảo rằng thời gian hệ thống được đồng bộ hóa trước khi thực hiện một số thao tác nhất định. Tuy nhiên, không thể đảm bảo tính khả dụng của gói NTP/chrony trong vùng chứa ngay cả khi một hoặc ứng dụng khách NTP khác được sử dụng trong Hệ điều hành máy chủ.

Vì vậy, tôi đang tìm kiếm một cách thống nhất để biết liệu thời gian hệ thống có được đồng bộ hóa hay không?

John Mahowald avatar
lá cờ cn
Bạn đang tìm kiếm một giải pháp di động? Một số câu trả lời bạn nhận được thì không, ví dụ systemd chỉ dành cho Linux.
cptMikky avatar
lá cờ us
Từ những gì tôi đọc được, có vẻ như bạn thực sự muốn đảm bảo rằng đồng hồ hệ thống "đúng giờ", có thể nói như vậy.Thực tế là một hộp được đồng bộ hóa với máy chủ NTP không nhất thiết có nghĩa là thời gian chính xác, chỉ có nghĩa là nó được đồng bộ hóa với máy chủ NTP. Nếu bạn cần cái trước, cách đặt cược an toàn duy nhất của bạn là thực hiện một số loại so sánh bù thời gian với nguồn thời gian đáng tin cậy.
Điểm:2
lá cờ cn

Các ứng dụng trên điện toán cho mục đích chung không thể biết trong mọi trường hợp cách thức hoạt động của đồng bộ hóa thời gian trên các máy chủ mà chúng chạy trên đó. Trong một vùng chứa, bạn không nhìn thấy và không thể kết nối với chronyd hoặc ntpd đang chạy trên máy chủ, tuy nhiên điều này giúp duy trì thời gian tốt. Hoặc một khách VM dựa trên đồng bộ hóa thời gian của máy chủ, cũng không hiển thị. Hơn nữa, làm cho câu trả lời chung trở nên khó khăn hơn, có nhiều triển khai NTP hơn bạn nghĩ: chrony, ntp, ntpsec, openntpd, w32tm.

Thông thường tài liệu về tầm quan trọng của thời gian chính xác là đủ.

Trên một số nền tảng, việc tạo sự phụ thuộc vào một ntpd bắt đầu tương đối dễ dàng. Trên RHEL, để chờ đồng bộ hóa thời gian systemctl kích hoạt chrony-wait và thêm vào đơn vị systemd của bạn

After=time-sync.target
Yêu cầu=time-sync.target

Tuy nhiên, có những ứng dụng với yêu cầu thời gian nghiêm ngặt. Yêu cầu khắt khe nhất mà tôi có thể nghĩ đến là các cơ quan có thẩm quyền về thời gian, một trong số đó các tiêu chuẩn xác nhận quyền sở hữu yêu cầu độ lệch ít hơn một giây hoặc không có gì có thể được ban hành. Phản hồi tích cực này có nghĩa là ứng dụng thực hiện kiểm tra thời gian của chính nó.

Có lẽ gói một ứng dụng khách SNTP, kiểm tra độ lệch NTP trong ứng dụng của bạn, đối với các máy chủ NTP có thể định cấu hình.Không thể kiểm tra xem ntpd có đang chạy hay không, nhưng có thể kiểm tra độ lệch chuẩn xác bất kể thời gian đồng bộ hóa hoạt động với máy chủ như thế nào.

Điểm:1
lá cờ jo

Có hai cách để làm điều này.

Nếu vùng chứa bạn đang chạy có triển khai systemd đầy đủ, thì timedatectl chương trình có thể thông báo cho bạn nếu máy chủ được đồng bộ hóa hay không.

Cách mà điều này được quản lý nội bộ là thông qua dbus nói với systemd-thời gian yêu tinh. Những gì nó đang làm là thực hiện một cuộc gọi hệ thống: adjtimex từ đó có thể lấy lại dữ liệu cho biết trạng thái hiện tại của việc điều chỉnh trong kernel (nếu có) đang được thực hiện.

Do đó, cách thứ hai để tự làm điều này mà không cần triển khai đầy đủ là sử dụng adjtimex() cuộc gọi hệ thống.

Hạt nhân không muốn thời gian nhảy vọt trong báo cáo thời gian của nó (hoặc tệ hơn là thời gian quay ngược lại) vì vậy nó thực hiện một sai lệch về thời gian mà trong vài giờ sẽ điều chỉnh thời gian của hệ thống (xong rồi bằng cách thêm hoặc trì hoãn vài mili giây trên giây cho đến khi điều chỉnh hoàn tất).

Các adjtimex cuộc gọi hệ thống thường được các hệ thống NTP sử dụng để thay đổi độ lệch hiện tại mà đồng hồ đang phải đối mặt để đồng bộ hóa chính xác với nguồn đồng hồ thực -- nhưng nó cũng có thể được sử dụng để lấy trạng thái hiện tại của độ lệch của nguồn đồng hồ. Do đó, nó cung cấp cho bạn khả năng xem qua ý tưởng của nhân về quá trình đồng bộ hóa đang được thực hiện (nếu có).

trang người đàn ông cho adjtimex cung cấp một vài phần thú vị liên quan đến những gì bạn đang hỏi:

       Trường buf.status là một mặt nạ bit được sử dụng để đặt và/hoặc truy xuất các bit trạng thái liên quan đến việc triển khai NTP. Một số bit trong mặt nạ
       đều có thể đọc được và có thể cài đặt được, trong khi những cái khác là chỉ đọc.
...
       STA_UNSYNC (đọc-ghi)
              Đồng hồ không được đồng bộ hóa.

GIÁ TRỊ TRẢ LẠI
       Khi thành công, adjtimex() và ntp_adjtime() trả về trạng thái đồng hồ; nghĩa là, một trong các giá trị sau:
...
       TIME_ERROR Đồng hồ hệ thống không được đồng bộ hóa với máy chủ đáng tin cậy. Giá trị này được trả về khi bất kỳ điều nào sau đây đúng:

                   * Đã đặt STA_UNSYNC hoặc STA_CLOCKERR.

                   * STA_PPSSIGNAL bị xóa và STA_PPSFREQ hoặc STA_PPSTIME được đặt.

                   * STA_PPSTIME và STA_PPSJITTER đều được thiết lập.

                   * STA_PPSFREQ được đặt và STA_PPSWANDER hoặc STA_PPSJITTER được đặt.

                   Tên tượng trưng TIME_BAD là từ đồng nghĩa với TIME_ERROR, được cung cấp để tương thích ngược.

Như vậy, nếu bạn không có vùng chứa chính thức, bạn vẫn có thể lấy dữ liệu này. Tôi đã viết một chương trình đơn giản sẽ tìm nạp trạng thái của các nhân bị lệch thông qua adjtimex trong CBạn có thể biên dịch nó chẳng hạn gcc -o timex timex.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

#include <sys/timex.h>

/* Viết cho https://serverfault.com/questions/1077601/how-to-check-whether-the-system-time-is-synchronised-to-ntp-server-without-knowi */

làm mất hiệu lực test_status(
    số nguyên) 
{
  nếu (st & STA_PLL)
    printf("Vòng khóa pha\n");
  nếu (st & STA_PPSFREQ)
    printf("Tần số xung trên giây\n");
  nếu (st & STA_FLL)
    printf("Kỷ luật thời gian PPS\n");
  nếu (st & STA_INS)
    printf("Chèn giây nhuận và ngày cuối\n");
  nếu (st & STA_DEL)
    printf("Xóa giây nhuận và ngày cuối\n");
  nếu (st & STA_UNSYNC)
    printf("Chưa đồng bộ\n");
  nếu (st & STA_FREQHOLD)
    printf("Tần số giữ\n");
  nếu (st & STA_PPSSIGNAL)
    printf("Có tín hiệu PPS hợp lệ\n");
  nếu (st & STA_PPSJITTER)
    printf("Vượt quá jitter tín hiệu PPS\n");
  nếu (st & STA_PPSWANDER)
    printf("Vượt quá trôi dạt tín hiệu PPS\n");
  nếu (st & STA_PPSERROR)
    printf("Lỗi cân chỉnh tín hiệu PPS\n");
  nếu (st & STA_CLOCKERR)
    printf("Lỗi phần cứng đồng hồ\n");

  nếu (st & STA_NANO)
    printf("Độ phân giải nano giây\n");
  khác
    printf("Độ phân giải micro giây\n");

  nếu (st & STA_MODE)
    printf("Vòng lặp bị khóa tần số\n");
  khác
    printf("Vòng khóa pha\n");
}

int main() {
  cấu trúc thời gian tx = {};
  tx.modes = ADJ_OFFSET_SS_READ;
  int err = adjtimex(&tx);

  công tắc (lỗi) {
    trường hợp 1:
      printf("Lỗi thời gian: %s\n", strerror(errno));
    nghỉ;

    trường hợp TIME_WAIT:
      printf("\n");
    nghỉ;

    trường hợp TIME_INS:
      printf("Giây nhuận sẽ được thêm vào ngày UTC tiếp theo\n");
    nghỉ;

    trường hợp TIME_DEL:
      printf("Giây nhuận sẽ bị xóa vào ngày UTC tiếp theo\n");
    nghỉ;

    trường hợp TIME_OOP:
      printf("Đang chèn bước nhảy thứ hai\n");
    nghỉ;

    trường hợp TIME_ERROR:
      printf("Lỗi nhận thời gian\n");
    nghỉ;

    trường hợp TIME_OK:
      printf("Thời gian OK\n");
    nghỉ;

    mặc định:
      printf("Thời gian mặc định: %x (%d)\n", err, err);
    nghỉ;
  }

  test_status(tx.status);
  thoát (0);
}

Chạy trên một hệ thống không được đồng bộ hóa:

$ ./thời gian 
Lỗi nhận thời gian
Đồng hồ không được đồng bộ hóa
độ phân giải micro giây
Giai đoạn khóa vòng lặp

Chạy trong một vùng chứa trên cùng một máy chủ không được đồng bộ hóa:

# podman run -v /tmp/timex/timex:/timex docker.io/gammabytehosting/rockylinux /timex
Lỗi nhận thời gian
Đồng hồ không được đồng bộ hóa
độ phân giải micro giây
Giai đoạn khóa vòng lặp

Đặt thời gian trong hệ thống máy chủ được đồng bộ hóa:

# systemctl bắt đầu chronyd
# nguồn chronyc
210 Số nguồn = 9
Tên MS/địa chỉ IP Stratum Poll Reach LastRx Mẫu cuối cùng               
================================================================= ============================================
^* _gateway 2 6 7 1 +5568ns[ -720ms] +/- 32ms
# ./timex 
Thời gian OK
độ phân giải micro giây
Giai đoạn khóa vòng lặp

Thực hiện kiểm tra theo chương trình tương tự trong vùng chứa trên cùng một máy chủ:

# podman run -v /tmp/timex/timex:/timex docker.io/gammabytehosting/rockylinux /timex
Thời gian OK
độ phân giải micro giây
Giai đoạn khóa vòng lặp

Có khả năng xảy ra một số vấn đề với các không gian tên thời gian mà tôi chưa kiểm tra (mặc dù chúng thực sự rất mới) để xem liệu chúng có khác biệt hay tôn trọng không adjtimex trong một bối cảnh riêng biệt (xem người đàn ông 7 time_namespaces) nhưng từ những gì tôi đã đọc, nó có thể vẫn hoạt động - tôi sẽ để điều đó cho bạn xác định.

Điểm:-1
lá cờ eg

Làm cách nào để kiểm tra xem thời gian hệ thống có được đồng bộ hóa với máy chủ NTP không?

Không có.

Ứng dụng của tôi có yêu cầu đảm bảo rằng thời gian hệ thống được đồng bộ hóa trước khi thực hiện một số thao tác nhất định

Ứng dụng không có trách nhiệm thiết lập đúng môi trường để chạy, mà tùy thuộc vào hệ thống và quản trị viên của nó.

Các ứng dụng dựa vào ngày/giờ do hệ thống trả về. Cho dù thời gian đó là một trong hai "Chính xác" hoặc "Sai lầm" ; ứng dụng thường không có cách nào để biết điều đó. Nó sẽ chỉ sử dụng ngày/giờ hệ thống đó.

Nếu bạn có mô hình máy khách-máy chủ thì việc cung cấp thông báo lỗi hữu ích bất cứ khi nào giao dịch sắp bị từ chối do chênh lệch ngày/giờ (cực) sẽ tốt.
Lưu ý rằng sự tồn tại của một bộ lệch như vậy không cho bạn biết liệu máy khách đang ở trên đồng hồ không chính xác hay máy chủ hay cả hai.

Matthew Ife avatar
lá cờ jo
Những gì người dùng đang yêu cầu là liệu có thể xác định (không kiểm tra việc triển khai NTP) để xem liệu hạt nhân có được điều chỉnh độ lệch bằng cách nào đó hay không. Trong khi ứng dụng không thiết lập môi trường, tuy nhiên, một ứng dụng tốt có thể kiểm tra xem nó có ở đúng môi trường hay không mà không thực hiện bất kỳ thay đổi nào.
John Mahowald avatar
lá cờ cn
Một ứng dụng không được kiểm soát và không biết về môi trường sẽ thực hiện kém công việc suy luận cách thức hoạt động của đồng bộ hóa thời gian. Hãy để điều này cho quản trị viên hệ điều hành máy chủ lưu trữ hoặc xác định chặt chẽ hơn đồng hồ phần mềm và/hoặc phần cứng có liên quan.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.