Linux系統時間、系統時區和時鐘同步

2022-01-08 小邱的售前日記

Linux系統時間、系統時區和時鐘同步的部分理解

1、寫在前面

因為最近一段時間以來,本人在項目遇到的因為Linux系統時間所引發的問題比較多,所以在此進行總結。

2、Linux系統時間與BIOS硬體時間之間的關係2.1、RTC晶片、i2c總線和BIOS之間的關係

實時時鐘(RTC)晶片是普遍應用在集成電路上的一個模塊,採用內置的高精度晶體振蕩器作為時鐘源,在PC和伺服器中,為了保證RTC在主機斷電後還可以繼續保持運轉,整機廠商還會在主板上焊接電池模塊對RTC進行供電。也就是說,對於一個整機設備而言,RTC晶片是一切時間的來源。

i2c總線是集成電路上的一種通信鏈路,連接集成商電路上各個硬體模塊,在本文中主要是用於連接主機(BIOS)和RTC晶片,通常情況下,系統關機時CPU會清空其寄存器,這就導致了設備在再一次啟動時,會通過i2c總線初始化訪問RTC。

粗略的邏輯如下圖所示:

而站在BIOS的角度,實際上是開放了一個i2c接口供上層的作業系統進行調用,以讀取RTC時間,因此本文後文中所闡述的「BIOS時間」,本質上就是BIOS通過i2c總線讀取到的RTC晶片時間

關於主機(BIOS)通過i2c總線和RTC晶片進行通信和數據傳輸的具體原理涉及集成電路相關知識,站在Linux系統運維的角度,只要了解上述最基本概念即可。

2.2、Linux將BIOS時間視作UTC時間(協調世界時),而Windows則認為BIOS時間就是本地時區的時間

Linux系統對於BIOS硬體時間的處理方式與Windows對於BIOS硬體時間的處理是有區別的,Windows和Linux的系統時間在沒有NTP伺服器的情況下,均讀取自BIOS的時間。Windows系統會BIOS時間作為當下本地時區的時間;而Linux系統則會將BIOS時間作為UTC時間(協調世界時),然後根據系統設定的本地時區進行增加或者減少相應的小時數。(如,假使BIOS時間是10:00,且兩個系統的時區都設定為東八區的上海時間,Windows系統會認為10:00就是上海時間,而Linux會在10:00的基礎上增加8個小時,最後認為18:00為上海時間)

Windows和Linux對待BIOS硬體時間不同所造成的最直接的現象在於,在安裝Windows+Linux的雙系統時,兩個系統之間的系統時間會相差8個小時(相對於東八區而言)。而如果想要消除「雙系統8小時時差」這樣的現象,可以在Linux系統上通過「hwclock -w」命令將Linux系統時間和BIOS時間同步為一致,即可解決。

2.3、Linux怎樣更新系統時間

Linux系統有兩個時間,一個是系統時間,另一個是BIOS時間。Linux系統在啟動時,會自動讀取BIOS時間作為系統時間,如果讀取不到BIOS時間,則會將上一次成功讀取到BIOS時間作為本次的系統時間,Linux系統成功啟動完成後,假使Linux開啟了時鐘自動同步功能並成功連接到NTP伺服器上,則會將NTP伺服器上的時間作為本機的系統時間。相關流程圖如下所示:

以上流程圖是Linux系統啟動時的流程圖,Linux關機時,還會將系統時間寫入到BIOS時間中,以保持軟硬體時間同步。

3、未安裝ntpdate或chronyc的情況下,Linux如何實現與NTP伺服器時間的同步

在很多Linux教材中,談到時間同步的時候,絕大多數都是通過ntpdate命令與安裝有ntpd的時鐘伺服器同步,或者是通過chronyc命令與安裝有chrony的時鐘伺服器同步,但對於客戶端而言,ntpdate和chronyc都不是Linux自帶的時間同步命令,需要額外安裝。而像debian等這樣的Linux發行版,其本身又可以進行時間同步,那這樣的時間同步又是怎樣實現的呢?其實這都歸功於Linux中的systemd-timesyncd.service服務,相關服務可以通過命令「systemctl status systemd-timesyncd.service」命令查看,如果相關的服務為active狀態,說明時間同步服務時開啟的,如下圖所示:

既然有相關服務,就會有相關的配置文件,systemd-timeryncd.service服務的配置文件位於「/etc/systemd」路徑下,文件名稱為「timesyncd.conf」,如下圖所示:

將相關配置文件打開後,我們可以看到內容如下:

按照譯者金步國的博客(http://www.jinbuguo.com/systemd/timesyncd.conf.html#NTP=)針對於timesyncd.conf文件參數欄位的解釋,我們可以獲知到以下信息:

參數欄位

解釋

NTP=

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

FallbackNTP=

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

RootDistanceMaxSec=

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

PollIntervalMinSec=, PollIntervalMaxSec=

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

NTP欄位後添加了一個NTP地址後(需要刪除前面「#」以取消注釋),通過命令「systemctl restart systemd-timesyncd.service」即可完成與NTP伺服器的時間同步,而不需要額外安裝ntpdate和chronyc工具,如果NTP欄位後的伺服器連接或同步失敗,則會去匹配FallbackNTP欄位後的NTP伺服器。

上述提到,配置文件timesyncd.conf在路徑/etc/systemd下影響時間同步服務的進行,而有的發行版(如deepin V20.2.4),在/etc/systemd目錄下還有一個timesyncd.conf.d文件夾,該文件夾下還有一個配置文件,在deepin系統中,該文件的文件名為deepin.conf,其內容編寫規則與/etc/systemd/timesyncd.conf一致。如果某個Linux發行版和deepin一樣具有/etc/systemd/system.d/timesyncd.conf文件夾,那麼systemd-timesyncd.service服務將優先選擇這個文件夾下的.conf文件作為自己的優先配置文件,而原有的/etc/systemd/timesyncd.conf將作為備用的配置文件,優先級相對較低。

4、Linux系統時區的注意事項4.1、Linux的世界裡,沒有北京時間

本章節具體闡述前,我們或許可以這樣說——「Linux的世界裡,實際上不存在北京時間」。

之所以這樣說,是因為Linux系統普遍採用IANA(網際網路數字分配機構)的時區資料庫(Time Zone Database)作為系統的時區。在該資料庫中,中國地區的IANA標準時區有四個——上海、香港、澳門和臺北,因此「北京時間」在Linux系統裡面本質上是沒有的,不過不同的Linux發行版會對這個時區資料庫做修改,如debian系統,增加有「重慶時間」,deepin系統則將中國省份增加得更多,如北京、重慶、成都、西安、南京、烏魯木齊等等,這些時區各對應了一個時區相關文件,位於/usr/share/zoneinfo或/usr/share/zoneinfo/Asia目錄下。而針對於debian、deepin等系統自行修改添加的時區,其本質上是在相應的目錄下創建了一個連結文件指向上海時區的時區文件,畢竟上海時區是IANA規定的標準時區。相關連結文件如下所示(以debian中的重慶時間為例):

當然也有例外,像OpenEuler,則沒有採用連結文件形式指向上海。

4.2、Linux設置時區時應儘可能設置IANA標準時區

之所以要將Linux儘可能設置為IANA標準時區,是針對於和涉及到時區相關定製開發Linux軟體而言的。因為全球的Linux發行版有幾百種,並且這些發行版的非IANA標準時區都不同,在不同的開發人員採用不同的Linux發行版當開發環境情況下,會出現他們所開發的軟體沒能適配很多非IANA標準時區,這將導致一些問題——比如某個Linux系統時區為非IANA標準的北京時區,因運行的軟體只適配了IANA標準的上海時間,所以此時軟體內的時間會顯示為UTC時間(數值上等同於零區的格林尼治時間,與北京時間有8小時時差),但系統時間仍舊是正確的北京時間,這會給最終的使用者帶來很不好的體驗。

4.3、典型故障——無論怎樣修改時區,Linux系統始終都顯示零區的格林尼治時間

出現這樣的情況一般是因為/usr/share/zoneinfo目錄遭到嚴重破壞造成的,針對這樣的故障,最簡單粗暴的方式就是將找到一套同版本、正常運行的Linux發行版,將其/usr/share/zoneinfo目錄複製出來,對故障Linux系統的相關目錄進行替換。

4.4、典型故障——安全軟體在啟動時強制打開作業系統時間同步功能,後因安全軟體服務端時間錯誤導致時鐘錯誤同步

在信創領域,Linux殺毒軟體經常被安裝在Linux電腦上,用於病毒查殺和違規外聯等功能。而主流的Linux殺毒軟體都具有審計功能,審計會產生大量的日誌紀錄,這些紀錄需要有一個時間對應,因此這些殺毒軟體的服務端會自帶時鐘同步,並且會在Linux終端啟動完成後強制打開和配置作業系統的時鐘同步功能,如果殺毒軟體服務端的本地時間時錯誤的,或者說同一個區域網內有多個存在一定時間差的NTP伺服器,將可能會對Linux終端帶來時間上的錯誤。

4.5、典型故障——Linux系統在啟動完成後,時間大約是上一次關機後的時間

針對於這樣的故障情況,不要嘗試重啟Linux系統,因為時間出現問題的現象很可能是概率性的,重啟後故障可能就不會復現出來了,所以此時可以按照以下幾個思路進行排查:

(1)通過輸入「date」命令查看系統時間,以及「hwclock --show」命令查看硬體時間,對比兩者是否一致,如果不一致,且顯示出來的硬體時間接近設備上一次關機的時間,則需要檢查硬體主板上相應的供電模塊是否工作正常,以及主板存在多少塊RTC晶片,如果有多塊RTC晶片,就需要查看兩塊RTC晶片的時間是否一致,而如果出現下圖所示的錯誤信息,則代表系統本身無法讀取硬體,則需要進一步排查硬體層面原因,如RTC晶片和i2c總線;(在這裡其實可以不用再排查Linux系統的時鐘驅動了,因為前提是「錯誤時間大約是上一次關機的時間」,說明上次使用時,時間是正常的,正常就代表系統的時鐘驅動本身是可以正常運轉的)

(2)如果需要進一步排查RTC晶片,上述(1)中已經說明需要查看存在多少塊RTC晶片,相關操作方式為——查看/etc/sys/class/rtc目錄下的文件,會出現rtcX形式的文件夾,有多少個這樣文件夾,就說明設備有多少個RTC晶片,我們可以進入rtcX文件夾,並輸入「cat time」命令去查看time文件,如果報出下圖所示錯誤,則說明Linux系統或BIOS之間存在i2c總線層面的通信存在錯誤:

(3)系統通過命令「hwclock --show」讀取硬體時間時,實際上並不是兩塊RTC晶片都會讀取,而是會選擇其中一塊RTC進行讀取,如果讀取到錯誤時間的RTC晶片,則可以手動將系統時間修改正確後,通過「hwclock -w」命令將系統時間寫入硬體後,做後續觀察;

5、擴展補充:協調世界時(UTC)和格林尼治標準時(GMT)的區別

格林尼治標準時(GMT),是指英國皇家格林尼治天文臺的標準時間,因地理學上的本初子午線被定義為通過在格林尼治天文臺的經線,因此理論上格林尼治標準時間的正午是指當太陽橫穿本初子午線時的時間。由於地球在其橢圓軌道裡的運動速度不均勻,該時刻可能和實際的太陽時相差16分鐘。加之地球每天的自轉是不規則的,且自轉速度正在緩慢減速。所以,格林尼治時間已經不再被作為標準時間使用,取而代之的是基於國際原子時秒長為基礎的協調世界時(UTC)。

原子時秒的定義:銫-133原子基態的兩個超精細能級間在零磁場下躍遷輻射9,192,631,770周所持續的時間。

目前,UTC被應用在網際網路和全球資訊網標準中,例如NTP(網絡時間協議)就是UTC被使用在網際網路中的一種方式,而日常生活中,在不需要將時間精度控制在秒的情況下,UTC可以被視作和GMT等同。

相關焦點

  • linux下ntp時鐘同步的搭建和使用(超詳細)
    NTP(Network Time Protocol),即網絡時間協議,它是用來同步網絡中各個計算機的時間的一種協議。在生產和學習過程中,是一個最容易被忽略卻又很重要的協議。rpm -qa |grep ntp二、伺服器配置1、linux的centos下,確認123埠開啟,或iptables中已開啟,亦可根據需要關閉iptales。
  • Linux - 時區和時間調整方法
    前言全球不同的地方有不同的時區劃分,所有了以全球標準時間(UTC)和本地時間(localtime)區別。一般我們都設置成本地時間,方便操作與統計。機器裡有兩個時鐘,硬體時鐘從根本上講是CMOS時鐘,而系統時鐘是由內核維護的。
  • 安裝完Win10系統,通過更改時區設置,查看不同時區的日期和時間
    書接上回,今天小編將為小夥伴們介紹Windows 10作業系統如何設置系統的時區。上回書說到,在安裝Windows 10作業系統的過程中,其中有一個步驟是要求用戶設置時區。在安裝完作業系統後,用戶可以隨時更改時區設置,從而可以查看不同時區中的日期和時間。
  • centos vps修改時間及時區不同步的終極解決方案
    centos vps修改時間及時區不同步的終極解決方案 由於初次使用hyper-v架構的VPS而且買前要指定裝windows還是centos系統,因為木有重裝的面板,對於用慣debian
  • Linux時間同步
    上周講到了守護進程的管理,這周就來講講守護進程中的時間同步守護進程。不管是windows還是linux,都會涉及到時間同步,我們的系統時間是一個標準的時間,由於系統運行時間過長,伴隨著各方面的原因,時間總會多多少少出現一些微小的差距。而伺服器如果時間與標準時間出現差別的話,會出現某些問題,因為伺服器不是單單為個人服務,而是為複數客戶端服務的。
  • 銀行基準時鐘系統時間同步方案
    基於NTP 協議,依靠北鬥和GPS衛星導航系統獲取標準時間,結合信息設備全量及分布現狀,合理設計時鐘同步網絡架構,通過時鐘同步系統將全轄設備的系統時間與標準時間進行校準統一,可以實現銀行信息系統生態時鐘標尺的高度準確與統一。銀行基準時鐘系統設計原則構成銀行信息系統的設備不僅規模體量巨大,而且地域分布廣泛。
  • 安防設備裡的系統時間同步問題
    此時我們要考慮是否安防設備上時間相關的硬體是否有故障了。比如DVR/NVR主板上的紐扣電池是否沒電或者接觸不良,攝像機晶片上的電池,晶振或者時鐘晶片是否有問題了。如果設備自己的時間系統故障了,我們可以考慮使用時間同步的方式來給設備同步準確時間,下文會介紹幾種具體方法。設備運行一段時間後,時間顯示的精度不夠,和標準時間相差稍微有點大。這個問題的產生一般和設備的時鐘晶片精度有關。
  • 網絡同步時鐘系統讓所有終端時間精準一致
    ,考場實現時間統一協調是標準化考場的基底,標準化考場自動接收同步時鐘系統是基底的核心,保證考場秩序,考場時間運行的時效完整性。所以,醫院的時間同步系統的組建是非常重要的。3、電力網絡同步時鐘系統目前國家對電力系統有序的工作提出了智能建設的要求,對供電、智能管理、實施效率等都必須達到有序的時間同步要求,對購電入表的時間都需要精準的時間系統來實現;電廠內部的時間同步自動化管理體系中,調度管控系統、智能化電站管控設備、故障錄波設備等都已普遍應用,這些重要的環節都需要標準的同步時間來進行有序的工作。
  • linux系統時間修改
    大家好,我是Lionel,這周我教大家修改Linux系統的時區和時間。
  • linux ntp時間伺服器配置
    因為中國處在UTC+8時區,依次類推那麼也就是12:00 UTC了為什麼要說這些呢?·不管通過任何渠道我們想要同步系統的時間,通常提供方只會給出UTC+0的時間值而不會提供時區(因為它不知道你在哪裡).所以當我們設置系統時間的時候,設置好時區是首先要做的工作。
  • 便捷小功能 妙用Win7系統時鐘和計算器
    【IT168 應用】Wn7系統在很多地方都體現著便捷和貼心,儘管這些功能非常的小,而且不被人們關注,但如果你利用的好,它們將為你節省很多時間,帶來高效的工作體驗。
  • 北鬥GPS雙模NTP時間伺服器如何對接同步時鐘系統
    ,SP-SS06GPS北鬥時間伺服器具有抗幹擾性強、低功耗、多平臺多系統支持、故障報警等功能,為網絡設備(用戶)提供精確、標準、安全、可靠和多功能的同步時間服務。一、GPS北鬥時間伺服器組網方式介紹1、同步時鐘系統中電子鐘可通過連接「區域網時間伺服器」、「網際網路時間伺服器」自動校時,多用於醫院、車站、行政單位。
  • 如何在Windows 10中設置多時區時鐘
    當你需要與全球各地的人協同工作,與處於全球不同時區的家人或朋友打交到時,Windows 系統中的多時區時鐘功能便會派上用場。
  • 用系統日誌了解你的 Linux 系統
    Linux 系統日誌非常重要。後臺運行的程序(通常被稱為守護進程或者服務進程)處理了你 Linux 系統中的大部分任務。當這些守護進程工作時,它們將任務的詳細信息記錄進日誌文件中,作為它們做過什麼的「歷史」信息。這些守護進程的工作內容涵蓋從使用原子鐘同步時鐘到管理網絡連接。所有這些都被記錄進日誌文件,這樣當有錯誤發生時,你可以通過查閱特定的日誌文件來看出發生了什麼。
  • 為什麼要在醫院部署時間同步系統?
    什麼是時間同步系統?時間同步系統是通過GPS、北鬥、CDMA、NTP網絡等方式獲取時間,採用銣鍾、晶振進行時間保持,並以NTP等多種方式向外提供高穩定性、高精確度的標準時間信號。醫院建立時間同步系統的必要性 在中華人民共和國行業標準-醫療建築電氣設計規範裡有明確條文規定:三級醫院宜設置子母鍾系統,並應符合下列規定:1)子母鍾系統源信號宜採用全球定位系統(GPS)接收裝置;2)子母鍾系統母鍾宜設置在一層值班室,門診部、急診部、醫技部、手術部、住院部等處宜設置子鍾。
  • 北京天良數字網絡時鐘系統
    ,監視所有時鐘的工作狀態,從而使網絡和每個有安裝該子鐘的位置均能顯示與衛星時間信號保持一致的北京時間。隨著通信技術的發展,現在的子母鍾大多都以通信方式實現子鍾與母鐘的時間同步,並且由於使用了通信方式,不但使系統能同步子鍾時間,還可以同步系統內其他需要時間同步的設備,從而擴充了子母鐘的功能,因此叫時鐘系統更為貼切。
  • linux配置時間伺服器(ntp)
    在linux下,我們可以通過自帶的NTP(Network Time Protocol)協議通過網絡使自己的系統保持精確的時間。
  • 順序、時鐘與分布式系統
    Ordering現實生活中時間可以記錄事情發生的時刻、比較事情發生的先後順序。分布式系統的一些場景也需要記錄和比較不同節點間事件發生的順序。如數據寫入先後順序,事件發生的先後順序等等。時鐘頻率也可能因為溫度等外部因素導致時鐘偏移,普通的石英晶體的漂移大10-6。 原子鐘的漂移約為 10-13 ,所以原子鐘精度遠遠高於石英晶體。分布式下帶來的問題不同機器上的物理時鐘難以同步,導致無法區分在分布式系統中多個節點的事件時序。即使設置了 NTP 時間同步節點間也存在毫秒級別的偏差,因而分布式系統需要有另外的方法記錄事件順序關係。
  • 二十四時區制的誕生淵源:美國鐵路系統對於各地太陽時差異的解決
    造成這種混亂的根本原因,僅僅是因為美國沒有時間標準。當時每個城鎮都會保留自己的太陽時,並以此設置時鐘,以便太陽直射頭頂時正好是正午十二點。對於長期居住在城鎮裡生活工作的人而言,這是很自然也很合理的選擇,但是對於旅行者和出差的人來說,事情就變得有些複雜了。
  • 安徽京準NTP數字網絡時鐘系統
    1、系統概述:安徽京準數字子母鍾系統主要為醫院提供準確、標準的時間,系統採用GPS與北鬥衛星導航定位系統中的時標信號作為標準時間源對母鐘的時鐘信號源進行校準,向醫療場所的時鐘及區域網內的計算機提供準確的時鐘信號,監視所有時鐘的工作狀態,從而使網絡和每個有安裝該子鐘的位置均能顯示與衛星時間信號保持一致的北京時間