如何更改Linux用户systemd文件的调度策略?

Edg*_*ian 1 systemd

我有一个用户级别的 systemd 服务正在运行,又名在~/.config/systemd/user/

但我想以一种独立的方式更改此服务的调度策略,也就是说,我希望它在启动时设置,并且我不想手动在 CLI 上执行任何操作。

但是当我在下面添加这两个方向时[Serivice]

CPUSchedulingPolicy=fifo
CPUSchedulingPriority=99
Run Code Online (Sandbox Code Playgroud)

但我得到这个问题。

hyegar.service: Control process exited, code=exited, status=214/SETSCHEDULER
Run Code Online (Sandbox Code Playgroud)

tel*_*coM 6

要使用这些CPUSchedulingPolicy设置,您必须是 root 用户,或者拥有CAP_SYS_NICE能力。不幸的是,并非所有 Linux 发行版都实现了功能机制,更不用说有详细记录了。

\n

用户级服务显然不能只为自己指定功能,因为这将有效地允许任何用户仅通过请求正确的功能即可成为 root。

\n

用户级 systemd 服务的“父级”是一个自动生成的系统级服务,名为user@<your-UID>.service。经过一番实验后,我发现您实际上可以创建一个\n/etc/systemd/system/user@<your-UID>.service.d/override.conf内容的文件:

\n
[Service]\nAmbientCapabilities=CAP_SYS_NICE\n
Run Code Online (Sandbox Code Playgroud)\n

然后,运行systemctl daemon-reload、注销,然后重新启动或以另一个用户身份登录,并确保user@<your-UID>.service之前会话中的 不再在系统上处于活动状态。现在,以您自己的身份再次登录后,您的所有用户帐户的用户级服务都应该具有CAP_SYS_NICE可用的功能。

\n

例如,我的 UID 是 1000,因此我创建的文件被命名/etc/systemd/system/user@1000.service.d/override.conf,并且我的会话包含gvfs-daemon.service. 我会找出它的PID并使用/sbin/getpcaps查询其能力状态:

\n
$ systemctl --user status gvfs-daemon\n\xe2\x97\x8f gvfs-daemon.service - Virtual filesystem service\n   Loaded: loaded (/usr/lib/systemd/user/gvfs-daemon.service; static; vendor preset: enabled)\n   Active: active (running) since Fri 2020-05-29 11:07:28 EEST; 50s ago\n Main PID: 11467 (gvfsd)\n   CGroup: /user.slice/user-1000.slice/user@1000.service/gvfs-daemon.service\n           \xe2\x94\x94\xe2\x94\x8011467 /usr/lib/gvfs/gvfsd\n[...]\n$ /sbin/getpcaps 11467\nCapabilities for `11467': = cap_sys_nice+eip\n
Run Code Online (Sandbox Code Playgroud)\n

因此,该功能现在可用:有效、可继承和允许。本次测试是在 Debian 10 上进行的。

\n

一旦您的用户级服务可以使用必要的功能,除非主动阻止用户级服务中的选项systemd的使用,否则用户级服务中的选项应该变得有效。CPUSchedulingPolicyCPUSchedulingPolicy

\n

在基于 Debian 的发行版上,您可以添加rootAmbientCapabilities权限/lib/systemd/system/user@.service,以便任何用户的服务都可以使用这些功能。

\n

但是,您应该知道,CAP_SYS_NICE允许具有该功能的进程更改系统中任何进程的良好值和调度策略。这可能会被恶意地使用,要么作为拒绝服务攻击,要么作为一种使特权进程能够轻松获胜的任何可能的竞争条件的方式,从而使已经具有非 root 访问权限的攻击者更容易获得获得root权限。因此,您只想将此功能提供给受信任的用户。

\n