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

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

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

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

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

CPUSchedulingPolicy=fifo
CPUSchedulingPriority=99

但我得到这个问题。

hyegar.service: Control process exited, code=exited, status=214/SETSCHEDULER

答案1

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

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

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

[Service]
AmbientCapabilities=CAP_SYS_NICE

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

例如,我的 UID 是 1000,因此我创建的文件被命名,并且我的会话包含.我将找出它的 PID 并用于查询其能力状态:/etc/systemd/system/[email protected]/override.confgvfs-daemon.service/sbin/getpcaps

$ systemctl --user status gvfs-daemon
● gvfs-daemon.service - Virtual filesystem service
   Loaded: loaded (/usr/lib/systemd/user/gvfs-daemon.service; static; vendor preset: enabled)
   Active: active (running) since Fri 2020-05-29 11:07:28 EEST; 50s ago
 Main PID: 11467 (gvfsd)
   CGroup: /user.slice/user-1000.slice/[email protected]/gvfs-daemon.service
           └─11467 /usr/lib/gvfs/gvfsd
[...]
$ /sbin/getpcaps 11467
Capabilities for `11467': = cap_sys_nice+eip

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

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

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

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

相关内容