如何在启动时“strace”一个systemd服务?

我正在处理一个嵌入式系统,运行着精简版的Ubuntu 22.04。我们最近更新了一些嵌入式系统的硬件,并且我正在努力让我们的Ubuntu镜像在新的硬件上正常工作。
在旧的硬件上,pulseaudio服务总是能够正常运行,但在新的硬件上,我遇到了一个问题:当服务在启动过程中启动时,pulseaudio无法检测到Alsa卡0。如果我通过systemctl --user restart pulseaudio.service重新启动服务,它就能够检测到Alsa卡0,并且一切正常。
我怀疑的是,pulseaudio在/dev/snd/目录下检查字符设备的存在,或者在/proc/asound/目录下检查文件/文件夹的存在,但它所寻找的设备或文件尚不存在,并且稍后由加载的内核模块创建。
为了验证我的猜想,我试图在启动过程中对该服务运行strace。我已经更新了/usr/lib/systemd/user/pulseaudio.service文件,并将ExecStart行更改如下:
ExecStart=strace -e trace=file -o /home/user/trace_erronly_fail.log -Z -f -tt /usr/bin/pulseaudio --daemonize=no --log-target=journal --log-level=debug

运行systemctl --user daemon-reload之后,我尝试启动服务测试strace是否能正常工作,但是服务启动失败。服务状态报告如下:
x pulseaudio.service - Sound Service
     Loaded: loaded (/usr/lib/systemd/user/pulseaudio.service; enabled; vendor preset: enabled)
     Active: failed (Result: core-dump) since Wed 2023-04-19 12:33:21 UTC; 2s ago
TriggeredBy: x pulseaudio.socket
    Process: 1673 ExecStart=strace -e trace=file -o /home/user/trace_erronly_fail.log -Z -f -tt /usr/bin/pulseaudio --daemonize=no --log-target=journal --log-level=debug (code=dumped, signal=SYS)
   Main PID: 1673 (code=dumped, signal=SYS)
        CPU: 49ms

Apr 19 12:33:21 Ubuntu-V8 systemd[780]: pulseaudio.service: Scheduled restart job, restart counter is at 5.
Apr 19 12:33:21 Ubuntu-V8 systemd[780]: Stopped Sound Service.
Apr 19 12:33:21 Ubuntu-V8 systemd[780]: pulseaudio.service: Start request repeated too quickly.
Apr 19 12:33:21 Ubuntu-V8 systemd[780]: pulseaudio.service: Failed with result 'core-dump'.
Apr 19 12:33:21 Ubuntu-V8 systemd[780]: Failed to start Sound Service.

似乎它正在引发一个SIGSYS信号,根据man 7 signal的说明,当出现错误的系统调用时会引发该信号。
我不太确定为什么会出现这个问题。我可以手动运行ExecStart命令而不引发SIGSYS信号,所以只有在作为systemd服务运行时才会出现这个问题。
那么,我应该如何在作为systemd服务运行时让strace正常工作呢?
1个回答

原來,systemd 服務有一個允許的系統調用列表。如果服務嘗試執行不被允許的系統調用,進程將以 SIGSYS 信號終止。
要告知 systemd 允許進程執行任何系統調用,需要更新 .service 文件並在 [Service] 節下添加以下內容:
SystemCallFilter=@known

然后,只需执行systemctl --user daemon-reload,然后再执行systemctl --user start pulseaudio.service(对于系统服务,省略--user),它应该立即启动。
有关SystemCallFilter参数的更多信息,请参考man 5 systemd.exec