精確的系統時間是日誌分析、定時任務、資料庫一致性、分散式協議、合規審計的基石。本文系統講解 date 手動修改、hwclock 硬體時鐘同步、ntpdate/chronyc 網路時間同步、timedatectl 現代統一管理、時區設定與虛擬機特殊處理,構建完整的時間管理知識體系。

/etc/localtime 指向 /usr/share/zoneinfo/ 對應檔案。date 手動設定系統時間date [選項] [+格式]
date --set="時間字串"
# 設定完整日期時間
date --set="2024-12-25 14:30:00"
date -s "2024-12-25 14:30:00"
# 只設定日期
date --set="2024-12-25"
# 只設定時間
date --set="14:30:00"
# 相對時間調整
date --set="+5 minutes"
date --set="-2 weeks"
date --set="+3 months"
date --set="-3 months +2 weeks -5 minutes"
# 指定格式輸出(配合腳本)
date '+%Y-%m-%d %H:%M:%S'
date '+%s' # Unix 時間戳
date -d @1703485800 # 時間戳轉日期


hwclock 硬體時鐘同步# 將系統時鐘寫入硬體時鐘(關機前/修改時間後必做)
hwclock --systohc
hwclock --systohc --utc # 明確指定 RTC 存儲 UTC(推薦)
hwclock --systohc --localtime # RTC 存儲本地時間(雙啟動 Windows 需求)
# 將硬體時鐘讀取到系統時鐘(開機自動執行,手動修正罕見)
hwclock --hctosys
hwclock --hctosys --utc
# 查看硬體時鐘
hwclock --show
hwclock -r
關鍵原則:RTC 應儲存 UTC,由系統時區轉換為本地時間。雙系統(Windows+Linux)時,Windows 預設 RTC 用本地時間,需二選一:
timedatectl set-local-rtc 1 --adjust-system-clockHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\RealTimeIsUniversal=1# 安裝
sudo apt install chrony
# 或
sudo dnf install chrony
# 配置 /etc/chrony/chrony.conf(或 /etc/chrony.conf)
# 指定上游 NTP 伺服器(優先使用就近公共/內部 NTP)
pool ntp.aliyun.com iburst
pool cn.pool.ntp.org iburst
pool time.cloudflare.com iburst
# 允許區域網客戶端同步(可選)
allow 192.168.0.0/16
# 啟用服務
sudo systemctl enable --now chronyd
# 狀態查看
chronyc sources -v
chronyc tracking
chronyc sourcestats
sudo apt install ntpdate
sudo ntpdate -u pool.ntp.org
hwclock --systohc
# /etc/systemd/timesyncd.conf
[Time]
NTP=ntp.aliyun.com cn.pool.ntp.org
FallbackNTP=time.google.com time.cloudflare.com
sudo systemctl enable --now systemd-timesyncd
timedatectl timesync-status
timedatectl 統一管理(systemd 現代介面)# 查看狀態
timedatectl status
# 設定時區
timedatectl set-timezone Asia/Shanghai
# 設定時間(會自動同步到 RTC,若啟用 NTP 則無法手動設定)
timedatectl set-time "2024-12-25 14:30:00"
timedatectl set-time "14:30:00"
# 啟用/停用 NTP 同步
timedatectl set-ntp true
timedatectl set-ntp false
# 設定 RTC 模式
timedatectl set-local-rtc 0 # RTC 使用 UTC(推薦)
timedatectl set-local-rtc 1 # RTC 使用本地時間
hwclock 會報錯。依賴 chrony/systemd-timesyncd 從宿主機或外部 NTP 同步。chrony.conf maxpoll 6、minpoll 4)。#!/bin/bash
# check_time_sync.sh:檢查時間同步狀態
OFFSET_THRESHOLD=1 # 秒
if command -v chronyc &>/dev/null; then
offset=$(chronyc tracking | awk '/Last offset/ {print $4}')
offset_abs=${offset#-}
if (( $(echo "$offset_abs > $OFFSET_THRESHOLD" | bc -l) )); then
echo "CRITICAL: Chrony offset ${offset}s > ${OFFSET_THRESHOLD}s"
exit 2
fi
echo "OK: Chrony offset ${offset}s"
elif command -v ntpdate &>/dev/null; then
offset=$(ntpdate -q pool.ntp.org 2>&1 | awk '/offset/ {print $NF}')
# 解析邏輯...
else
echo "WARN: No NTP client found"
fi
| 現象 | 原因 | 解決 |
|---|---|---|
| 修改時間後重啟失效 | 未同步至 RTC(hwclock --systohc) | 執行同步、檢查 RTC 模式 |
| NTP 同步失敗 | 防火牆阻擋 UDP 123、上游不可達、未啟用 iburst | 開放埠口、更換上游、加 iburst |
| 系統時間倒退/跳躍 | 手動修改、NTP 步進調整、虛擬機快照還原 | 啟用 chrony 平滑調整(slew 模式)、避免手動大幅改時間 |
| 容器內時間錯誤 | 容器共享宿主機 kernel 時鐘,但時區檔案未掛載 | -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro |
時間管理三板斧:正確時區(timedatectl set-timezone)+ 可靠同步源(Chrony + 就近 NTP 池)+ RTC 同步策略(UTC 模式 + hwclock --systohc)。生產環境禁用手動 date -s,全面採用 Chrony 自動同步,並納入監控告警(offset > 1s 告警)。虛擬機/容器環境特別注意時區檔案掛載與宿主機同步機制。建立「部署時驗證、運行時監控、異常時溯源」完整鏈路,確保時間永遠可信。