我正在尝试将服务器基础设施的各个部分容器化,我想在容器中运行的服务之一是 ntp 守护进程。
我使用 systemd-nspawn (systemd 233) 作为虚拟机管理程序以及容器内的 init 进程。
ntpd 版本是 4.2.8p10。
每次我尝试在容器内启动 ntpd 时,它都会崩溃并出现cap_set_proc()
“操作不允许”错误:
21 Oct 11:10:23 ntpd[51]: ntpd [email protected] Fri Oct 20 23:28:39 UTC 2017 (1): Starting
21 Oct 11:10:23 ntpd[51]: Command line: ntpd -g -n -u ntp:ntp
21 Oct 11:10:23 ntpd[51]: Cannot set RLIMIT_MEMLOCK: Operation not permitted
21 Oct 11:10:23 ntpd[51]: proto: precision = 0.335 usec (-21)
21 Oct 11:10:23 ntpd[51]: Listen normally on 0 v4wildcard 0.0.0.0:123
21 Oct 11:10:23 ntpd[51]: Listen normally on 1 lo 127.0.0.1:123
21 Oct 11:10:23 ntpd[51]: Listening on routing socket on fd #18 for interface updates
21 Oct 11:10:23 ntpd[51]: mlockall(): Cannot allocate memory
21 Oct 11:10:23 ntpd[51]: start_kern_loop: ntp_loopfilter.c line 1119: ntp_adjtime: Operation not permitted
21 Oct 11:10:23 ntpd[51]: set_freq: ntp_loopfilter.c line 1082: ntp_adjtime: Operation not permitted
21 Oct 11:10:23 ntpd[51]: cap_set_proc() failed to drop root privs: Operation not permitted
到目前为止我已经尝试过:
- 在未启用功能的情况下构建 ntpd - 它可以正常启动,但仍然存在相同的
ntp_adjtime
系统调用权限问题。 - 运行 systemd-nspawn 有
--private-users=0
或没有--private-users
。 - 使用 systemd-nspawn 本身的功能(主要
CAP_SYS_TIME
是 和CAP_NET_BIND_SERVICE
) - 使用容器内的 ntpd 功能。
所有这些都没有带来积极的结果,我想知道我错过了什么。任何想法将不胜感激。