我在 Archlinux 上运行 LXC。
我有 Arch、Fedora、Centos、Debian 和 Ubuntu LXC 容器的组合,每个容器都基于 systemd。
如果我尝试打开超过 19 个 LXC 容器,第 20 个容器将启动,但内部不会运行 systemd。 (ps aux
仅显示bash
、init
、 和ps
)
我认为这可能与打开文件的数量有关,因为当我运行poweroff
大量 LXC 容器时,centos 容器有时会报告“打开文件太多”。但我增加了文件限制如此链接中所述,重新启动并验证更改,但我的问题仍然存在。
可能是什么原因造成的?
答案1
如果您的问题发生在非特权(即:使用用户命名空间)容器上,而不是特权(即:root)容器上,我相信这可能是由于运行容器的同一用户对 inotify 接口的使用受到限制造成的。显然 systemd 依赖于 inotify。 Debian buster LXC 软件包包含一个放松 sysctl 的fs.inotify.max_user_instances
设置/etc/sysctl.d/30-lxc-inotify.conf
:
# Defines the maximum number of inotify listeners. # By default, this value is 128, which is quickly exhausted when using # systemd-based LXC containers (15 containers are enough). # When the limit is reached, systemd becomes mostly unusable, throwing # "Too many open files" all around (both on the host and in containers). # See https://kdecherf.com/blog/2015/09/12/systemd-and-the-fd-exhaustion/ # Increase the user inotify instance limit to allow for about # 100 containers to run before the limit is hit again fs.inotify.max_user_instances = 1024
这此设置的相关文档告诉:
/proc/sys/fs/inotify/max_user_instances
这指定了每个真实用户 ID 可以创建的 inotify 实例数量的上限。
如果您的 LXC 安装不包含此类设置,您可以检查是否只是在主机上运行:
sysctl -w fs.inotify.max_user_instances=1024
将解决问题。