在 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 iburstiburst
选项会在启动时发送一系列快速查询,以加快初始同步。 - 启动和启用
chrony服务:sudo systemctl start chronydsudo systemctl enable chronyd
注意:在某些系统上,服务名称可能是chrony而不是chronyd。 - 检查
chrony状态:chronyc tracking chronyc sources -vtracking命令显示当前的同步状态,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 iburstpool 1.pool.ntp.org iburstpool 2.pool.ntp.org iburstpool 3.pool.ntp.org iburst
# 你也可以添加具体的服务器# server time.nist.gov iburst# server time.google.com iburst# server time.android.com ibrust - 启动和启用
ntpd服务:sudo systemctl start ntpsudo 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这类守护进程进行持续同步,它们会平滑地调整时间,避免大的时间跳变。