一、文档说明
系统为麒麟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.service,After表示在什么之后开启,所以chronyd.service的开启在ntpd.service之后。
chronyd.service配置文件可见,Conflicts后面配置了ntpd.service,Conflicts表示与什么服务冲突,所以chronyd.service与ntpd.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.service,Conflicts后面去掉ntpd.service。
/usr/lib/systemd/system/ntpd.service配置文件,After后面加上chronyd.service,Conflicts后面加上chronyd.service。
而后,systemctl enable ntpd及systemctl start ntpd,即可。
四、与红帽处理方式的区别
红帽的处理步骤如下:
- 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
- Open 50-chronyd.list file and comment out like below:
#chronyd.service
- 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。