Linux 時間操作及其同步


完整格式支持鏈接:https://blog.imakiseki.cf/2022/02/27/techdev/linux-time-operations-and-sync/

本文將以 Arch Linux 為例,討論 Linux 的時間操作和同步方法。

本文圍繞 Linux 的時間將 ArchWiki 上 System time 頁面的部分內容做簡化,並整理其他文章作為補充,簡化理論性,增強可操作性。

概述

操作系統的時間 (clock) 由三或四部分決定:

  • 時間值;
  • 是否為 UTC 時間;
  • 時區;
  • (如果有)夏令時。

而操作系統的時間一般有兩種:硬件時間和系統時間。

硬件時間

硬件時間 (也即真實時間 (Real Time Clock, RTC) 或 CMOS 時鍾) 一般只存儲時間值,直至 2016 年后 UEFI 硬件支持對時區和夏令時的存儲。

系統時間

系統時間 (也即軟件時間) 可以追蹤時間值、時區以及可能存在的夏令時。系統時間由 Linux 內核計算,時間值為 UTC+0 下自 1970 年 1 月 1 日午夜至今的秒數——可以在 time.is 網站查詢得到。

尤其需要注意的是:操作系統完全啟動后,系統時間與硬件時間是獨立的。

讀取

狀態

Linux 的時間狀態可由 timedatectltimedatectl status 命令獲取。輸出類似於:

               Local time: Sun 2022-02-27 12:52:24 UTC
           Universal time: Sun 2022-02-27 12:52:24 UTC
                 RTC time: n/a
                Time zone: UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

我們可以得知:

  • 本地時間值和 UTC 時間值均為 Sun 2022-02-27 12:52:24 UTC;
  • 硬件時間不存在;
  • 時區為 UTC (UTC+0);
  • 已經開啟系統時間同步。

硬件時間

上方的示例中硬件時間 (RTC time) 顯示為“n/a”,也就是不存在。在一部存在硬件時間的 Linux 設備上,可以執行 hwclock --show 查看硬件時間:

$ hwclock --show
2022-02-27 21:14:16.129670+08:00

timedatectl 更進一步的是,hwclock 可以顯示有關硬件時間的更詳細信息:

$ hwclock --verbose
hwclock from util-linux 2.34
System Time: 1645967662.035542
Trying to open: /dev/rtc0
Using the rtc interface to the clock.
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
...got clock tick
Time read from Hardware Clock: 2022/02/27 13:14:24
Hw clock time : 2022/02/27 13:14:24 = 1645967664 seconds since 1969
Time since last adjustment is 1645967664 seconds
Calculated Hardware Clock drift is 0.000000 seconds
2022-02-27 21:14:23.020178+08:00

對此輸出不再作進一步介紹。

設置

硬件時間(與系統時間一致)

我們一般很少手動設置硬件時間。若要設置,可以使其與系統時間保持一致:

sudo hwclock --systohc

這會新建或更新 /etc/adjtime 的內容,示例如下:

$ cat /etc/adjtime
0.000000 1645969156 0.000000
1645969156
LOCAL

系統時間

sudo timedatectl set-time "yyyy-MM-dd hh:mm:ss"

例如:

sudo timedatectl set-time "2014-05-26 11:13:54"

時區

設置時區前,先需要知道可用的時區:

timedatectl list-timezones

其中有“Asia/Shanghai”,可將時區設置為此:

sudo timedatectl set-timezone Asia/Shanghai

同步

此處提到的同步指的是系統時間與其他服務器提供的時間同步。以下提供兩種方式。

systemd-timesyncd 服務

配置

首先啟用該服務,執行 systemctl start systemd-timesyncd。可以選擇加入自啟動項。

打開 /etc/systemd/timesyncd.conf 文件,其中的內容可能如下:

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

刪去前兩行的注釋記號,並作如下修改:

NTP=0.cn.pool.ntp.org 1.cn.pool.ntp.org 2.cn.pool.ntp.org 3.cn.pool.ntp.org
FallbackNTP=0.arch.pool.ntp.org 1.arch.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org

若要驗證配置,執行 timedatectl show-timesync --all。一般輸出類似於:

LinkNTPServers=
SystemNTPServers=
FallbackNTPServers=0.arch.pool.ntp.org 1.arch.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org
ServerName=0.arch.pool.ntp.org
ServerAddress=103.47.76.177
RootDistanceMaxUSec=5s
PollIntervalMinUSec=32s
PollIntervalMaxUSec=34min 8s
PollIntervalUSec=1min 4s
NTPMessage={ Leap=0, Version=4, Mode=4, Stratum=2, Precision=-21, RootDelay=177.398ms, RootDispersion=142.196ms, Reference=C342F10A, OriginateTimestamp=Mon 2018-07-16 13:53:43 +08, ReceiveTimestamp=Mon 2018-07-16 13:53:43 +08, TransmitTimestamp=Mon 2018-07-16 13:53:43 +08, DestinationTimestamp=Mon 2018-07-16 13:53:43 +08, Ignored=no PacketCount=1, Jitter=0 }
Frequency=22520548

但若出現類似如下的輸出:

LinkNTPServers=
SystemNTPServers=0.cn.pool.ntp.org 1.cn.pool.ntp.org 2.cn.pool.ntp.org 3.cn.pool.ntp.org
FallbackNTPServers=0.pool.ntp.org 1.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org
ServerName=
ServerAddress=
RootDistanceMaxUSec=5s
PollIntervalMinUSec=32s
PollIntervalMaxUSec=34min 8s
PollIntervalUSec=0
Frequency=0

請跳過本小節,跳轉至 chrony

生效

若要使配置生效,執行 timedatectl set-ntp true

同步過程需要持續一段時間。若要檢查同步狀態,執行 timedatectl status。輸出類似於:

               Local time: Thu 2015-07-09 18:21:33 CEST
           Universal time: Thu 2015-07-09 16:21:33 UTC
                 RTC time: Thu 2015-07-09 16:21:33
                Time zone: Europe/Amsterdam (CEST, +0200)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

若要查看詳細信息,執行 timedatectl timesync-status。輸出類似於:

       Server: 103.47.76.177 (0.arch.pool.ntp.org)
Poll interval: 2min 8s (min: 32s; max 34min 8s)
         Leap: normal
      Version: 4
      Stratum: 2
    Reference: C342F10A
    Precision: 1us (-21)
Root distance: 231.856ms (max: 5s)
       Offset: -19.428ms
        Delay: 36.717ms
       Jitter: 7.343ms
 Packet count: 2
    Frequency: +267.747ppm

chrony

chrony 是一個漫游友好型、且專為非所有時間在線的系統設計的程序,可以用以同步系統時間。

安裝

大部分軟件管理器中均有該軟件包。執行:

sudo pacman -S chrony

這將在 /usr/bin 下放置 chrony 的兩個可執行文件 chronycchronyd,分別作為客戶端和服務端(保護進程)。

也可以在官網中查閱其他安裝方式。

配置

配置文件一般為 /etc/chrony.conf/etc/chrony/chrony.conf

打開配置文件,做如下更改:

  • 定位到 pool 配置項,修改其后的服務器地址為 0.cn.pool.ntp.org
  • 定位到 makestep 配置項,根據需求修改;
    • 第一個數字:進行“時間跳躍”的閾值——同步時若系統時間與服務器返回結果相差在閾值內,則程序會逐漸調整當前系統時間;反之則會直接將系統時間設為正確時間(注意:“時間跳躍”可能會對其他程序造成負面影響,不宜將此值調至過小);
    • 第二個數字:可進行時間調整的范圍——設置為 n 表示僅前 n 次時間更新過程可發生這種調整。
  • 定位到 logdir 配置項,刪去配置記號;
  • 定位到 rtcsync 配置項,刪去注釋記號。

生效

啟用該服務,執行 systemctl start chronyd。可以選擇加入自啟動項。重啟,讀取系統時間檢查:

               Local time: Sun 2022-02-27 23:16:28 CST
           Universal time: Sun 2022-02-27 15:16:28 UTC
                 RTC time: n/a
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

觀察到“System clock synchronized”欄的輸出是“yes”。

若要立刻更改系統時間,執行 chronyc makestep

參考


免責聲明!

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



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