在企業級的 Linux 環境中,準確和一致的系統時間顯得尤為重要。無論是日誌分析、排程任務、資料庫交易,還是安全性憑證,都高度依賴於精確的時間同步。本文將詳細介紹 AlmaLinux 9、Rocky Linux 9、CentOS Stream 9 及其他 RHEL 衍生版本中時間管理的各種方法與工具。
目錄
- Red Hat 家族的時間管理概述
- 使用 timedatectl 管理時間
- 使用 date 命令管理時間
- Chrony:RHEL 系統推薦的時間同步服務
- 傳統 NTP 服務的配置與使用
- 硬體時鐘管理
- 自動化部署中的時間設置
- 常見問題排解
- SELinux 與時間服務
- 參考資料
Red Hat 家族的時間管理概述
AlmaLinux 9、Rocky Linux 9 和 CentOS Stream 9 作為 Red Hat Enterprise Linux (RHEL) 9 的下游衍生版本,繼承了 RHEL 的時間管理架構。這些系統採用 systemd 作為初始化系統,並推薦使用 Chrony 作為主要的時間同步服務。
RHEL 家族時間管理的演變
在 RHEL 系列的發展歷程中,時間管理工具經歷了以下變化:
- RHEL 6 及更早版本:使用傳統的
ntpd
服務和date
命令 - RHEL 7:引入
timedatectl
命令,開始推薦使用chronyd
服務 - RHEL 8/9:完全採用
chronyd
作為預設和推薦的時間同步服務
AlmaLinux 9、Rocky Linux 9 與 CentOS Stream 9 的時間管理特點
- 預設安裝 Chrony 時間同步服務
- 完整支援
timedatectl
命令 - 提供與傳統
date
和hwclock
命令的向後兼容性 - 增強的 PTP (Precision Time Protocol) 支援
- 針對虛擬化和容器環境的優化
使用 timedatectl 管理時間
timedatectl
是 systemd 的一部分,提供了全面的時間管理功能,是現代 RHEL 衍生系統中管理時間的首選工具。
基本用法
查看系統時間狀態
timedatectl status
輸出示例:
Local time: Mon 2025-04-28 15:30:45 CST
Universal time: Mon 2025-04-28 07:30:45 UTC
RTC time: Mon 2025-04-28 07:30:45
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
設置系統日期和時間
sudo timedatectl set-time "2025-04-28 15:30:00"
設置時區
列出所有可用時區:
timedatectl list-timezones
搜尋特定區域的時區:
timedatectl list-timezones | grep Asia
設置時區:
sudo timedatectl set-timezone Asia/Taipei
啟用或禁用 NTP 同步
啟用 NTP 同步(會自動啟用 chronyd 服務):
sudo timedatectl set-ntp true
禁用 NTP 同步:
sudo timedatectl set-ntp false
RHEL 特有的 timedatectl 功能
檢查目前時間同步服務
在 AlmaLinux 9 和 CentOS Stream 9 中,可以使用以下命令查看當前激活的時間同步服務:
timedatectl show-timesync
調整 RTC 模式
設置硬體時鐘使用 UTC 時間(推薦):
sudo timedatectl set-local-rtc 0
設置硬體時鐘使用本地時間(不推薦,但可以與 Windows 雙啟動系統兼容):
sudo timedatectl set-local-rtc 1
使用 date 命令管理時間
儘管 timedatectl
是現代推薦的工具,date
命令依然是有價值的,尤其是在腳本和自動化任務中。
查看當前時間
date
輸出示例:
Mon Apr 28 15:30:45 CST 2025
以特定格式顯示時間
date "+%Y-%m-%d %H:%M:%S %z"
輸出示例:
2025-04-28 15:30:45 +0800
設置系統時間
sudo date -s "2025-04-28 15:30:00"
RHEL 系統中常用的 date 選項
在 AlmaLinux 和 CentOS 中,以下 date
選項特別有用:
顯示 UTC 時間
date -u
以 ISO 8601 格式顯示時間
date --iso-8601=seconds
輸出示例:
2025-04-28T15:30:45+08:00
從時間戳轉換為可讀時間
date -d @1714349445
時間計算
# 3天後的時間
date -d "+3 days"
# 下個月第一天
date -d "next month" +%Y-%m-01
# 本季度最後一天
date -d "$(date +%Y-%m-01) +3 month -1 day"
Chrony:RHEL 系統推薦的時間同步服務
Chrony 是 AlmaLinux 9 和 CentOS Stream 9 中預設和推薦的時間同步服務,提供比傳統 NTP 守護程序更好的性能和更多功能。
Chrony 的優勢
- 更快的同步速度
- 更好地處理間歇性網絡連接
- 更好地應對系統時鐘漂移
- 支援硬體時間戳
- 較低的資源消耗
- 更好的虛擬機支援
安裝 Chrony
在 AlmaLinux 9、Rocky Linux 9 和 CentOS Stream 9 中,Chrony 通常已預先安裝。如果沒有,可以使用以下命令安裝:
sudo dnf install chrony
Chrony 基本配置
Chrony 的主要配置文件是 /etc/chrony.conf
。以下是一些常見的配置選項:
配置 NTP 服務器
編輯配置文件:
sudo vi /etc/chrony.conf
基本配置示例:
# 使用公共 NTP 池服務器
pool pool.ntp.org iburst
# 使用特定區域的 NTP 池服務器
pool asia.pool.ntp.org iburst
# 使用特定 NTP 服務器
server ntp.example.com iburst
選項說明:
iburst
:加速初始同步burst
:當服務器可達時發送多個請求minpoll
和maxpoll
:設置輪詢間隔
允許本地網絡同步
要允許本地網絡中的其他計算機與此伺服器同步:
# 允許 192.168.1.0/24 網絡的計算機同步
allow 192.168.1.0/24
本地時間源配置
如果服務器無法訪問外部 NTP 服務,可以配置為本地參考時鐘:
# 本地參考時鐘,層次為 10
local stratum 10
管理 Chrony 服務
啟動和啟用服務
sudo systemctl start chronyd
sudo systemctl enable chronyd
檢查服務狀態
sudo systemctl status chronyd
檢查同步狀態
使用 chronyc
命令行工具檢查同步狀態:
chronyc tracking
輸出示例:
Reference ID : 8BAFC43B (ntp.example.com)
Stratum : 3
Ref time (UTC) : Mon Apr 28 07:30:45 2025
System time : 0.000000195 seconds slow of NTP time
Last offset : +0.000000021 seconds
RMS offset : 0.000000053 seconds
Frequency : 6.626 ppm fast
Residual freq : +0.000 ppm
Skew : 0.011 ppm
Root delay : 0.022055530 seconds
Root dispersion : 0.000455368 seconds
Update interval : 1042.2 seconds
Leap status : Normal
查看時間源
chronyc sources
輸出示例:
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp.example.com 2 9 377 43 -195ns[-1031ns] +/- 23ms
^+ time.cloudflare.com 3 10 377 120 -1ms[ -1ms] +/- 36ms
^- ntp.other.org 2 9 377 43 +12ms[ +12ms] +/- 89ms
前綴符號表示:
*
:當前同步源+
:可接受的替代同步源-
:排除的時間源?
:連接失敗的時間源x
:時鐘被視為偽造
手動觸發同步
sudo chronyc makestep
Chrony 高級配置
記錄與統計
啟用記錄和統計信息:
# 啟用日誌
logdir /var/log/chrony
log measurements statistics tracking
# 啟用統計
driftfile /var/lib/chrony/drift
dumpdir /var/lib/chrony
dumponexit
PTP 硬體時鐘支援
對於需要高精度時間的應用,可以配置 PTP 硬體時鐘:
# 使用 PTP 硬體時鐘作為參考
refclock PHC /dev/ptp0 poll 3 dpoll -2 offset 0
虛擬機優化
在虛擬機環境中,可以使用以下設置提高性能:
# 虛擬機環境優化
makestep 1.0 3
maxchange 1000 1 1
傳統 NTP 服務的配置與使用
雖然 Chrony 是 AlmaLinux 9 和 CentOS Stream 9 中的預設選擇,但在某些情況下,您可能需要使用傳統的 NTP 服務。
安裝 NTP
sudo dnf install ntp
基本配置
編輯 /etc/ntp.conf
文件:
sudo vi /etc/ntp.conf
配置示例:
# 使用公共 NTP 池服務器
server 0.pool.ntp.org iburst
server 1.pool.ntp.org iburst
server 2.pool.ntp.org iburst
server 3.pool.ntp.org iburst
# 本地網絡訪問控制
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
管理 NTP 服務
sudo systemctl start ntpd
sudo systemctl enable ntpd
sudo systemctl status ntpd
查看同步狀態
ntpq -p
硬體時鐘管理
在 AlmaLinux 9 和 CentOS Stream 9 中,hwclock
命令用於管理硬體時鐘(RTC)。
查看硬體時鐘時間
sudo hwclock --show
設置硬體時鐘
sudo hwclock --set --date="2025-04-28 15:30:00"
同步系統時鐘與硬體時鐘
將系統時間同步到硬體時鐘:
sudo hwclock --systohc
將硬體時鐘同步到系統時間:
sudo hwclock --hctosys
硬體時鐘選項
在 RHEL 系統中,hwclock
有一些特別有用的選項:
# 查看是否使用 UTC 或本地時間
sudo hwclock --verbose
# 使用 UTC 時間設置硬體時鐘
sudo hwclock --systohc --utc
# 使用本地時間設置硬體時鐘
sudo hwclock --systohc --localtime
# 調整時鐘漂移
sudo hwclock --adjust
自動化部署中的時間設置
在 AlmaLinux 9、Rocky Linux 9 和 CentOS Stream 9 的自動化部署中,時間設置是關鍵步驟之一。
使用 Kickstart 配置時間
在 Kickstart 文件中配置時間設置:
# 設置時區
timezone Asia/Taipei --utc
# 啟用 NTP
services --enabled=chronyd
使用 Ansible 管理時間
Ansible Playbook 示例:
---
- name: 配置系統時間
hosts: all
become: yes
tasks:
- name: 安裝 chrony
dnf:
name: chrony
state: present
- name: 設置時區
timezone:
name: Asia/Taipei
- name: 配置 chrony 服務器
lineinfile:
path: /etc/chrony.conf
regexp: '^pool '
line: 'pool ntp.example.com iburst'
notify: restart chronyd
- name: 啟用並啟動 chrony
systemd:
name: chronyd
state: started
enabled: yes
handlers:
- name: restart chronyd
systemd:
name: chronyd
state: restarted
常見問題排解
系統時間不同步
如果系統時間不同步,請按照以下步驟排除問題:
- 檢查時間同步服務是否運行:
sudo systemctl status chronyd
- 檢查時間源狀態:
chronyc sources
- 檢查網絡連接:
ping pool.ntp.org
- 查看 chrony 日誌:
sudo journalctl -u chronyd
- 手動強制同步:
sudo chronyc makestep
時區問題
如果時區設置不正確:
- 確認當前時區設置:
timedatectl status
- 列出可用時區:
timedatectl list-timezones | grep Asia
- 設置正確的時區:
sudo timedatectl set-timezone Asia/Taipei
硬體時鐘與系統時鐘不一致
如果重啟後時間不正確:
- 檢查硬體時鐘模式:
timedatectl | grep "RTC in local TZ"
- 同步系統時間到硬體時鐘:
sudo hwclock --systohc
- 檢查 BIOS 時間設置。
Chrony 同步問題
如果 Chrony 無法同步時間:
- 檢查防火牆設置:
sudo firewall-cmd --list-all
- 如果需要,允許 NTP 通過防火牆:
sudo firewall-cmd --add-service=ntp --permanent sudo firewall-cmd --reload
- 檢查 chrony 配置文件:
sudo cat /etc/chrony.conf
- 使用調試模式重啟 chronyd:
sudo systemctl stop chronyd sudo chronyd -d
SELinux 與時間服務
AlmaLinux 9 和 CentOS Stream 9 預設啟用 SELinux,這可能會影響時間服務的運作。
檢查 SELinux 相關問題
sudo ausearch -m avc -c chronyd
設置正確的 SELinux 上下文
# 對於自定義的 chrony 日誌目錄
sudo semanage fcontext -a -t chronyd_var_log_t "/var/log/chrony(/.*)?"
sudo restorecon -Rv /var/log/chrony
# 允許 chronyd 連接到 NTP 端口
sudo setsebool -P chronyd_connect_network on
時間服務的 SELinux 布爾值
# 列出與時間相關的布爾值
sudo getsebool -a | grep chrony
# 設置特定布爾值
sudo setsebool -P chronyd_connect_network on
參考資料
- AlmaLinux 9 官方文檔:系統管理
- CentOS Stream 9 官方文檔
- Red Hat Enterprise Linux 9 文檔:配置系統時間和日期
- Chrony 官方文檔
- NTP 官方文檔
- Red Hat Enterprise Linux 9 文檔:使用 Ansible 自動化系統管理
- Rocky Linux 9 文檔:時間同步
- Linux man 手冊:timedatectl(1)
- Linux man 手冊:chrony.conf(5)
- Linux man 手冊:chronyc(1)
本文詳細介紹了 AlmaLinux 9、Rocky Linux 9、CentOS Stream 9 及其他 RHEL 衍生版本中的時間管理方法。從基本的時間查看和設置,到配置高精度時間同步服務,再到針對虛擬化環境和自動化部署的優化,都提供了全面而深入的指導。通過遵循這些最佳實踐,您可以確保 RHEL 系列系統中的時間服務運行穩定且精確。