在 OpenSUSE 中,coturn-4.5.2-4.1.x86_64
该.service
文件包含看似生成的部分,其中包含允许的功能和系统调用。他们可能正在尝试将其沙箱化,以防出现漏洞。一切都很好,除了进程在启动后几乎立即被终止,我必须一一删除所有限制才能找到罪魁祸首:
SystemCallFilter=~ ... @privileged ...
当服务被终止时,系统日志中不会记录有用的信息。仅有的
主进程退出,code=killed,status=31/SYS
手册说:
@privileged 所有需要超级用户能力的系统调用(capability(7))
我实际上想知道失败的实际系统调用以及缺少哪些功能。
答案1
当服务执行未包含在系统调用中的系统调用时SystemCallFilter=
设置,默认操作是进程终止SIGSYS
,因此该进程转储一个核心。因此,您可以检查核心文件并查找其中的系统调用号。
例子:
# coredumpctl debug
(gdb) p $rax
157
我们的示例系统调用号也是如此157
,我们可以在表中查找它,例如:
https://github.com/torvalds/linux/blob/v5.15/arch/x86/entry/syscalls/syscall_64.tbl
IE
157 common prctl __x64_sys_prctl
因此,prctl
必须添加到SystemCallFilter=
.
另一次重新启动可能会因另一次系统调用而失败,因此可能需要一些迭代。
您还可以检查系统执行(5)对于一些可能缺失的系统调用组,可以添加到SystemCallFilter=
可能会加快这一过程。
此外,可以通过以下方式查找不同组在当前运行的 systemd 中确切包含哪些系统调用:
systemd-analyze syscall-filter
如果服务文件也包含,SystemCallErrorNumber=
那么您必须删除它才能让进程核心转储。