![如何确定在非特权容器中运行的进程的 ulimit?](https://linux22.com/image/207986/%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E5%9C%A8%E9%9D%9E%E7%89%B9%E6%9D%83%E5%AE%B9%E5%99%A8%E4%B8%AD%E8%BF%90%E8%A1%8C%E7%9A%84%E8%BF%9B%E7%A8%8B%E7%9A%84%20ulimit%EF%BC%9F.png)
最近,当我在一个非特权的 nspawn 容器(用于 CI)中构建一些东西时,主机系统运行 arch linux,我反复遇到来自yarn的 EMFILE 错误,表明我试图打开太多文件。
我试过:
- 增加
ulimit -n
容器和主机,并进行调整/etc/limits.conf
。但是,没有骰子 - 报告了更高的限制,但错误仍然发生。 LimitNOFILE
在容器文件中将其设置.nspawn
为非常高的值。仍然没有(包括 nspawn 调用--settings=override
)。- 设置
LimitNOFILE=infinity
,ulimit.conf
遵循以下建议:https://serverfault.com/questions/848088/how-to-set-max-file-descriptors-for-a-container - 增加
fs.inotify.max_user_instances
和fs.inotify.max_user_watches
通过sysctl
,因为这些可以显然导致 EMFILE 错误。
最终有效的是通过设置切换到特权容器PrivateUsers=off
,遵循此处的对话:https://bbs.archlinux.org/viewtopic.php?id=232804。这还需要以 root 身份(在容器内)运行失败的命令。
所以,我的问题是:usernamespacing 如何与 ulimit 交互, 和为什么这能解决我的问题当前面的步骤没有时?
良好心理模型的奖励积分将帮助下一个必须调试此类事情的人。