我想确保位于特定路径的二进制文件始终作为特定 cgroup 的一部分运行。到目前为止我发现的所有内容都涉及通过一些特殊命令运行二进制文件(例如,与systemd-run
或 与cgexec
)。这并不完全是我想要的,因为找到调用二进制文件的所有可能方式(通过终端、通过 DE 启动面板、通过自动启动......)试图修改它们将是一项艰巨的任务。
我认为我需要以某种方式将 AppArmor 或 SELinux 与 cgroup 结合起来,但我找不到任何关于如何做到这一点的解释。
背景:在我的工作笔记本电脑上,我有时会遇到交换风暴。我冒险尝试调整我的系统。下列的“捍卫互换”博客文章 我做了一些实验,发现这vm.swappiness = 100
比较低的更好vm.swappiness = 10
,即使在 HDD 上也是如此,至少对于 zswap 和我的工作流程来说是这样。使用了一段时间后,我注意到一个奇怪的事情:Skype 进程,我只在早上使用一次,其余时间都在后台闲置,成功地以 0 经历了两次交换风暴(零!)SWAP 中的千字节。仅在第三次交换风暴中 Skype 才获得了一点点(与类似PSS的其他流程相比)将其 6 个进程中的每一个进程放入 SWAP 中。这是一个令人惊讶的行为,也是我不喜欢的。我希望 Skype 成为回收的第一批受害者之一,因为它 97% 的运行时间除了“在线”之外什么也不做。
同时,我还认为我可能希望减少其他一些重要进程(例如 i3 和 Plasma)回收的可能性。
cgroupsmemory
为此提供了各种挂钩,例如memory.low
本文中提到的。所以我想利用它来调整系统中的各种进程。但我想确保它能够正常工作,无论二进制文件是从终端运行,还是通过 运行rofi
,还是其他方式运行。
作为一种黑客,我可以用通过运行原始可执行文件的包装脚本来替换我感兴趣的二进制文件systemd-run
。但它会在下次更新时被覆盖;这显然是一个黑客行为,所以,嗯。
答案1
AppArmor 和 SELinux 都是 LSM 模块。他们不知道 cgroup。您不能将它们用于此目的。
恕我直言,使用包装方法是最好的选择。
您可以将包装器放在~/bin
目录中,并将该目录放在PATH
环境变量的第一位。然后在包装器中您需要使用二进制文件的完整文件路径,这样您就可以避免无限循环。这样,所有使用相对二进制名称并遵循的工具都PATH
将执行包装器。但这也意味着您可能需要调整.desktop
文件以使其使用包装器,因为这些文件通常使用可执行文件的完整文件路径。
如果您确实想避免包装器,则必须编写一个脚本来监视正在运行的进程并将符合您条件的进程移至其目标 cgroup。我认为与包装方法相比,这种方法更加黑客。