Linux 時間同步systemd-timesyncd介紹


在Linux系統中存在兩個時鍾時間,分別是

硬件時鍾RTC(Real Time Clock)
系統時鍾(System Clock)
硬件時鍾是指的在主板上的時鍾設備,也就是通常可以在BIOS畫面設置的時鍾,即使關機狀態也可以計算時間。

而系統時鍾則是指Kernel中的時鍾,其值是由1970年1月1日00:00:00 UTC時間至當前時間所經歷的秒數總和。當Linux啟動的時候,系統時鍾會讀取硬件時鍾的設定,之后系統時鍾獨立運作。長時間運行兩者可能將會產生誤差。另外所有的Linux相關指令都是讀取系統時鍾指定的,如date。

我們這里討論的是系統時間。

NTP
NTP,網絡時間協議,使用 123/udp 端口進行網絡時鍾同步;NTP 是仍在使用中的最古老的網絡傳輸協議之一(1985 年前開始)。

NTP軟件的實現方法:
1、以前Linux時間同步基本是使用 ntpdate 和 ntpd 這兩個工具實現的,但是這兩個工具已經很古老了。后面的文章會單獨介紹
注:ntpdate和ntpd是互斥的,兩者不能同時使用。ntpd是步進式平滑的逐漸調整時間,而ntpdate是斷點式更新時間。

2、RHEL/CentOS 7.x 已經將 chrony 作為默認時間同步工具了。后面的文章會單獨介紹

3、其他Linux (如 ubuntu,debian,openSUSE) 使用 systemd-timesyncd 服務。下面主要針對這個進行介紹
注:systemd-timesyncd是斷點式更新時間,也就是時間不同立即更新,這樣會對某些服務產生影響,所以在生產環境盡量不要用,在桌面環境或者是系統剛開機時來進行時間同步還是很好的。timesyncd 替代了 ntpd 的客戶端的部分。默認情況下 timesyncd 會定期檢測並同步時間。它還會在本地存儲更新的時間,以便在系統重啟時做時間單步調整。如果是虛擬機環境,應該把與主機時間同步功能關閉后在啟用systemd-timesyncd,否則可能會有問題,systemd-timesyncd只能作為客戶端,不能作為NTP服務器,要成為NTP服務器,可以安裝chrony、ntpd,或者open-ntp。推薦chrony。

一、systemd-timesyncd 客戶端
systemd 提供了 systemd-timesyncd 客戶端,它是一個用於跨網絡同步系統時鍾的守護服務。它實現了一個 SNTP 客戶端。與NTP的復雜實現相比,這個服務簡單的多,它只專注於從遠程服務器查詢然后同步到本地時鍾。在/etc/systemd/timesyncd.conf 中配置你的(時間)服務器。大多數 Linux 發行版都提供了一個默認配置,它指向發行版維護的時間服務器上。systemd-timesyncd只會更改系統時間不會更改硬件時間,可以通過hwclock -w命令將系統時間同步到硬件時間

1、通過timedatectl命令查看時鍾是否與互聯網同步。只需運行:
----------------------------------
OpenSUSE:~ # timedatectl      ##openSUSE15.1下查看
Local time: Tue 2020-05-05 10:38:53 CST      ##本地時間
Universal time: Tue 2020-05-05 02:38:53 UTC    ##協調世界時
RTC time: Tue 2020-05-05 02:38:51          ##硬件時間
Time zone: Asia/Shanghai (CST, +0800)        ##時區,我這里為東8區
Network time on: yes       ##NTP時間同步是否開啟,yes表示是
NTP synchronized: yes        ##如果和遠程NTP服務器成功同步,顯示為yes
RTC in local TZ: no                        ##no表示硬件時鍾設置為協調世界時(UTC),yes表示硬件時鍾設置為本地時間
----------------------------------
root@HP:~# timedatectl      ##Ubuntu18.04下查看,下面的說明都以Ubuntu系統為例說明
Local time: 二 2020-05-05 14:52:52 CST
Universal time: 二 2020-05-05 06:52:52 UTC
RTC time: 二 2020-05-05 06:52:52
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes         ##如果和遠程NTP服務器成功同步,顯示為yes
systemd-timesyncd.service active: yes    ##NTP時間同步是否開啟,yes表示是,systemd-timesyncd服務為活動也就是開啟了NTP時間同步
RTC in local TZ: no
----------------------------------
如上所示,timedatectl 命令顯示本地時間、世界時、時區以及系統時鍾是否與互聯網服務器同步,以及 systemd-timesyncd.service 是處於活動狀態還是非活動狀態。

2、如果時鍾不同步,你會看到下面中顯示的 System clock synchronized: no。
----------------------------------
root@HP:~# timedatectl
Local time: 二 2020-05-05 15:22:06 CST
Universal time: 二 2020-05-05 07:22:06 UTC
RTC time: 二 2020-05-05 07:22:06
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
systemd-timesyncd.service active: yes
RTC in local TZ: no
----------------------------------
時間同步已禁用。

注意:上面的截圖是舊截圖。這就是你看到不同日期的原因。

3、如果你看到 System clock synchronized: 值設置為 no,那么 timesyncd 服務可能處於非活動狀態。因此,只需重啟服務並看下是否正常。
----------------------------------
root@HP:~# systemctl restart systemd-timesyncd.service
----------------------------------

4、現在檢查 timesyncd 服務狀態:
----------------------------------
root@HP:~# systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset
Active: active (running) since Tue 2020-05-05 15:14:18 CST; 5h 6min ago
Docs: man:systemd-timesyncd.service(8)
Main PID: 5973 (systemd-timesyn)
Status: "Synchronized to time server [2001:67c:1560:8003::c8]:123 (ntp.ubuntu.com)."      ##這里很重要這里顯示了同步的NTP服務器及端口號
Tasks: 2 (limit: 4915)
CGroup: /system.slice/systemd-timesyncd.service
└─5973 /lib/systemd/systemd-timesyncd

5月 05 15:14:17 HP systemd[1]: Starting Network Time Synchronization...
5月 05 15:14:18 HP systemd[1]: Started Network Time Synchronization.
5月 05 15:14:18 HP systemd-timesyncd[5973]: Synchronized to time server [2001:67c:1560:8
5月 05 20:10:48 HP systemd-timesyncd[5973]: Synchronized to time server [2001:67c:1560:8
lines 1-14/14 (END)
----------------------------------
如果此服務已啟用並處於活動狀態,那么系統時鍾應與互聯網時間服務器同步。

可以使用timedatectl命令驗證是否啟用了時間同步:

5、如果仍然不起作用,請運行以下命令以啟用時間同步:
----------------------------------
root@HP:~# timedatectl set-ntp true
----------------------------------
現在,你的系統時鍾將與互聯網時間服務器同步

6、要禁用NTP時間同步,在終端鍵入以下命令。
----------------------------------
root@HP:~# timedatectl set-ntp false
----------------------------------
如果要手工修改時間至某個時間就必須將該項設置為false,否則時間設置不會生效

二、systemd-timesyncd 配置文件
systemd-timesyncd 啟動時會讀取 /etc/systemd/timesyncd.conf 配置文件,內容如下:
----------------------------------
root@HP:~# vi /etc/systemd/timesyncd.conf
[Time]
#NTP=
#FallbackNTP=ntp.ubuntu.com
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
----------------------------------
默認雖然上面的選項都處於注釋狀態,但是systemd-timesyncd還是會去默認的NTP服務器進行同步,如果要更改NTP服務器請修改上面的選項,選項解釋如下:

NTP=
一個空格分隔的NTP服務器列表, 可以使用主機名,也可以使用IP地址。在運行時, 此處設置的列表將與 systemd-networkd.service中已配置的NTP服務器列表合並在一起。 systemd-timesyncd 將會依次嘗試列表中的每個NTP服務器, 直到同步成功為止。 如果為此選項設置一個空字符串, 那么表示清空所有此選項先前已設置的NTP服務器列表。 此選項的默認值為空。

FallbackNTP=
一個空格分隔的NTP服務器列表,用作備用NTP服務器。 可以使用主機名,也可以使用IP地址。 如果所有已配置在 systemd-networkd.service中的NTP服務器以及上述 NTP= 中設置的NTP服務器都嘗試失敗, 那么將嘗試此處設置的備用NTP服務器。 如果為此選項設置一個空字符串, 那么表示清空所有此選項先前已設置的NTP服務器列表。 若未設置此選項, 則使用編譯時設置的默認備用NTP服務器。

RootDistanceMaxSec=
最大可接受的"root distance"秒數(最大誤差)。 默認值為 5 秒。

PollIntervalMinSec=, PollIntervalMaxSec=
NTP消息的 最小/最大輪詢間隔秒數。 PollIntervalMinSec= 必須不小於 16 秒。 PollIntervalMaxSec= 必須大於 PollIntervalMinSec= 。 PollIntervalMinSec= 默認為 32 秒, PollIntervalMaxSec= 默認為 2048 秒。

舉例將同步的NTP服務器設置成國內比較好用的
----------------------------------
root@HP:~# vi /etc/systemd/timesyncd.conf
[Time]
NTP=ntp.ntsc.ac.cn cn.ntp.org.cn     ##只設置NTP這行,其它的不必,增加2個NTP服務器,中間用空格隔開
----------------------------------

重啟systemd-timesyncd服務生效
----------------------------------
root@HP:~# systemctl restart systemd-timesyncd.service
----------------------------------

再次查看服務狀態
----------------------------------
root@HP:~# systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset
Active: active (running) since Tue 2020-05-05 21:56:35 CST; 3s ago
Docs: man:systemd-timesyncd.service(8)
Main PID: 1578 (systemd-timesyn)
Status: "Synchronized to time server 114.118.7.161:123 (ntp.ntsc.ac.cn)."      ##這里已經更改成功
Tasks: 2 (limit: 4915)
CGroup: /system.slice/systemd-timesyncd.service
└─1578 /lib/systemd/systemd-timesyncd

5月 05 21:56:35 HP systemd[1]: Starting Network Time Synchronization...
5月 05 21:56:35 HP systemd[1]: Started Network Time Synchronization.
5月 05 21:56:35 HP systemd-timesyncd[1578]: Synchronized to time server 114.118.7.161:12
root@HP:~#
----------------------------------

 

參考:

https://wiki.archlinux.org/index.php/Systemd-timesyncd_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

http://www.jinbuguo.com/systemd/systemd-networkd.service.html#

https://linux.cn/article-11220-1-rel.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM