最近,当我在一个非特权的 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 交互, 和为什么这能解决我的问题当前面的步骤没有时?
良好心理模型的奖励积分将帮助下一个必须调试此类事情的人。