幫助Raspberry Pi更好地完成跨網(wǎng)絡(luò)同步系統(tǒng)時(shí)鐘任務(wù)
?? ??????m( ^=∩王∩=^?)m ????????
年前的這幾天因?yàn)楣╇娋€路維修,導(dǎo)致自己的“吃灰派”多次意外斷電。。。擔(dān)心跑在上面的幾個(gè)用戶服務(wù)進(jìn)程數(shù)據(jù)多少會(huì)受到些影響,所以進(jìn)行了一次比較全面的檢查維護(hù)。在查看系統(tǒng)日志的時(shí)候發(fā)現(xiàn)系統(tǒng)時(shí)鐘同步總會(huì)有網(wǎng)絡(luò)超時(shí)的問題:

如果在日常使用中對系統(tǒng)時(shí)鐘的精確度、實(shí)時(shí)性要求不是特別嚴(yán)格的話,這算不上什么大問題,可以選擇忽略。不過借此機(jī)會(huì),打算在解決問題的同時(shí)略微了解一下系統(tǒng)時(shí)鐘同步的服務(wù)(才……才不是因?yàn)橛惺裁雌婀值膹?qiáng)迫癥呢!ヾ(≧へ≦)〃)
同步系統(tǒng)時(shí)鐘的方式一般來說有兩種,通過RTC硬件模塊或NTP網(wǎng)絡(luò)同步時(shí)間,前者需要額外借助RTC硬件電路實(shí)現(xiàn),能夠在不依賴網(wǎng)絡(luò)的情況下完成同步任務(wù);后者需要依賴聯(lián)網(wǎng)完成時(shí)鐘同步,受當(dāng)前網(wǎng)絡(luò)連通狀況的影響較大。樹莓派開發(fā)板是不帶有RTC模塊電路的,所以默認(rèn)是通過NTP網(wǎng)絡(luò)校時(shí),而系統(tǒng)默認(rèn)的NTP同步源在國內(nèi)的表現(xiàn)并不樂觀。雖然外接一個(gè)GPIO接口所能使用的高精度RTC模塊(DS3231),無論是從成本還是后續(xù)實(shí)現(xiàn)的難易程度來說都是完全可接受的,但本著能省則省、減少模塊依賴、增強(qiáng)系統(tǒng)整體穩(wěn)定性的原則,通過解決網(wǎng)絡(luò)授時(shí)超時(shí)的問題,用以滿足高效同步系統(tǒng)時(shí)鐘的需求。很明顯,問題的根源在于NTP網(wǎng)絡(luò)時(shí)鐘同步源的選?。幌胍薷南到y(tǒng)默認(rèn)設(shè)置,就必須要找到相應(yīng)的工具或配置文件。
?? ??????m( ^=∩王∩=^?)m ????????
我自己的樹莓派上面運(yùn)行的是raspios-buster-arm64-lite官方系統(tǒng),具體信息如下:
百度一下有關(guān)樹莓派系統(tǒng)時(shí)鐘同步的方案,大部分都是提供如何調(diào)整本地時(shí)區(qū)或者通過安裝額外的NTP授時(shí)工具包的解決問題??上У氖?,我的系統(tǒng)時(shí)區(qū)設(shè)置并無問題(Time zone: Asia/Shanghai (CST, +0800)),也并不愿意再額外引入軟件包用于解決這個(gè)無關(guān)痛癢的問題;既然系統(tǒng)默認(rèn)能夠?qū)崿F(xiàn)NTP同步系統(tǒng)時(shí)鐘的功能,那么一定存在某種機(jī)制或工具來控制這一切,簡單檢索一下systemd服務(wù)提供的各種便捷功能,暫且找到與系統(tǒng)時(shí)間最為密切的管理工具timedatectl,習(xí)慣性地man一下:
同時(shí)順藤摸瓜式地找到systemd-timesyncd守護(hù)服務(wù),最直接相關(guān)的配置文件大概率是在/etc/systemd/路徑下,存在一個(gè)名為timesyncd.conf的配置文件:
至此基本可以確定自己的推測了,查閱timesyncd.conf幫助文檔進(jìn)一步證實(shí):
完整地閱讀幫助文檔可以得知,當(dāng)配置中的NTP服務(wù)列表缺省時(shí),默認(rèn)采用FallbackNTP列表中的NTP時(shí)鐘同步源進(jìn)行校時(shí)。那么解決方案就是在timesyncd.conf配置文件中添加合適的NTP服務(wù)主機(jī)名或ip,彼此之間并用空格隔開。百度一下可用的NTP授時(shí)服務(wù)并測試網(wǎng)絡(luò)延遲,以我的為例,選擇國內(nèi)的NTP網(wǎng)絡(luò)時(shí)鐘同步服務(wù)主機(jī),找最適合自己的:
ntp.ntsc.ac.cn

ntp.tuna.tsinghua.edu.cn

最終配置內(nèi)容如下,剔除 # 取消注釋,僅以列表格式修改了NTP項(xiàng)的內(nèi)容,其他配置項(xiàng)默認(rèn)即可:

保存并退出,重新載入系統(tǒng)時(shí)鐘同步服務(wù)、檢查服務(wù)進(jìn)程狀態(tài),按預(yù)期完成了同步任務(wù):
$ sudo systemctl restart systemd-timesyncd.service
$ systemctl status systemd-timesyncd.service

再次檢查系統(tǒng)日志記錄,確認(rèn)是“一命通關(guān)”:

使用timedatectl可以獲取更詳細(xì)的時(shí)鐘同步信息:

當(dāng)然,這一切的前提是你的系統(tǒng)時(shí)區(qū)設(shè)置符合預(yù)期、網(wǎng)絡(luò)時(shí)鐘同步功能開啟,可以參考以下幫助內(nèi)容:
?? ??????m( ^=∩王∩=^?)m ????????
以上方法應(yīng)該也同樣適用于Debian或基于Debian的各類GNU/Linux發(fā)行版,只能說systemd服務(wù)所提供的功能實(shí)在是太豐富、太實(shí)用了,值得花時(shí)間去了解、學(xué)習(xí)。
參考資料:
https://manpages.debian.org/buster/systemd/timedatectl.1.en.html
https://manpages.debian.org/buster/systemd/timesyncd.conf.5.en.html
https://wiki.archlinux.org/title/Systemd-timesyncd_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
https://dns.icoa.cn/ntp/
