iT邦幫忙

2023 iThome 鐵人賽

DAY 19
1

修改系統時間與時區

查看系統時間

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

從輸出中,我們可以得知下列資訊:

  • Local time 伺服器目前設置的本地時間。在這個例子中,本地時間是 2022-10-23 14:19:11,時區是 CST (中央標準時間,通常是 UTC+8)。
  • Universal time 伺服器的 UTC(世界協調時間)時間。在這個例子中,UTC 時間是 2022-10-23 06:19:11。
  • RTC time 這是實時時鐘(Real-Time Clock,RTC)的時間。RTC 是一個獨立於主系統運行的時鐘,即使系統關機,它也會繼續計時。在這個例子中,RTC 時間是 2022-10-23 14:19:09。
  • Time zone 目前系統時區設置。在這個例子中,時區設為 Asia/Taipei,這是台北的時區,並且是 UTC+8。
  • System clock synchronized 系統時鐘是否已經與一個外部來源同步。在這個例子中,它是 no,表示時鐘沒有同步。
  • NTP service NTP(網路時間協定)服務是否活動。在這個例子中,它是 inactive,代表 NTP 服務沒有運行。
  • RTC in local TZ 實時時鐘(RTC)是否設置為使用本地時區。在這個例子中,它是 no,表示 RTC 可能是以 UTC 時間運行的。

上述的資訊讓管理者一目瞭然知道時間資訊,包含是否啟用網路校時等訊息。

在大部分的操作情境中,若要知道系統目前的時間,我們更常使用另一個老牌指令: 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 章節。

比較 timedatectldate

  • timedatectl: 提供更全面的系統時間和日期相關資訊,包括時區、NTP 狀態、以及實時時鐘(RTC)等。
  • 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:

  1. 先查看目前的時間資訊:

    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
    
  2. 使用 set-timezone 參數將時區修改為 "America/New_York":

    student$ sudo timedatectl set-timezone "America/New_York"
    
  3. 確認修改完成:

    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 將時間同步到硬體時間。

做法如下:

  1. 查看硬體時間

    student$ sudo hwclock -r
    Fri 01 Sep 2023 04:35:38 PM CST  -0.392055 seconds
    
  2. 將系統時間同步到硬體時間

    student$ sudo hwclock -w
    
  3. 檢查同步後結果

    student$ sudo hwclock -r
    Fri 01 Sep 2023 04:35:38 PM CST  -0.392055 seconds
    

上述例子中,可能會發現沒什麼改變,則代表系統時間與硬體時間應該是一致的,若是修改前與修改後的時間差距很大則表示硬體時間已經被修改為與系統時間相同。

在一台 Linux 主機上,有兩種主要的時間來源:

  • 硬體時間(RTC,Real-Time Clock): 這是由主機板上的時鐘晶片維護的時間。這個晶片有獨立的電池供電,所以即使電腦關機或斷電,它也會繼續運作。
  • 系統時間: 這是作業系統用來管理所有作業的時間,包括文件時間戳記、排程任務等。

當我們啟動或重啟 Linux 系統時,作業系統會從硬體時鐘讀取時間,然後設定為當前的系統時間。因此,當作業系統以硬體時間作為一個基準點,會影響系統時間的初始設定。假如系統時間和硬體時間不同步,那麼每次重新啟動或從關機狀態再開機時,系統時間就可能會被設定為不正確的時間。

這樣的情況下,可能會發生以下問題:

  • 文件時間戳記可能會錯誤。
  • 排程作業可能會在錯誤的時間執行。
  • SSL/TLS 證書驗證可能會失敗。
  • 資料庫交易和日誌可能會出現不一致。
  • 跨網路的時間敏感操作可能會失敗或出錯。

由於以上原因,使用 hwclock 來同步硬體時間和系統時間是建議的操作,特別是在更改系統時間或重新配置時區後。這樣可以確保硬體時鐘和系統時鐘之間的一致性,以避免可能出現的問題。


上一篇
Day 18: 確保時間準確
下一篇
Day 20: NTP 網路校時
系列文
Linux 升華:初學者的探索到專家的洞察30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言