本文其实是照着Arch Linux 中文 Wiki 上 Chrony 条目编写的,但结合 Debian/Ubuntu 系统与 Arch Linux 的差别做了一些调整,算是对记录自己折腾过程的一个小随笔,欢迎大家批评指正。
1 Chrony 的适用场景
Chrony 是一款适合笔记本电脑及虚拟机环境的网络时钟同步工具。
Chrony 具有如下特征[1]:
- 即使在没有永久网络连接的系统(如笔记本电脑)上也能很好地工作;
- 而且相较于标准ntp,能更快地进行时间同步。
- 它的内存占用较小,且非必要不唤醒进程,提高了电量的使用效率。
当在虚拟机中的系统使用时,Chrony 有如下优点:
- 更大的频率校正范围,能校正快速漂移的时钟;
- 更好地响应时钟频率的快速变化。
2 在 Debian/Ubuntu 上使用 Chrony
2.1 安装
首先,安装 chrony 软件包(注意该包与 systemd-timesyncd 互斥。安装其中一者,会自动卸载另一者)
2.2 配置
首先,将 chrony 的默认配置文件 /etc/chrony/chrony.conf,重命名为 chrony.conf.bak,作为日后调整 chrony 设置时的参考。
然后,以管理员身份,重新创建 /etc/chrony/chrony.conf,并写入如下内容:
server ntp.ntsc.ac.cn offline
server cn.ntp.org.cn offline
driftfile /var/lib/chrony/drift
rtconutc
rtcfile /var/lib/chrony/rtc
其中,
- 第 1 行、第 2 行是配置
chrony校正时钟时要使用哪个服务器。这里使用的两个服务分别为 “国家授时中心 NTP 服务器” 和 “中国 NTP 快速授时服务”[2],二者均为中国境内的授时机构,可降低网络延迟造成的时间偏差。每个服务器 URL 后的offline选项是告诉chrony当系统联网后再进行时钟校准。 - 第 5 行是设置
chrony处理硬件实时时钟(RTC)时的行为。这一条命令的含义是:当chrony发现 RTC 与授时中心的时间存在差异时,它不会立即修改 RTC,而是将偏差量记载到rtcfile中,然后只调整操作系统的时间。至于硬件时间,用户可在有需要时进行手动调整。
2.3 启用 chrony 服务
接下来,执行如下命令,启动 chrony 服务:
sudo systemctl enable --now chrony
如果修改了 chrony 的配置文件,要让新的配置生效,请执行:
sudo systemctl restart chrony
2.4 安装网络调度脚本
最后,我们需要安装一个网络调度脚本,让系统的网络管理器 NetworkManager 在计算机联网后通知 chrony 进入在线模式、同步时钟。
要安装这个脚本,首先请执行如下命令,下载该脚本:
git clone https://aur.archlinux.org/networkmanager-dispatcher-chrony.git
然后,将得到的 10-chrony 复制到 /etc/NetworkManager/dispatcher.d/ 文件夹中,并重命名为 20-chrony-onoffline.sh。
3 Chrony 的交互界面
chrony 除了可以作为服务运行、在后台自动同步系统时间,还可以通过其交互 Shell,完成一些手动操作。
3.1 进入交互界面
执行命令 sudo chronyc 即可进入交互 shell。注意要使用管理员身份(chrony 的一些操作需要 root 权限)。
然后,会在屏幕上看到如下命令提示符,输入命令即可完成相应操作:
chrony version 4.5
Copyright (C) 1997-2003, 2007, 2009-2023 Richard P. Curnow and others
chrony comes with ABSOLUTELY NO WARRANTY. This is free software, and
you are welcome to redistribute it under certain conditions. See the
GNU General Public License version 2 for details.
chronyc>
3.2 常用命令
activity:检查当前chrony的工作状态。online:手动进入联网状态。trimrtc:手动同步硬件时间(RTC)。quit:退出交互 shell。
提示:
chrony交互 shell 的使用和 bash 比较相似,按Tab可补全命令,按↑、↓则可输入上一条/下一条运行过的命令。