在RHEL 8.2系统上运行两个独立chrony实例(一个客户端、一个服务端)的实现方法咨询
在RHEL 8.2系统上运行两个独立chrony实例(一个客户端、一个服务端)的实现方法咨询
我的环境是RHEL 8.2,所有NTP服务和客户端都用chrony实现。现在遇到这样的需求:
- NTP客户端200.100.1.3无法直接访问NTP服务器200.100.1.1
- 需要让200.100.1.2同时扮演两个角色:一是作为客户端同步200.100.1.1的时间,二是作为服务端给200.100.1.3提供时间
我只会单独配置chrony的客户端或服务端,不知道怎么在同一台机器上跑两个独立的chrony实例,分别读取不同的配置文件。
方法一:运行两个独立的chrony实例(满足你的需求)
要实现这个,核心是给每个实例分配独立的配置文件、数据目录和systemd服务,避免资源冲突。
1. 准备独立的配置文件与目录
默认chrony会共享/var/lib/chrony(存储漂移数据)和/var/log/chrony(日志目录),所以我们要为两个实例分别创建专属目录:
# 创建客户端实例的专属目录 mkdir -p /var/lib/chrony/client /var/log/chrony/client chown chrony:chrony /var/lib/chrony/client /var/log/chrony/client # 创建服务端实例的专属目录 mkdir -p /var/lib/chrony/server /var/log/chrony/server chown chrony:chrony /var/lib/chrony/server /var/log/chrony/server
客户端配置文件(/etc/chrony-client.conf)
这个实例只负责同步200.100.1.1的时间,不需要监听服务端口,所以直接禁用服务端功能:
# 同步上游NTP服务器 server 200.100.1.1 iburst # 禁用服务端监听,仅作为客户端运行 port 0 # 客户端专属漂移文件 driftfile /var/lib/chrony/client/drift # 系统时钟偏移过大时允许步进调整 makestep 1 -1 maxdistance 1000000 # 同步硬件RTC时钟 rtcsync # NTP认证密钥文件 keyfile /etc/chrony.keys # 时区与闰秒设置 leapsectz right/UTC # 客户端专属日志目录 logdir /var/log/chrony/client
服务端配置文件(/etc/chrony-server.conf)
这个实例负责给200.100.1.3提供时间,同步本地系统时间即可(因为客户端实例已经把系统时间对齐到200.100.1.1了):
# 允许本地时间作为时间源(stratum级别设为10,低于上游服务器的级别) local stratum 10 # 允许指定网段的客户端访问 allow 200.100.0.0/16 # 服务端专属漂移文件 driftfile /var/lib/chrony/server/drift # 系统时钟偏移过大时允许步进调整 makestep 1.0 3 # 同步硬件RTC时钟 rtcsync # NTP认证密钥文件 keyfile /etc/chrony.keys # 时区与闰秒设置 leapsectz right/UTC # 服务端专属日志目录 logdir /var/log/chrony/server # 监听所有接口的NTP默认端口(123) bindaddress 0.0.0.0
2. 创建独立的systemd服务文件
默认的chronyd.service只能运行一个实例,所以我们要为两个实例分别创建服务文件:
客户端服务文件(/etc/systemd/system/chronyd-client.service)
[Unit] Description=Chrony NTP Client (同步至200.100.1.1) Documentation=man:chronyd(8) man:chronyc(1) After=network.target [Service] Type=forking PIDFile=/var/run/chronyd-client.pid # 指定客户端配置文件和专属PID文件路径 ExecStart=/usr/sbin/chronyd -f /etc/chrony-client.conf -p /var/run/chronyd-client.pid ExecReload=/usr/sbin/chronyc -p /var/run/chronyd-client.pid reload PrivateTmp=yes ProtectHome=yes ProtectSystem=full [Install] WantedBy=multi-user.target
服务端服务文件(/etc/systemd/system/chronyd-server.service)
[Unit] Description=Chrony NTP Server (为200.100.0.0/16提供时间服务) Documentation=man:chronyd(8) man:chronyc(1) # 确保客户端实例启动后再启动服务端,保证时间源有效性 After=network.target chronyd-client.service [Service] Type=forking PIDFile=/var/run/chronyd-server.pid # 指定服务端配置文件和专属PID文件路径 ExecStart=/usr/sbin/chronyd -f /etc/chrony-server.conf -p /var/run/chronyd-server.pid ExecReload=/usr/sbin/chronyc -p /var/run/chronyd-server.pid reload PrivateTmp=yes ProtectHome=yes ProtectSystem=full [Install] WantedBy=multi-user.target
3. 启用并启动服务
# 重新加载systemd配置 systemctl daemon-reload # 停止并禁用默认的chronyd服务(如果正在运行) systemctl stop chronyd && systemctl disable chronyd # 启用并启动两个新实例 systemctl enable --now chronyd-client.service systemctl enable --now chronyd-server.service
4. 验证实例状态
# 检查客户端实例是否成功同步到200.100.1.1 chronyc -p /var/run/chronyd-client.pid tracking # 检查服务端实例的时间源状态 chronyc -p /var/run/chronyd-server.pid sources
方法二:更简单的方案——用单个chrony实例同时扮演客户端和服务端
其实你完全不需要跑两个实例,chrony本身就支持同时作为客户端同步上游时间,同时作为服务端给其他客户端提供时间,配置更简洁,维护成本更低:
修改默认的/etc/chrony.conf为如下内容:
# 同步上游NTP服务器 server 200.100.1.1 iburst # 允许指定网段的客户端访问 allow 200.100.0.0/16 # 当无法连接上游服务器时,用本地时间作为 fallback local stratum 10 driftfile /var/lib/chrony/drift makestep 1 -1 maxdistance 1000000 rtcsync keyfile /etc/chrony.keys leapsectz right/UTC logdir /var/log/chrony
然后重启chrony服务即可:
systemctl restart chronyd
这个方案完全能满足你的需求:200.100.1.2同步200.100.1.1的时间,同时给200.100.1.3提供时间服务。
备注:内容来源于stack exchange,提问作者Vinod




