一些有用的命令
以下是一些有用的命令,可用于解决与 chrony 相关的问题。
# chronyc tracking # chronyc sources # chronyc sourcestats # systemctl status chronyd # chronyc activity # timedatectl
尝试通过输入其 IP 地址仅设置一台 NTP 服务器
如果到目前为止我们一直在使用两个或者多个 NTP 服务器(因为它们已设置或者因为我们输入了一个在不同 IP 地址中解析的 FQDN),请尝试通过仅输入一个 IP 地址来设置一个 NTP 服务器。
这可能会解决 NTP 相关问题。
只有 chrony 设置时间的时间
当 chrony 服务启动时,/etc/chrony/chrony.conf 文件中有一些设置告诉它在特定条件发生时实际设置时间:
# Force system clock correction at boot time. makestep 1000 10
这意味着如果 chrony 在其开始后的前 10 次测量中检测到时间偏离超过 1000 秒,它将设置时钟。
时间日志
有几个 chrony 日志可用于排除故障。
它们中的大多数位于 /var/log/chrony/ 。
请注意,最新文件并不总是 *.log 文件。
有时甚至 *.log.2 或者 *.log.3 文件也是更新的文件。
以下是按最新排序列出文件的示例:
# ls -lisaht /var/log/chrony/ total 1.5M 3801115 580K -rw-r--r-- 1 root root 574K Oct 21 14:56 measurements.log.3 3801131 544K -rw-r--r-- 1 root root 540K Oct 21 14:56 statistics.log.3 3801166 356K -rw-r--r-- 1 root root 350K Oct 21 14:56 tracking.log.3 3801089 4.0K drwxr-xr-x 16 root root 4.0K Oct 21 00:01 .. 3801114 4.0K drwxr-xr-x 2 root root 4.0K Oct 21 00:01 . 3801128 0 -rw-r--r-- 1 root root 0 Oct 21 00:01 tracking.log 3801110 0 -rw-r--r-- 1 root root 0 Oct 21 00:01 measurements.log 3801120 0 -rw-r--r-- 1 root root 0 Oct 21 00:01 statistics.log 3801167 0 -rw-r--r-- 1 root root 0 Oct 20 00:01 tracking.log.1 3801165 0 -rw-r--r-- 1 root root 0 Oct 20 00:01 statistics.log.1 3801159 0 -rw-r--r-- 1 root root 0 Oct 20 00:01 measurements.log.1 ............
chrony 服务不改变时间
通常的误解是 chrony 服务将时间设置为 NTP 服务器提供的时间。
这是不正确的 - 实际发生的是基于 NTP 服务器的回答,chrony 只是告诉系统时钟走得更快或者更慢。
因此,有时即使时间错误且 NTP 服务器正在工作,时间也不会立即得到更正。
检查 chronyd 状态
要检查 chronyd 守护进程的状态:
# systemctl status -l chronyd ● chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2016-08-12 13:22:22 IST; 1s ago Process: 33263 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS) Process: 33259 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS) Main PID: 33261 (chronyd) CGroup: /system.slice/chronyd.service └─33261 /usr/sbin/chronyd Aug 12 13:22:22 NVMBD1S11BKPMED03 systemd[1]: Starting NTP client/server... Aug 12 13:22:22 NVMBD1S11BKPMED03 chronyd[33261]: chronyd version 2.1.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +DEBUG +ASYNCDNS +IPV6 +SECHASH) Aug 12 13:22:22 NVMBD1S11BKPMED03 chronyd[33261]: Frequency 0.000 +/- 1000000.000 ppm read from /var/lib/chrony/drift Aug 12 13:22:22 NVMBD1S11BKPMED03 systemd[1]: Started NTP client/server.
跟踪与 NTP 服务器的通信
要仔细检查 NTP 服务器是否正在应答,可以在监视服务器的同时跟踪 chrony 和 NTP 服务器之间的流量一段时间:
- 使用 NTP 端口 123 上的 tcpdump 启动 pcap 跟踪并保持运行直到问题出现(在“屏幕”或者“nohup”中运行它以避免在与 shell 命令断开连接时它被停止)
- 一旦问题再次出现,请获取涵盖整个历史记录的系统诊断,因为我们已将服务器设置为 DNS 名称,直到再次出现间隙。
如果这会产生一个太大的文件,只需获取当前数据的系统诊断,另外复制 /var/log/chrony/ 中的所有文件,以及所有名为 /var/log/syslog* 的文件。
记住停止我们在第 1 步开始的跟踪
chronyc 源命令
运行 chronyc sources -v 显示系统中配置的 NTP 服务器的当前状态。
这是一个示例输出,其中 ntp.example.com 显示为在线的有效服务器:
# chronyc sources -v 210 Number of sources = 1 .-- Source mode '^' = server, '=' = peer, '#' = local clock. / .- Source state '*' = current synced, '+' = OK for sync, '?' = unreachable, | / 'x' = time may be in error, '~' = time is too variable. || .- xxxx [ yyyy ] +/- zzzz || / xxxx = adjusted offset, || Log2(Polling interval) -. | yyyy = measured offset, || | zzzz = estimated error. || | | MS Name/IP address Stratum Poll LastRx Last sample ============================================================================ ^* ntp.example.com 3 6 40 +31us[ -98us] +/- 118ms
请注意,与“*”不同的源状态通常表示 NTP 服务器有问题。
源状态'~'表示时间变化太大
如果 Source 状态为 '~ ',则可能意味着服务器可以访问但时间变化太大。
如果服务器响应太慢或者响应有时较慢有时较快,则可能会发生这种情况。
我们可以检查 ping 对服务器的响应时间,以查看它们是否缓慢或者可变。
当服务器在太慢导致计时问题的虚拟机上运行时,也会注意到这种状态。
Chrony 检查并每小时重新启动
chrony 服务每小时检查一次 chronyc sources -v 命令的输出,通过运行脚本 /usr/sbin/palladion_chrony_healthcheck 运行 /usr/sbin/palladion_check_chrony 并检查其输出:
- 如果 /usr/sbin/palladion_check_chrony 返回 1 - 这意味着没有在线源(没有源状态 = '*'),因此 chrony 重新启动以尝试重新初始化服务器状态
- 如果 /usr/sbin/palladion_check_chrony 返回 0 - 这意味着一切正常,chrony 不需要重新启动,因为它已经有一个有效的在线资源
# cat /etc/cron.d/chrony SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # # Check chrony every hour and restart if necessary. # 16 * * * * root /usr/sbin/palladion_chrony_healthcheck