chronyc sources 返回空列表的主因是 Unix socket 路径不匹配、bindcmdaddress 未配置、SELinux 拦截或 systemd socket 单元冲突;需检查 /run/chrony/chronyd.sock 是否存在并可访问,确认 chrony.conf 含 bindcmdaddress /run/chrony/chronyd.sock,排查 SELinux 策略及禁用 chronyd.socket 单元。

chronyc sources 返回空列表但 chronyd 进程在运行
chronyc sources 显示空(甚至直接报 No such file or directory),而 systemctl status chronyd 显示 active (running),说明 chronyd 进程起来了,但没和客户端建立通信通道。最常见原因是 socket 路径不匹配或权限问题。
-
chronyd默认监听 Unix domain socket:/var/run/chrony/chronyd.sock - 但某些发行版(如 CentOS 7、RHEL 7)默认使用
/run/chrony/chronyd.sock(无var) - 如果
chronyc没指定路径,它会按编译时默认顺序尝试多个路径,失败后静默退出,看起来就像“没输出”
检查实际 socket 是否存在且可访问:
ls -l /var/run/chrony/chronyd.sock /run/chrony/chronyd.sock 2>/dev/null如果只有
/run/chrony/chronyd.sock 存在,就用:
chronyc -p /run/chrony/chronyd.sock sources
chronyd 配置里没启用 command socket 或路径被覆盖
chronyd 不会自动创建 socket 目录或监听命令接口,除非配置明确启用。检查 /etc/chrony.conf 是否含以下任一配置:
- 缺少
commandkey+keyfile(旧版本要求密钥认证才能响应命令) - 没有
bindcmdaddress,或写成了bindcmdaddress 127.0.0.1(只监听 TCP,不建 Unix socket) - 使用了
cmdport 0(禁用命令端口)
关键项应至少包含:
-
bindcmdaddress /run/chrony/chronyd.sock(推荐显式指定路径) -
keyfile /etc/chrony.keys(即使不用密钥,文件也得存在且非空) -
commandkey 1(与 keys 文件中第 1 行 key ID 匹配)
如果不想用密钥,可加 rtcsync 后加 noclientlog,但 socket 仍需启用——bindcmdaddress 是必须的。
SELinux 或 systemd socket 激活干扰了 socket 创建
在 RHEL/CentOS 等启用了 SELinux 的系统上,chronyd 可能因策略限制无法在 /run/chrony/ 下创建 socket,日志里会出现类似:
avc: denied { create } for comm="chronyd" name="chronyd.sock" scontext=... tcontext=... tclass=sock_file临时确认是否 SELinux 导致:
sudo setenforce 0 && sudo systemctl restart chronyd && chronyc sources
若此时正常,说明是策略问题。永久修复需调整策略或确保 chronyd_t 域有 unix_stream_socket 创建权限。
另一个常见干扰:systemd 的 socket 激活单元(chronyd.socket)被启用,但 chronyd.service 没禁用,导致两个实例争抢 socket。检查:
systemctl is-enabled chronyd.socket chronyd.service如果两者都 enabled,禁用 socket 单元:
sudo systemctl disable chronyd.socket,再重启 service。
chronyc 找不到 chronyd.sock 的 fallback 行为被静默忽略
chronyc 在找不到 socket 时不会报错,而是直接返回空输出(exit code 1),这极易误判为“没数据”。用 strace 可验证:
strace -e trace=connect chronyc sources 2>&1 | grep "No such"
你会看到它依次尝试:
connect(3, {sa_family=AF_UNIX, sun_path="/var/run/chrony/chronyd.sock"}, 110) = -1 ENOENT
connect(3, {sa_family=AF_UNIX, sun_path="/run/chrony/chronyd.sock"}, 110) = -1 ENOENT只要所有路径都失败,就静默退出。所以不要只信 chronyc sources 的空输出——它只代表“连不上”,不等于“没源”。
真正判断 NTP 源是否生效,看:
chronyc tracking如果有
System clock 行且 offset 很小,说明对时已在工作;sources 空只是管理通道断了。
socket 路径不一致、bindcmdaddress 缺失、SELinux 拦截、systemd socket 冲突——这四个点覆盖了 90% 的“chronyc sources 空但 chronyd 活着”的真实原因。调试时优先查 socket 文件是否存在且路径匹配,比翻日志更快。










