timedatectl 時間與時區管理 文章首圖

timedatectl 時間與時區管理

timedatectl 時間與時區管理

在 Linux 系統管理中,準確的時間同步與正確的時區設定是確保日誌記錄、排程任務(如 cron)以及分散式系統協同運作無誤的關鍵。過去,管理員可能需要手動編輯 /etc/localtime 或配置 ntp 服務,但在現代 Linux 發行版(如 Ubuntu 22.04 和 Debian 12)中,timedatectl 指令提供了更直觀、集中且安全的時間管理方式。

timedatectlsystemd 套件的一部分,它允許使用者查詢和更改系統時鐘設定,包括本地時間、UTC 時間、時區以及網路時間同步狀態。本文將深入解析其用法,幫助你輕鬆掌控系統時間。

查詢當前時間狀態

在進行任何變更之前,首要步驟是了解當前的系統時間配置。你可以直接執行 timedatectl 而不帶任何參數,它會顯示一個摘要表,包含本地時間、世界標準時間、時區資訊、NTP 同步狀態以及時鐘精準度。

$ timedatectl
      Local time: Sat 2023-10-21 14:30:00 CST
  Universal time: Sat 2023-10-21 06:30:00 UTC
        RTC time: Sat 2023-10-21 06:30:00
       Time zone: Asia/Taipei (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

從輸出中,我們可以觀察到幾個重要資訊:

  • Time zone: 顯示目前設定的時區為 Asia/Taipei
  • System clock synchronized: 顯示系統時鐘是否已同步。
  • NTP service: 顯示 NTP 服務是否正在運行並自動校正時間。

設定時區

時區設定的核心在於連結 /etc/localtime/usr/share/zoneinfo 目錄下的對應檔案。使用 timedatectl 可以自動完成這項操作,避免手動連結可能產生的錯誤。

首先,你可以使用 list-timezones 選項查看所有可用的時區,並利用 grep 篩選特定地區:

$ timedatectl list-timezones | grep -i taipei
Asia/Taipei

確認時區名稱正確後,即可使用 set-timezone 進行設定。請注意,此指令需要 root 權限:

$ sudo timedatectl set-timezone Asia/Taipei

設定完成後,再次執行 timedatectl 確認時區已更新。如果你希望將系統時間設定為特定的日期和時間,可以使用 set-time 選項,格式為 YYYY-MM-DD HH:MM:SS

$ sudo timedatectl set-time '2023-10-21 15:00:00'

管理網路時間同步 (NTP)

在伺服器環境中,依賴硬體時鐘(RTC)往往不夠精準,因此啟用 NTP(Network Time Protocol)同步至網路時間伺服器是標準做法。timedatectl 內建了對 systemd-timesyncd 的服務控制。

若要檢查 NTP 同步狀態,可執行:

$ timedatectl timesync-status
       Server: 133.130.193.3 (ntp.nict.jp)
 Poll interval: 64s (min; max 8x+60s)
      Leap: normal
   Trust: synchronized
     Offset: -12ms
      Delay: 28ms
     Delay: 32ms
     Delay: 26ms
      Count: 3

若要啟用或禁用 NTP 自動同步,請使用 set-ntp 選項:

# 啟用 NTP 同步
$ sudo timedatectl set-ntp on

# 禁用 NTP 同步
$ sudo timedatectl set-ntp off

當 NTP 啟用時,系統會自動與配置的 NTP 伺服器對時;禁用後,系統將依賴手動設定的時間,直到下次重啟或手動調整。

常見問題與解決方案

1. 執行 timedatectl 時出現 "Failed to create bus connection: No such file or directory" 錯誤

這通常發生在 Docker 容器或非 systemd 啟動的環境中。timedatectl 依賴 D-Bus 與 systemd 進行通訊。在 Docker 容器中,若未正確傳遞 D-Bus socket 或未運行 systemd,該指令將無法工作。解決方法是在執行容器時加入 --privileged 參數,或手動安裝並配置 ntpchrony 套件來管理時間。

2. 修改時間後,硬體時鐘(RTC)未同步

Linux 系統通常將硬體時鐘設定為 UTC,而系統時間根據時區轉換為本地時間。當你使用 set-time 修改系統時間後,硬體時鐘可能不會立即更新。你可以強制將系統時間寫入硬體時鐘:

$ sudo hwclock --systohc

這確保了即使系統重啟,硬體時鐘也能反映最新的時間設定。

小結

timedatectl 是現代 Linux 系統管理員不可或缺的工具,它簡化了時區切換與時間同步的配置過程。透過本文的介紹,你應該已經掌握了查詢時間狀態、設定時區以及管理 NTP 同步的基本技巧。正確的時間管理不僅能提升系統日誌的可讀性,更是確保網路服務協同運作穩定的基石。建議在日常維護中,定期檢查 timedatectl 的輸出,以確保系統時間始終處於精確同步的狀態。