如何确定在非特权容器中运行的进程的 ulimit?

如何确定在非特权容器中运行的进程的 ulimit?

最近,当我在一个非特权的 nspawn 容器(用于 CI)中构建一些东西时,主机系统运行 arch linux,我反复遇到来自yarn的 EMFILE 错误,表明我试图打开太多文件。

我试过:

  1. 增加ulimit -n容器和主机,并进行调整/etc/limits.conf。但是,没有骰子 - 报告了更高的限制,但错误仍然发生。
  2. LimitNOFILE在容器文件中将其设置.nspawn为非常高的值。仍然没有(包括 nspawn 调用--settings=override)。
  3. 设置LimitNOFILE=infinityulimit.conf遵循以下建议:https://serverfault.com/questions/848088/how-to-set-max-file-descriptors-for-a-container
  4. 增加fs.inotify.max_user_instancesfs.inotify.max_user_watches通过sysctl,因为这些可以显然导致 EMFILE 错误。

最终有效的是通过设置切换到特权容器PrivateUsers=off,遵循此处的对话:https://bbs.archlinux.org/viewtopic.php?id=232804。这还需要以 root 身份(在容器内)运行失败的命令。

所以,我的问题是:usernamespacing 如何与 ulimit 交互, 和为什么这能解决我的问题当前面的步骤没有时?

良好心理模型的奖励积分将帮助下一个必须调试此类事情的人。

相关内容