在 Linux 系统中,同步时间是一个非常重要的任务,它确保了日志记录的准确性、程序的正常运行(尤其是分布式系统和依赖时间戳的服务),以及文件系统的一致性。Linux 同步时间通常通过 NTP (Network Time Protocol) 来实现,这是用于在网络上同步计算机时钟的协议。
Linux 同步时间的几种方法
根据你的 Linux 发行版和具体需求,有几种常用的方法来同步时间:
1. 使用 systemd-timesyncd
(现代 Linux 发行版默认推荐)
檢查狀態:
timedatectl
輸出結果:
Local time: Wed 2025-06-18 06:10:31 UTC
Universal time: Wed 2025-06-18 06:10:31 UTC
RTC time: Wed 2025-06-18 06:10:31
Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
- 检查状态:
System clock synchronized: yes
和NTP service: active
。 - 如果
NTP service
是inactive
,你需要启用它。啟動命令:timedatectl set-ntp true
; 關閉命令:timedatectl set-ntp false
- 配置 NTP 服务器 (可选):
systemd-timesyncd
默认会使用 pool.ntp.org 或发行版预设的 NTP 服务器。如果你想指定自己的服务器,可以编辑/etc/systemd/timesyncd.conf
文件:sudo vim /etc/systemd/timesyncd.conf
找到并取消注释或添加NTP=
行,然后列出你的 NTP 服务器(用空格分隔):
[Time] NTP=ntp.aliyun.com ntp.tencent.com
或者:
[Time] NTP=time.google.com time.android.com
- 保存文件后,重启服务:
sudo systemctl restart systemd-timesyncd
2. 使用 chrony
(推荐,对于服务器和虚拟机更精确)
chrony
是一个更现代、更精确的 NTP 实现,相比传统的 ntpd
,它在时钟漂移、间歇性网络连接以及虚拟机环境下的性能更好。许多发行版(如 Red Hat Enterprise Linux / CentOS 8+,以及较新版本的 Ubuntu)已将其作为默认或推荐的 NTP 客户端。
- 安装
chrony
:- Debian/Ubuntu/OpenWrt:
sudo apt update sudo apt install chrony
- Debian/Ubuntu/OpenWrt:
- 配置
chrony
:
sudo vim /etc/chrony.conf
查找pool
或server
行, - 例如:
pool 2.pool.ntp.org iburst
# 或者指定具体服务器
# server ntp.aliyun.com iburst
# server time.nist.gov iburst
iburst
选项会在启动时发送一系列快速查询,以加快初始同步。 - 启动和启用
chrony
服务:sudo systemctl start chronyd
sudo systemctl enable chronyd
注意:在某些系统上,服务名称可能是chrony
而不是chronyd
。 - 检查
chrony
状态:chronyc tracking chronyc sources -v
tracking
命令显示当前的同步状态,sources -v
显示连接的 NTP 服务器及其同步详情。 - 强制立即同步 (如果时钟偏差过大):
如果你的系统时钟偏差非常大(例如几分钟甚至几小时),chrony 默认会“步进”时钟(立即跳到正确时间)。
如果偏差不大,它会慢慢调整时钟(“倾斜”)。你可以强制立即步进:sudo chronyc makestep
3. 使用 ntpd
(传统 NTP 守护进程)
ntpd
是最传统的 NTP 守护进程,功能非常全面,可以作为客户端也可以作为服务器。在一些较旧的系统或需要搭建 NTP 服务器的场景下仍会用到。
- 安装
ntpd
:- Debian/Ubuntu/OpenWrt:
sudo apt update sudo apt install ntp
- Debian/Ubuntu/OpenWrt:
- 配置 ntpd:
sudo vim /etc/ntp.conf
查找pool
或server
行,并根据需要添加或修改 NTP 服务器。
# 默认通常有 pool.ntp.org 的配置pool 0.pool.ntp.org iburst
pool 1.pool.ntp.org iburst
pool 2.pool.ntp.org iburst
pool 3.pool.ntp.org iburst
# 你也可以添加具体的服务器# server time.nist.gov iburst
# server time.google.com iburst
# server time.android.com ibrust
- 启动和启用
ntpd
服务:sudo systemctl start ntp
sudo systemctl enable ntp
- 检查
ntpd
状态:ntpq -p
此命令会显示 NTP 对等体的状态。*
星号表示当前正在同步的服务器。可能需要等待几分钟才能看到星号。
4. 手动同步一次 (不推荐用于长期同步)
ntpdate
命令曾被用于一次性地同步时间,但现在已被弃用,因为它不会考虑时钟漂移,并且可能导致时间跳变过大,对某些应用程序产生负面影响。现代系统建议使用 timedatectl
或 chronyc -q
代替。
重要的时间同步概念
- 硬件时钟 (RTC/CMOS Clock): 你的计算机主板上的一个独立时钟,即使关机也继续运行。
- 系统时钟 (System Clock): Linux 内核维护的时钟,这是应用程序使用的主要时钟。
- UTC (Coordinated Universal Time): 协调世界时,是全球统一的时间标准。
- 本地时间 (Local Time): 基于时区设置的时间。
最佳实践:
- 建议始终将硬件时钟设置为 UTC。 Linux 系统会根据时区设置,将 UTC 时间转换为本地时间显示给你。
- 定期同步: 建议使用
chrony
或systemd-timesyncd
这类守护进程进行持续同步,它们会平滑地调整时间,避免大的时间跳变。