You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在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

火山引擎 最新活动