timedatectl
在 Linux 中我們可以使用 timedatectl
進行時間的確認。使用 timedatectl
不加任何參數時,可以顯示目前系統時間。timedatectl
會顯示更詳細的資訊如時區、UTC 世界協調時間等資訊。
student$ timedatectl
Local time: Sun 2022-10-23 14:19:11 CST
Universal time: Sun 2022-10-23 06:19:11 UTC
RTC time: Sun 2022-10-23 14:19:09
Time zone: Asia/Taipei (CST, +0800)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no
從輸出中,我們可以得知下列資訊:
上述的資訊讓管理者一目瞭然知道時間資訊,包含是否啟用網路校時等訊息。
在大部分的操作情境中,若要知道系統目前的時間,我們更常使用另一個老牌指令: date
。
date
date
指令來快速查看目前的日期和時間。這是一個非常基礎和常用的指令,不需安裝額外的軟體包。
使用 date
指令會看到如下的輸出:
student$ date
Fri Aug 18 14:30:15 CST 2023
這個輸出提供了系統目前的日期(Fri Aug 18
)、時間(14:30:15
),以及時區(CST
)。
date
指令有一些選項可以讓您自定義輸出的格式。
例如,可以使用下列方式顯示目前的年份:
student$ date +"%Y"
2023
在這個指令中,+
表示我們要自定義日期和時間的格式,而 %Y
是一個特殊的代碼,表示四位數的年份。
如果要知道所有可以使用的格式化代碼,可以使用 man date
來查看 FORMAT 章節。
比較 timedatectl
和 date
date
更為方便。兩者都是非常有用的工具,但在不同的情境和需求下,我們可能會選擇使用其中一個。無論是使用 timedatectl
還是 date
,能夠快速而準確地獲取到時間資訊,確保時間的準確性不僅影響到日常操作。
若時間發生錯誤,系統可能會發生一些未知的錯誤,我們要使用手動方式進行修正時,一樣可以使用 timedatectl
來進行修改。
使用下列方式把時間調為 "2022-01-10 11:00:00":
student$ sudo timedatectl set-time "2022-01-10 11:00:00"
再次查看時間,Local time
應顯示我們指定的時間:
student$ sudo timedatectl
Local time: Mon 2022-01-10 11:00:19 CST
Universal time: Mon 2022-01-10 03:00:19 UTC
RTC time: Mon 2022-01-10 03:00:19
Time zone: Asia/Taipei (CST, +0800)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no
當然我們可以使用另一個常用的工具: date
來查看與設定系統時間,由於該指令設定時間的格式較為複雜,很多管理者比較無法直覺的設定所需要的時間,所以在此就以 timedatectl
做為示範。
對於一間有國外業務的企業來說,每套系統有可能放在世界不同地方,此時就會有修改系統時區的需求。我們可以使用先前介紹的 timedatectl
來進行設定。
在 timedatectl
使用參數 list-timezones
列出可設定的時區:
student$ sudo timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
Africa/Blantyre
Africa/Brazzaville
Africa/Bujumbura
Africa/Cairo
Africa/Casablanca
~ 略 ~
上述結果是全部時區的輸出,從中選出合適的區域。
透過下列流程,把系統時區設定為美國紐約時區 America/New_York
:
先查看目前的時間資訊:
student$ sudo timedatectl
Local time: Sun 2022-10-23 14:36:59 CST
Universal time: Sun 2022-10-23 06:36:59 UTC
RTC time: Mon 2022-01-10 03:14:14
Time zone: Asia/Taipei (CST, +0800)
System clock synchronized: no
NTP service: iactive
RTC in local TZ: no
使用 set-timezone
參數將時區修改為 "America/New_York":
student$ sudo timedatectl set-timezone "America/New_York"
確認修改完成:
student$ sudo timedatectl
Local time: Sun 2022-10-23 02:37:22 EDT
Universal time: Sun 2022-10-23 06:37:22 UTC
RTC time: Mon 2022-01-10 03:14:37
Time zone: America/New_York (EDT, -0400)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no
透過以上方式可以很快速且準確的設定時間,也可以使用相同方式設定為 Asia/Taipei
。
做法如下:
student$ sudo timedatectl set-timezone "Asia/Taipei"
為了確保主機下次開機能夠得到調整後的時間,通常會使用 hwclock 將時間同步到硬體時間。
做法如下:
查看硬體時間
student$ sudo hwclock -r
Fri 01 Sep 2023 04:35:38 PM CST -0.392055 seconds
將系統時間同步到硬體時間
student$ sudo hwclock -w
檢查同步後結果
student$ sudo hwclock -r
Fri 01 Sep 2023 04:35:38 PM CST -0.392055 seconds
上述例子中,可能會發現沒什麼改變,則代表系統時間與硬體時間應該是一致的,若是修改前與修改後的時間差距很大則表示硬體時間已經被修改為與系統時間相同。
在一台 Linux 主機上,有兩種主要的時間來源:
當我們啟動或重啟 Linux 系統時,作業系統會從硬體時鐘讀取時間,然後設定為當前的系統時間。因此,當作業系統以硬體時間作為一個基準點,會影響系統時間的初始設定。假如系統時間和硬體時間不同步,那麼每次重新啟動或從關機狀態再開機時,系統時間就可能會被設定為不正確的時間。
這樣的情況下,可能會發生以下問題:
由於以上原因,使用 hwclock
來同步硬體時間和系統時間是建議的操作,特別是在更改系統時間或重新配置時區後。這樣可以確保硬體時鐘和系統時鐘之間的一致性,以避免可能出現的問題。