Linux中如何實現網絡對時,其中一種做法是請求【NTP服務器】來實現精准對時,這種做法相對來說更加精准,更加便捷。
步驟1:首先,NTP對時的第一步是要驗證你手中的板子與你的【NTP服務器】之間的網絡通信是否正常,驗證網絡是否正常就不贅述了,【ping】一下就好,地址解析不出來的就檢查一下自己【DNS】設置。
步驟2:網絡通信沒有問題的情況下,嘗試用【ntpdate】命令請求一下【NTP服務器】,以驗證功能是否能夠滿足要求。
發現自己沒有這個命令,這時候可以考慮安裝命令,由於系統是自己做的,所以選擇直接用【buildroot】勾選編譯,如圖所示。
勾選編譯,一切正常。
開始驗證,【ntpdate $IP】,$IP就是【NTP服務器】的IP地址。
這樣是正常的。
如果看到同步成功,但是【date】所顯示的時間卻不正確,就要觀察一下,是不是【時區】設置的有問題,因為這種情況我也遇到了,由於之前設置時間的時候,並沒有關注時區,只是單純的把時間修改掉了,所以看起來像是沒什么問題,但是到了網絡自動對時的時候,會根據你當前設置的【時區】來完成對時。
要查看時區,最簡便的方式是查看【date】命令輸出后面的這三個字母,如圖所示。
原本我這里是【UTC】,因此NTP同步成功后,時間比真實的早8個小時。
那么問題來了,如何修改時區?
如果你是用現成的系統,系統里已經有【zoneinfo】,那就按照網絡中描述的改變鏈接文件的方式修改就好,但是如果這屬於你構建系統的一部分,可以參考我的另一篇隨筆【https://www.cnblogs.com/J-YANG/p/14822231.html】。
修改完時區,這時候再看剛剛同步的時間就正常了。
步驟3:現在【date】已經被同步,但是這個時間並不會長久保存,此時需要將時間寫入【RTC】。
需要用到【hwclock】,這里要提醒一點,【hwclock】保存進去的時間沒有時區這個概念。
比如我現在用的是【CST】時間,如圖。如果直接用【hwclock -w】,那么我保存進去的時間就如圖所示,原封不動保存進去,那么當我有一天要取出【RTC】時間,將它設置到系統里時,就要用【hwclock -s】。
但是如果我希望保存到【RTC】中的時間是【UTC】,以方便今后不管【時區】如何設置,都可以很輕松的轉換過去,不用再重新同步,那就要考慮在【RTC】中保存【UTC】時間。當然,如果要保存【UTC】時間,那么取出來設置到系統里的時候也要相應的轉換一下,如圖所示。
這兩種方式搭配起來看就更好理解了。
從【RTC】中讀取出來設置到system,這個動作可以考慮加入到開機啟動腳本。
結語:3個步驟就完成了【通過請求NTP服務器實現網絡對時】,可以看出這件事情並不難,但是里面有幾個需要注意的點,真正處理好這些方面才能更好的完成整個系統的構建。