Đồng bộ hóa thời gian Linux: NTP, Chrony và systemd-timesyncd

Đồng bộ hóa thời gian Linux: NTP, Chrony và systemd-timesyncd
Hầu hết mọi người theo dõi thời gian. Chúng ta thức dậy đúng giờ để hoàn thành các nghi thức buổi sáng và đi làm, nghỉ trưa, đáp ứng thời hạn của dự án, tổ chức sinh nhật và ngày lễ, lên máy bay, v.v.

Hơn nữa: một số người trong chúng ta bị ám ảnh bởi thời gian. Đồng hồ của tôi chạy bằng năng lượng mặt trời và nhận thời gian chính xác từ Viện Tiêu chuẩn và Công nghệ Quốc gia (NIST) đến Fort Collins, Colorado qua đài phát thanh sóng dài WWVB. Các tín hiệu thời gian được đồng bộ hóa với đồng hồ nguyên tử, cũng được đặt tại Fort Collins. Fitbit của tôi đang đồng bộ hóa với điện thoại của tôi đang đồng bộ hóa với máy chủ NTP, mà cuối cùng đồng bộ hóa với đồng hồ nguyên tử.

Thiết bị cũng theo dõi thời gian

Có nhiều lý do khiến các thiết bị và máy tính của chúng ta cần thời gian chính xác. Ví dụ: trong ngân hàng, thị trường chứng khoán và các doanh nghiệp tài chính khác, các giao dịch phải được thực hiện theo đúng thứ tự và trình tự thời gian chính xác là rất quan trọng đối với điều này.

Tất cả điện thoại, máy tính bảng, ô tô, hệ thống GPS và máy tính của chúng tôi đều yêu cầu cài đặt ngày và giờ chính xác. Tôi muốn đồng hồ trên màn hình máy tính của tôi hiển thị thời gian chính xác. Tôi muốn lời nhắc xuất hiện trên lịch địa phương của mình vào đúng thời điểm. Thời gian chính xác cũng đảm bảo rằng các công việc cron và systemd chạy vào đúng thời điểm.

Ngày và giờ cũng rất quan trọng đối với việc ghi nhật ký, vì vậy việc tìm các nhật ký nhất định dựa trên ngày và giờ sẽ dễ dàng hơn một chút. Ví dụ: tôi đã từng làm việc trong DevOps (lúc đó nó không được gọi như vậy) và đang thiết lập một hệ thống email ở bang Bắc Carolina. Chúng tôi đã từng xử lý hơn 20 triệu email mỗi ngày. Theo dõi e-mail thông qua một loạt máy chủ hoặc xác định chuỗi sự kiện chính xác bằng cách sử dụng tệp nhật ký trên các máy chủ phân tán về mặt địa lý, có thể dễ dàng hơn nhiều nếu các máy tính tương ứng được đồng bộ hóa kịp thời.

Một lần - nhiều giờ

Máy chủ Linux phải tính đến thời gian hệ thống và thời gian RTC. RTC (Real Time Clock) là một cái tên hơi lạ và không chính xác cho đồng hồ phần cứng.

Đồng hồ phần cứng chạy liên tục ngay cả khi tắt máy tính, sử dụng pin trên bo mạch chủ hệ thống. Chức năng chính của RTC là lưu trữ thời gian khi không có kết nối với máy chủ thời gian. Vào thời không thể kết nối với máy chủ thời gian qua Internet, mọi máy tính đều phải có đồng hồ bên trong chính xác. Hệ điều hành phải truy cập RTC khi khởi động và người dùng phải đặt thời gian hệ thống theo cách thủ công bằng giao diện cấu hình phần cứng BIOS để đảm bảo thời gian đó chính xác.

Đồng hồ phần cứng không hiểu khái niệm múi giờ; RTC chỉ lưu trữ thời gian, không phải múi giờ hoặc phần bù từ UTC (Giờ quốc tế phối hợp, còn được gọi là GMT hoặc Giờ trung bình Greenwich). Bạn có thể cài đặt RTC bằng một công cụ mà tôi sẽ trình bày ở phần sau của bài viết này.

Thời gian hệ thống là thời gian mà HĐH hiển thị trên đồng hồ GUI trên màn hình của bạn, trong đầu ra của lệnh ngày, trong dấu thời gian của nhật ký. Điều này cũng áp dụng cho thời điểm tệp được tạo, sửa đổi và mở.

Trên trang người đàn ông cho rtc có một mô tả đầy đủ về RTC và đồng hồ hệ thống.

Có chuyện gì với NTP vậy?

Các máy tính trên toàn thế giới sử dụng NTP (Giao thức thời gian mạng) để đồng bộ hóa thời gian của chúng với các đồng hồ tham chiếu tiêu chuẩn qua Internet bằng cách sử dụng hệ thống phân cấp của các máy chủ NTP. Các máy chủ thời gian chính ở lớp 1 và chúng được kết nối trực tiếp với các dịch vụ thời gian quốc gia khác nhau ở lớp 0 thông qua vệ tinh, đài phát thanh hoặc thậm chí cả modem qua đường dây điện thoại. Các dịch vụ thời gian lớp 0 có thể là đồng hồ nguyên tử, bộ thu radio được điều chỉnh theo tín hiệu do đồng hồ nguyên tử truyền hoặc bộ thu GPS sử dụng tín hiệu đồng hồ có độ chính xác cao do vệ tinh GPS truyền.

Phần lớn các máy chủ tham chiếu có vài nghìn máy chủ NTP tầng 2 công khai mở cho công chúng. Nhiều tổ chức và người dùng (bao gồm cả tôi) có nhiều máy chủ cần máy chủ NTP chọn thiết lập máy chủ thời gian của riêng họ để chỉ một máy chủ cục bộ truy cập tầng 2 hoặc 3. Sau đó, họ định cấu hình các nút còn lại trên mạng để sử dụng máy chủ cục bộ. máy chủ thời gian. Trong trường hợp mạng gia đình của tôi, đây là máy chủ lớp 3.

Các triển khai khác nhau của NTP

Việc triển khai ban đầu của NTP là ntpd. Sau đó, nó được nối với hai cái mới hơn, chronyd và systemd-timesyncd. Cả ba đều đồng bộ hóa thời gian máy chủ lưu trữ cục bộ với máy chủ thời gian NTP. Dịch vụ systemd-timesyncd không đáng tin cậy như chronyd, nhưng nó đủ tốt cho hầu hết các mục đích. Nếu RTC không đồng bộ, nó có thể dần dần điều chỉnh thời gian hệ thống để đồng bộ hóa với máy chủ NTP khi thời gian hệ thống cục bộ trôi đi một chút. Không thể sử dụng dịch vụ systemd-timesync làm máy chủ thời gian.

niên đại là một triển khai của NTP chứa hai chương trình: trình nền chronyd và giao diện dòng lệnh có tên là chronyc. Chrony có một số tính năng không thể thiếu trong nhiều trường hợp:

  • Chrony có thể đồng bộ hóa với máy chủ thời gian nhanh hơn nhiều so với dịch vụ ntpd cũ. Điều này tốt cho máy tính xách tay hoặc máy tính để bàn không phải lúc nào cũng hoạt động.
  • Nó có thể bù cho sự dao động của đồng hồ, chẳng hạn như khi máy chủ chuyển sang chế độ ngủ hoặc chuyển sang chế độ ngủ hoặc khi đồng hồ thay đổi do nhảy tần, làm chậm đồng hồ ở mức tải thấp.
  • Nó giải quyết các vấn đề về thời gian liên quan đến kết nối mạng không ổn định hoặc tắc nghẽn mạng.
  • Nó điều chỉnh sự chậm trễ mạng.
  • Sau khi đồng bộ hóa thời gian ban đầu, Chrony không bao giờ dừng đồng hồ. Điều này cung cấp các khe thời gian ổn định và nhất quán cho nhiều ứng dụng và dịch vụ hệ thống.
  • Chrony có thể hoạt động ngay cả khi không có kết nối mạng. Trong trường hợp này, máy chủ cục bộ hoặc máy chủ có thể được cập nhật thủ công.
  • Chrony có thể hoạt động như một máy chủ NTP.

Một lần nữa, NTP là một giao thức có thể được triển khai trên máy chủ Linux bằng Chrony hoặc systemd-timesyncd.

Các RPM NTP, Chrony và systemd-timesyncd có sẵn trong kho lưu trữ tiêu chuẩn của Fedora. systemd-udev RPM là trình quản lý sự kiện kernel được cài đặt mặc định trên Fedora, nhưng là tùy chọn.

Bạn có thể cài đặt cả ba và chuyển đổi giữa chúng, nhưng điều này sẽ khiến bạn thêm đau đầu. Vì vậy, tốt hơn là không nên. Các bản phát hành hiện đại của Fedora, CentOS và RHEL đã chuyển sang Chrony làm cài đặt mặc định và chúng cũng có systemd-timesyncd. Tôi thấy Chrony hoạt động tốt, cung cấp giao diện tốt hơn dịch vụ NTP, cung cấp nhiều thông tin và khả năng kiểm soát hơn, điều mà các quản trị viên hệ thống chắc chắn sẽ thích.

Vô hiệu hóa dịch vụ NTP

Dịch vụ NTP có thể đang chạy trên máy chủ của bạn. Nếu vậy, bạn cần tắt nó trước khi chuyển sang thứ khác. Tôi đã chạy chronyd nên tôi đã sử dụng các lệnh sau để dừng và tắt nó. Chạy các lệnh thích hợp cho bất kỳ daemon NTP nào bạn đang chạy trên máy chủ của mình:

[root@testvm1 ~]# systemctl disable chronyd ; systemctl stop chronyd
Removed /etc/systemd/system/multi-user.target.wants/chronyd.service.
[root@testvm1 ~]#

Kiểm tra xem dịch vụ có bị dừng và tắt không:

[root@testvm1 ~]# systemctl status chronyd
● chronyd.service - NTP client/server
     Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:chronyd(8)
             man:chrony.conf(5)
[root@testvm1 ~]#

Kiểm tra trạng thái trước khi ra mắt

Trạng thái đồng bộ hóa đồng hồ hệ thống cho phép bạn xác định xem dịch vụ NTP có đang chạy hay không. Vì bạn chưa khởi động NTP nên lệnh timesync-status sẽ gợi ý điều này:

[root@testvm1 ~]# timedatectl timesync-status
Failed to query server: Could not activate remote peer.

Một yêu cầu trạng thái trực tiếp cung cấp thông tin quan trọng. Ví dụ: lệnh timedatectl không có đối số hoặc tùy chọn sẽ thực thi lệnh con trạng thái theo mặc định:

[root@testvm1 ~]# timedatectl status
           Local time: Fri 2020-05-15 08:43:10 EDT  
           Universal time: Fri 2020-05-15 12:43:10 UTC  
                 RTC time: Fri 2020-05-15 08:43:08      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: no                          
              NTP service: inactive                    
          RTC in local TZ: yes                    

Warning: The system is configured to read the RTC time in the local time zone.
         This mode cannot be fully supported. It will create various problems
         with time zone changes and daylight saving time adjustments. The RTC
         time is never updated, it relies on external facilities to maintain it.
         If at all possible, use RTC in UTC by calling
         'timedatectl set-local-rtc 0'.
[root@testvm1 ~]#

Điều này sẽ cung cấp cho bạn giờ địa phương cho máy chủ lưu trữ, giờ UTC và giờ RTC của bạn. Trong trường hợp này, thời gian hệ thống được đặt thành múi giờ Mỹ / New_York (TZ), RTC được đặt thành thời gian theo múi giờ địa phương và dịch vụ NTP không hoạt động. Thời gian RTC đã bắt đầu lệch một chút so với thời gian hệ thống. Điều này là bình thường đối với các hệ thống có đồng hồ chưa được đồng bộ hóa. Lượng bù trừ trên máy chủ tùy thuộc vào thời gian đã trôi qua kể từ khi hệ thống được đồng bộ hóa lần cuối.

Chúng tôi cũng nhận được cảnh báo về việc sử dụng giờ địa phương cho RTC - điều này áp dụng cho các thay đổi múi giờ và cài đặt DST. Nếu máy tính bị tắt khi cần thực hiện thay đổi, RTC sẽ không thay đổi. Nhưng đối với các máy chủ hoặc máy chủ khác chạy suốt ngày đêm, đây hoàn toàn không phải là vấn đề. Ngoài ra, bất kỳ dịch vụ nào cung cấp đồng bộ hóa thời gian NTP sẽ điều chỉnh thời gian của máy chủ trong giai đoạn khởi động ban đầu, vì vậy thời gian sẽ chính xác trở lại sau khi quá trình khởi động hoàn tất.

Đặt múi giờ

Thông thường, bạn chỉ định múi giờ trong quá trình cài đặt và bạn không có nhiệm vụ thay đổi nó sau này. Tuy nhiên, có những lúc bạn cần thay đổi múi giờ. Có một số công cụ có thể giúp đỡ. Linux sử dụng các tệp múi giờ để xác định múi giờ cục bộ của máy chủ lưu trữ. Các tệp này nằm trong thư mục / usr / share / zoneinfo. Theo mặc định, đối với múi giờ của tôi, hệ thống quy định điều này: /etc/localtime -> ../usr/share/zoneinfo/America/New_York. Nhưng bạn không cần phải biết những điều tinh tế như vậy để thay đổi múi giờ.

Điều chính là phải biết tên múi giờ chính thức cho vị trí của bạn và lệnh tương ứng. Giả sử bạn muốn thay đổi múi giờ thành Los Angeles:


[root@testvm2 ~]# timedatectl list-timezones | column
<SNIP>
America/La_Paz                  Europe/Budapest
America/Lima                    Europe/Chisinau
America/Los_Angeles             Europe/Copenhagen
America/Maceio                  Europe/Dublin
America/Managua                 Europe/Gibraltar
America/Manaus                  Europe/Helsinki
<SNIP>

Bây giờ bạn có thể đặt múi giờ. Tôi đã sử dụng lệnh date để kiểm tra các thay đổi, nhưng bạn cũng có thể sử dụng timedatectl:

[root@testvm2 ~]# date
Tue 19 May 2020 04:47:49 PM EDT
[root@testvm2 ~]# timedatectl set-timezone America/Los_Angeles
[root@testvm2 ~]# date
Tue 19 May 2020 01:48:23 PM PDT
[root@testvm2 ~]#

Giờ đây, bạn có thể thay đổi múi giờ của máy chủ về giờ địa phương.

systemd-timesyncd

Trình nền systemd timesync cung cấp một triển khai NTP dễ quản lý trong ngữ cảnh systemd. Nó được cài đặt mặc định trên Fedora và Ubuntu. Tuy nhiên, nó chỉ khởi động theo mặc định trên Ubuntu. Tôi không chắc chắn về các bản phân phối khác. Bạn có thể tự kiểm tra:

[root@testvm1 ~]# systemctl status systemd-timesyncd

Định cấu hình systemd-timesyncd

Tệp cấu hình cho systemd-timesyncd là /etc/systemd/timesyncd.conf. Đây là một tệp đơn giản với ít tùy chọn được bật hơn các dịch vụ NTP và chronyd cũ. Đây là nội dung của tệp này (không cần sửa đổi thêm) trên máy ảo Fedora của tôi:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.

[Time]
#NTP=
#FallbackNTP=0.fedora.pool.ntp.org 1.fedora.pool.ntp.org 2.fedora.pool.ntp.org 3.fedora.pool.ntp.org
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

Phần duy nhất nó chứa, bên cạnh các bình luận, là [Thời gian]. Tất cả các dòng khác được nhận xét. Đây là những giá trị mặc định và không nên thay đổi (trừ khi bạn có lý do để thay đổi). Nếu bạn không xác định máy chủ thời gian NTP trong dòng NTP=, Fedora sẽ mặc định là máy chủ thời gian Fedora dự phòng. Tôi thường thêm máy chủ thời gian của mình:

NTP=myntpserver

Chạy đồng bộ thời gian

Bạn có thể bắt đầu và kích hoạt systemd-timesyncd như thế này:

[root@testvm2 ~]# systemctl enable systemd-timesyncd.service
Created symlink /etc/systemd/system/dbus-org.freedesktop.timesync1.service → /usr/lib/systemd/system/systemd-timesyncd.service.
Created symlink /etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service → /usr/lib/systemd/system/systemd-timesyncd.service.
[root@testvm2 ~]# systemctl start systemd-timesyncd.service
[root@testvm2 ~]#

Đặt đồng hồ phần cứng

Đây là tình huống sau khi chạy timesyncd:

[root@testvm2 systemd]# timedatectl
               Local time: Sat 2020-05-16 14:34:54 EDT  
           Universal time: Sat 2020-05-16 18:34:54 UTC  
                 RTC time: Sat 2020-05-16 14:34:53      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes                          
              NTP service: active                      
          RTC in local TZ: no    

Ban đầu, chênh lệch giữa RTC và giờ địa phương (EDT) nhỏ hơn một giây và chênh lệch này sẽ tăng thêm vài giây trong vài ngày tới. Do không có khái niệm múi giờ trong RTC nên lệnh timedatectl phải thực hiện so sánh để xác định đúng múi giờ. Nếu thời gian RTC không khớp chính xác với giờ địa phương, thì nó cũng không khớp với múi giờ địa phương.

Tìm kiếm thêm thông tin, tôi đã kiểm tra trạng thái của systemd-timesync và thấy điều này:

[root@testvm2 systemd]# systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2020-05-16 13:56:53 EDT; 18h ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 822 (systemd-timesyn)
     Status: "Initial synchronization to time server 163.237.218.19:123 (2.fedora.pool.ntp.org)."
      Tasks: 2 (limit: 10365)
     Memory: 2.8M
        CPU: 476ms
     CGroup: /system.slice/systemd-timesyncd.service
             └─822 /usr/lib/systemd/systemd-timesyncd

May 16 09:57:24 testvm2.both.org systemd[1]: Starting Network Time Synchronization...
May 16 09:57:24 testvm2.both.org systemd-timesyncd[822]: System clock time unset or jumped backwards, restoring from recorded timestamp: Sat 2020-05-16 13:56:53 EDT
May 16 13:56:53 testvm2.both.org systemd[1]: Started Network Time Synchronization.
May 16 13:57:56 testvm2.both.org systemd-timesyncd[822]: Initial synchronization to time server 163.237.218.19:123 (2.fedora.pool.ntp.org).
[root@testvm2 systemd]#

Lưu ý thông báo nhật ký cho biết thời gian hệ thống chưa được đặt hoặc đã được đặt lại. Dịch vụ Đồng bộ thời gian đặt thời gian hệ thống dựa trên dấu thời gian. Dấu thời gian được duy trì bởi trình nền đồng bộ hóa thời gian và được tạo trên mỗi lần đồng bộ hóa thành công.

Lệnh timedatectl không có cách nào lấy giá trị của đồng hồ phần cứng từ đồng hồ hệ thống. Nó chỉ có thể đặt thời gian và ngày từ giá trị được nhập trên dòng lệnh. Bạn có thể đặt RTC thành cùng giá trị với thời gian hệ thống bằng cách sử dụng lệnh hwclock:

[root@testvm2 ~]# /sbin/hwclock --systohc --localtime
[root@testvm2 ~]# timedatectl
               Local time: Mon 2020-05-18 13:56:46 EDT  
           Universal time: Mon 2020-05-18 17:56:46 UTC  
                 RTC time: Mon 2020-05-18 13:56:46      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes                          
              NTP service: active                      
          RTC in local TZ: yes

Tùy chọn --localtime báo cho đồng hồ phần cứng hiển thị giờ địa phương, không phải UTC.

Tại sao bạn cần RTC?

Mọi triển khai NTP sẽ đặt đồng hồ hệ thống khi khởi động. Và tại sao sau đó RTC? Điều này không hoàn toàn đúng: điều này sẽ chỉ xảy ra nếu bạn có kết nối mạng với máy chủ thời gian. Tuy nhiên, nhiều hệ thống không phải lúc nào cũng có quyền truy cập vào kết nối mạng, do đó, đồng hồ phần cứng rất hữu ích cho Linux sử dụng để đặt thời gian hệ thống. Điều này tốt hơn so với việc cài đặt thời gian theo cách thủ công, mặc dù nó có thể sai lệch so với thời gian thực.

Kết luận

Bài viết này đã xem xét một số công cụ để thao tác ngày, giờ và múi giờ. Công cụ systemd-timesyncd cung cấp ứng dụng khách NTP có thể đồng bộ hóa thời gian trên máy chủ cục bộ với máy chủ NTP. Tuy nhiên, systemd-timesyncd không cung cấp dịch vụ máy chủ, vì vậy nếu bạn cần một máy chủ NTP trên mạng của mình, bạn phải sử dụng một thứ khác, chẳng hạn như Chrony, để hoạt động như một máy chủ.

Tôi muốn có một triển khai duy nhất cho bất kỳ dịch vụ nào trên mạng của mình, vì vậy tôi sử dụng Chrony. Nếu bạn không cần máy chủ NTP cục bộ hoặc nếu bạn không phiền khi sử dụng Chrony làm máy chủ và systemd-timesyncd làm máy khách SNTP. Rốt cuộc, không cần sử dụng các tính năng bổ sung của Chrony với tư cách là khách hàng nếu bạn hài lòng với chức năng của systemd-timesyncd.

Một lưu ý khác: bạn không bắt buộc phải sử dụng các công cụ systemd để triển khai NTP. Bạn có thể sử dụng phiên bản cũ hơn của ntpd, Chrony hoặc triển khai NTP khác. Rốt cuộc, systemd bao gồm một số lượng lớn các dịch vụ; nhiều trong số chúng là tùy chọn, vì vậy bạn có thể tắt chúng đi và sử dụng thứ khác thay thế. Đây không phải là một con quái vật nguyên khối khổng lồ. Bạn có thể không thích systemd hoặc các phần của nó, nhưng bạn nên đưa ra quyết định sáng suốt.

Tôi thích triển khai NTP của systemd, nhưng tôi thích Chrony hơn vì nó phù hợp với nhu cầu của tôi hơn. Đó là Linux, em yêu -)

Như một quảng cáo

VDSina ưu đãi máy chủ cho bất kỳ nhiệm vụ nào, rất nhiều lựa chọn hệ điều hành để cài đặt tự động, có thể cài đặt bất kỳ hệ điều hành nào từ hệ điều hành của riêng bạn ISO, thoải mái bảng điều khiển phát triển riêng và thanh toán hàng ngày. Hãy nhớ rằng chúng tôi có các máy chủ vĩnh cửu chắc chắn là vượt thời gian 😉

Đồng bộ hóa thời gian Linux: NTP, Chrony và systemd-timesyncd

Nguồn: www.habr.com

Thêm một lời nhận xét