我需要将设备指向我在 LXC 中运行的 CentOS-7 服务器同步它们的时钟。在我试图ntpd
从ntp
包中使用的服务器上,但对其他产品开放。这个问题是关于在服务器上设置ntpd
或等效的。
到目前为止,我试过这个/etc/ntp.conf
driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
server 127.127.1.1 iburst
fudge 127.127.1.1 stratum 8
disable monitor
这里有两个问题。
ntpd
记录后终止cap_set_proc() failed to drop root privileges: Operation not permitted
ntpd
正在尝试调整当地时间。它失败了,但它会尝试。如果这是唯一的问题并且我在日志中有错误消息,我可以接受。
/var/log/messages
尝试启动 ntpd 导致的完整输出:
systemd: Starting Network Time Service...
ntpd[20154]: ntpd [email protected] Wed Apr 12 21:24:06 UTC 2017 (1)
ntpd[20155]: proto: precision = 0.120 usec
ntpd[20155]: ntp_adjtime() failed: Operation not permitted
systemd: Started Network Time Service.
ntpd[20155]: 0.0.0.0 c01d 0d kern kernel time sync enabled
ntpd[20155]: Listen and drop on 0 v4wildcard 0.0.0.0 UDP 123
ntpd[20155]: Listen and drop on 1 v6wildcard :: UDP 123
ntpd[20155]: Listen normally on 2 lo 127.0.0.1 UDP 123
ntpd[20155]: Listen normally on 3 eth0 hidden:A.B.C.D UDP 123
ntpd[20155]: Listen normally on 4 tun0 hidden:E.F.G.H UDP 123
ntpd[20155]: Listening on routing socket on fd #21 for interface updates
ntpd[20155]: 0.0.0.0 c016 06 restart
ntpd[20155]: ntp_adjtime() failed: Operation not permitted
ntpd[20155]: 0.0.0.0 c012 02 freq_set kernel 0.000 PPM
ntpd[20155]: 0.0.0.0 c011 01 freq_not_set
ntpd[20155]: cap_set_proc() failed to drop root privileges: Operation not permitted
systemd: ntpd.service: main process exited, code=exited, status=255/n/a
systemd: Unit ntpd.service entered failed state.
systemd: ntpd.service failed.
正如评论中所讨论的,chrony最近收到了一个
-x
不尝试更改系统时钟的新选项,使其特别适用于容器操作。唉,接收这个选项的第一个版本(3.2)并不彻底,仍然要求 Linux 功能,所以仍然失败。使用选项从CentOS7 LXC 容器(带有非 CentOS 主机)中的包 chrony 版本 3.2-2.el7 中跟踪 chronyd
-x
,实际上错误修复不在这里:[...]
因此,如果您可以阻止不可修改的二进制 chronyd 请求禁止的功能,它将运行(这就是 3.3 错误修复的内容)。好消息,可以使用
LD_PRELOAD
/dlsym()
包装器。在其他地方的其他 Linux 系统上编译(编译实际上是在 Debian 9 主机上进行的,在 CentOS7 容器上运行没有任何麻烦)这个代码称为,例如在那里
capsetwrapper.c
找到结构定义(这没有t 从内核 3.10 更改)。使用这种特定方式(使库适合
LD_PRELOAD
使用):它的工作方式如下所示:
在运行时检查其功能:
1<<CAP_NET_BIND_SERVICE
显示 0x400 这是上面看到的剩余部分。要将其集成到系统中:
将
libcapsetwrapper.so
包装器放置为/usr/local/lib/libcapsetwrapper.so
使用
systemctl edit chronyd
, 覆盖CAP_SYS_TIME
检查,并且可执行文件以此开头:抱歉,我无法重用
$OPTIONS
参数(它是空的,应该重新接收-x
选项,从 加载/etc/sysconfig/chronyd
),但有了更多的系统知识,它应该是可能的。工作结果:
没有测试的是默认的 SELinux 环境(此处不可用)是否允许预加载操作,或者是否应该做更多的事情
/usr/local/lib/libcapsetwrapper.so
(一定要使用restorecon
它)。自7.7.1908版以来, CentOS 有3.4
chrony
版,它正确支持该标志并且可以在 LXC 下运行,只需进行少量配置调整。-x
/usr/lib/systemd/system/chronyd.service
,因此通过添加此文件删除它ConditionCapability=CAP_SYS_TIME
-x
/etc/systemd/system/chronyd.service.d/lxc.conf
编辑
/etc/sysconfig/chronyd
并添加-x
到OPTIONS
最后OPTIONS="-x"
更改
/etc/chrony.conf
为不同步到任何 NTP 服务器,而是从本地时钟提供时间。删除/禁用所有其他server
条目,并添加:查看
allow
指令以满足您的需求,因为allow all
示例中可能不适合您。这应该是它。
我找到了一种让它工作的方法,但我对我的解决方案不满意,所以我仍在寻找更好的答案。
第 1 部分。我阻止
ntpd
尝试删除 root 权限。默认情况
/usr/lib/systemd/system/ntpd.service
下,它具有:-u ntp:ntp
所以我通过放置“删除”/etc/systemd/system/ntpd.service.d/local.conf
这允许
ntpd
继续以 root 身份运行。它有效,但我对这种方法不满意。部分 2. 不更新本地时间部分
在服务开始时添加
/etc/ntp.conf
在线disable kernel
原因仅记录一次错误,而不是在没有设置的情况下记录 3 次。因为它不能改变时钟,所以这是可以接受的。理想情况下,它甚至不会尝试更改时钟。ntpd
ntp_adjtime() failed: Operation not permitted