一、文档说明

系统为麒麟v10sp1-arm-0711(源自openEuler,centos7好像也有相同的现象)。chronyd和ntp同时开机自启的情况下只有chronyd生效,本文主要说明chronyd比ntp优先级高的原理机制。

二、问题分析

2.1 查看服务状态

左边使用systemctl status ntpd,查看ntpd状态;右边使用 systemctl status chronyd,查看chronyd状态。
在这里插入图片描述

2.2 查看服务配置

使用systemctl status ntpd查看,ntpd的配置在/usr/lib/systemd/system/ntpd.service文件中;

[Unit]
Description=Network Time Service
After=syslog.target ntpdate.service sntp.service
Conflicts=systemd-timesyncd.service

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/ntpd
ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS
PrivateTmp=true

[Install]
WantedBy=multi-user.target

使用systemctl status chronyd查看,chronyd的配置在/usr/lib/systemd/system/chronyd.service文件中;

[Unit]
Description=NTP client/server
Documentation=man:chronyd(8) man:chrony.conf(5)
After=ntpdate.service sntp.service ntpd.service
Conflicts=ntpd.service systemd-timesyncd.service
ConditionCapability=CAP_SYS_TIME

[Service]
Type=forking
PIDFile=/var/run/chrony/chronyd.pid
EnvironmentFile=-/etc/sysconfig/chronyd
ExecStart=/usr/sbin/chronyd $OPTIONS
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=full

[Install]
WantedBy=multi-user.target

2.3 分析原理

chronyd.service配置文件可见,After后面配置了ntpd.serviceAfter表示在什么之后开启,所以chronyd.service的开启在ntpd.service之后。

chronyd.service配置文件可见,Conflicts后面配置了ntpd.serviceConflicts表示与什么服务冲突,所以chronyd.servicentpd.service是冲突的。

故,根据文件中的配置,ntpd.service开启之后,才会开启chronyd.service,又因为配置了冲突,所以开启chronyd.service后,会关闭ntpd.service

三、解决方案

修改/usr/lib/systemd/system/ntpd.service

[Unit]
Description=Network Time Service
After=syslog.target ntpdate.service sntp.service chronyd.service
Conflicts=chronyd.service systemd-timesyncd.service

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/ntpd
ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS
PrivateTmp=true

[Install]
WantedBy=multi-user.target

修改/usr/lib/systemd/system/chronyd.service

[Unit]
Description=NTP client/server
Documentation=man:chronyd(8) man:chrony.conf(5)
After=ntpdate.service sntp.service 
Conflicts= systemd-timesyncd.service
ConditionCapability=CAP_SYS_TIME

[Service]
Type=forking
PIDFile=/var/run/chrony/chronyd.pid
EnvironmentFile=-/etc/sysconfig/chronyd
ExecStart=/usr/sbin/chronyd $OPTIONS
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=full

[Install]
WantedBy=multi-user.target

/usr/lib/systemd/system/chronyd.service配置文件,After后面去掉ntpd.serviceConflicts后面去掉ntpd.service

/usr/lib/systemd/system/ntpd.service配置文件,After后面加上chronyd.serviceConflicts后面加上chronyd.service

而后,systemctl enable ntpdsystemctl start ntpd,即可。

四、与红帽处理方式的区别

红帽的处理步骤如下:

  1. Check contents of the following directory. It should contain .list files for chronyd and ntpd as follows:
#ls /usr/lib/systemd/ntp-units.d/
50-chronyd.list  60-ntpd.list
  1. Open 50-chronyd.list file and comment out like below:
#chronyd.service
  1. Switch off then on timedate set-ntp:
#timedatectl set-ntp false
#timedatectl set-ntp true

区别在于:
红帽的方式是临时生效的,重启以后,还是只开启chronyd服务。
timedatectl set-ntp 会去读取/usr/lib/systemd/ntp-units.d/ 目录下的文件,根据数字大小,50比60小,所以会先去读取50-chronyd.list。

timedatectl set-ntp false,调systemctl stop去关闭当前的时间校时服务,当前的服务是chronyd,所以先关闭chronyd。
timedatectl set-ntp true,调systemctl start去开启时间校时服务,先读/usr/lib/systemd/ntp-units.d/50-chronyd.list,里面内容被注释了,为空;就接着读取/usr/lib/systemd/ntp-units.d/60-ntpd.list,所以开启了ntpd。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐