
Я использую LXC на Archlinux.
У меня есть комбинация контейнеров Arch, Fedora, Centos, Debian и Ubuntu LXC, каждый из которых основан на systemd.
Если я попытаюсь открыть более 19 контейнеров LXC, 20-й контейнер запустится, но без запущенного systemd внутри. ( ps aux
показывает только bash
, init
, и ps
)
Я думал, что это может быть связано с количеством открытых файлов, так как контейнер centos иногда сообщает "слишком много открытых файлов", когда я запускаю poweroff
его внутри, в то время как у меня запущено большое количество контейнеров LXC. Но я увеличил лимиты файловкак описано в этой ссылке, перезагрузил и проверил изменения, но проблема осталась.
Что может быть причиной этого?
решение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
Theсоответствующая документация для этого параметрарассказывает:
/proc/sys/fs/inotify/max_user_instances
Это определяет верхний предел количества экземпляров inotify, которые могут быть созданы для одного реального идентификатора пользователя.
Если ваша установка LXC не включает такую настройку, вы можете просто проверить, запущена ли она на хосте:
sysctl -w fs.inotify.max_user_instances=1024
решит проблему.