Read Buf

Read Buf

如何在 FreeBSD Jail 中限制进程优先级?

FreeBSD 允许对一个或多个 jail 进行非常全面的资源限制。除了官方文档外,MWL 的书中也有详细的介绍。另外,Klara Systems 也有一篇有趣的文章描述了一些功能。

但是,有时我们只需要确保特定 jail 中的进程优先级高于或低于其他进程。

实现这一目标的方法很多,但我认为最简单的方法是利用 nice(1) 命令的特性。该命令的主要特性是将设定的优先级传递给子进程。因此,所有由该命令启动的进程都会继承此优先级。

例如,要将 jail 中启动的服务设置为最低优先级,只需修改 jail 的 .conf 文件。在标准的 BastilleBSD 安装中,该文件路径为 /usr/local/bastille/jails/jailname/jail.conf,将命令从

exec.start = '/bin/sh /etc/rc';

修改为:

exec.start = '/usr/bin/nice -n 20 /bin/sh /etc/rc';

这样,当 jail 启动时,rc 将以优先级 20 启动,并将此优先级传递给 rc 启动的所有进程(即该 jail 的所有服务)。

注意:这只适用于 rc 的子进程,而不适用于:

  • 通过 jail 控制台手动启动的命令
  • 通过在 jail shell 中运行 service servicename start(或 restart)启动的服务。因为在这种情况下,进程不是 rc 的子进程,而是直接从控制台派生的。

使用 nice 命令来设置 FreeBSD jail 内的进程优先级是一种简单而有效的方法。然而,我们需要意识到这种方法的局限性,并确保手动执行的命令得到适当的管理。