контейнер userns не запускается, как отследить причину?


8

При создании пользовательского (непривилегированного) контейнера LXC в Ubuntu 14.04 со следующей командной строкой:

lxc-create -n test1 -t download -- -d $(lsb_release -si|tr 'A-Z' 'a-z') -r $(lsb_release -sc) -a $(dpkg --print-architecture)

и (не касаясь созданного файла конфигурации), затем пытается запустить его с:

lxc-start -n test1 -l DEBUG

это терпит неудачу. Файл журнала показывает мне:

lxc-start 1420149317.700 INFO     lxc_start_ui - using rcfile /home/user/.local/share/lxc/test1/config
lxc-start 1420149317.700 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.701 INFO     lxc_confile - read uid map: type u nsid 0 hostid 100000 range 65536
lxc-start 1420149317.701 INFO     lxc_confile - read uid map: type g nsid 0 hostid 100000 range 65536
lxc-start 1420149317.701 WARN     lxc_log - lxc_log_init called with log already initialized
lxc-start 1420149317.701 INFO     lxc_lsm - LSM security driver AppArmor
lxc-start 1420149317.701 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/2' (5/6)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/7' (7/8)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/8' (9/10)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/10' (11/12)
lxc-start 1420149317.702 INFO     lxc_conf - tty's configured
lxc-start 1420149317.702 DEBUG    lxc_start - sigchild handler set
lxc-start 1420149317.702 DEBUG    lxc_console - opening /dev/tty for console peer
lxc-start 1420149317.702 DEBUG    lxc_console - using '/dev/tty' as console
lxc-start 1420149317.702 DEBUG    lxc_console - 14946 got SIGWINCH fd 17
lxc-start 1420149317.702 DEBUG    lxc_console - set winsz dstfd:14 cols:118 rows:61
lxc-start 1420149317.905 INFO     lxc_start - 'test1' is initialized
lxc-start 1420149317.906 DEBUG    lxc_start - Not dropping cap_sys_boot or watching utmp
lxc-start 1420149317.906 INFO     lxc_start - Cloning a new user namespace
lxc-start 1420149317.906 INFO     lxc_cgroup - cgroup driver cgmanager initing for test1
lxc-start 1420149317.907 ERROR    lxc_cgmanager - call to cgmanager_create_sync failed: invalid request
lxc-start 1420149317.907 ERROR    lxc_cgmanager - Failed to create hugetlb:test1
lxc-start 1420149317.907 ERROR    lxc_cgmanager - Error creating cgroup hugetlb:test1
lxc-start 1420149317.907 INFO     lxc_cgmanager - cgroup removal attempt: hugetlb:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: perf_event:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: blkio:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: freezer:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: devices:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: memory:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: cpuacct:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: cpu:test1 did not exist
lxc-start 1420149317.910 INFO     lxc_cgmanager - cgroup removal attempt: cpuset:test1 did not exist
lxc-start 1420149317.910 INFO     lxc_cgmanager - cgroup removal attempt: name=systemd:test1 did not exist
lxc-start 1420149317.910 ERROR    lxc_start - failed creating cgroups
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 ERROR    lxc_start - failed to spawn 'test1'
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 ERROR    lxc_start_ui - The container failed to start.
lxc-start 1420149317.910 ERROR    lxc_start_ui - Additional information can be obtained by setting the --logfile and --logpriority options.

Теперь я вижу две ошибки, последняя, ​​вероятно, является результатом первой, а именно:

lxc_start - не удалось создать cgroups

Тем не менее, я вижу /sys/fs/cgroupмонтируется:

$ mount|grep cgr
none on /sys/fs/cgroup type tmpfs (rw)

и cgmanagerустановлен:

$ dpkg -l|awk '$1 ~ /^ii$/ && /cgmanager/ {print $2 " " $3 " " $4}'
cgmanager 0.24-0ubuntu7 amd64
libcgmanager0:amd64 0.24-0ubuntu7 amd64

Примечание: Мой хозяин по умолчанию еще upstart.

В случае каких-либо сомнений поддержка ядра cgroups:

$ grep CGROUP /boot/config-$(uname -r)
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NET_CLS_CGROUP=m
CONFIG_NETPRIO_CGROUP=m

Примечание: Мой хозяин по умолчанию еще upstart.

Ответы:


7

Оказывается, неожиданный сюрприз, это особенность Ubuntu.


Причина

Проблема: хотя ядро cgroupsвключено (проверьте с помощью grep CGROUP /boot/config-$(uname -r)) и cgmanagerработает, нет cgroup, специфичной для моего пользователя. Вы можете проверить это с помощью:

$ cat / proc / self / cgroup
11: hugetlb: /
10: perf_event: /
9: blkio: /
8: морозильник: /
7: устройства: /
6: память: /
5: cpuacct: /
4: процессор: /
3: Имя = Systemd: /
2: cpuset: /

если ваш UID указан в каждой из соответствующих строк, это нормально, но если никакие cgroups не определены, после каждой двоеточия в каждой строке будет только косая черта.

Моя проблема была связана с запуском непривилегированного контейнера. Я мог бы запустить привилегированные контейнеры просто отлично.

Оказалось, что моя проблема была тесно связана с этой веткой в lxc-usersсписке рассылки .

средство

В Ubuntu 14.04 upstartиспользуется по умолчанию, в отличие от systemd. Следовательно, некоторые компоненты, которые будут установлены в systemdдистрибутиве на основе, не устанавливаются по умолчанию.

Было два пакета, в дополнение к cgmanagerкоторым мне пришлось установить, чтобы обойти ошибку, показанную в моем вопросе: cgroup-binи libpam-systemd. Честно говоря, я не уверен на 100%, что первое строго необходимо, так что вы можете попытаться оставить его здесь и прокомментировать.

После установки пакетов и перезагрузки вы должны увидеть свой UID ( id -uздесь 1000) в выходных данных:

$ cat / proc / self / cgroup
11: hugetlb: /user/1000.user/1.session
10: perf_event: /user/1000.user/1.session
9: blkio: /user/1000.user/1.session
8: морозильник: /user/1000.user/1.session
7: устройства: /user/1000.user/1.session
6: память: /user/1000.user/1.session
5: cpuacct: /user/1000.user/1.session
4: процессор: /user/1000.user/1.session
3: Имя = Systemd: /user/1000.user/1.session
2: cpuset: /user/1000.user/1.session

После этого ошибка при попытке запустить гостевой контейнер становится (сокращена для краткости):

lxc-start 1420160065.383 INFO lxc_cgroup - драйвер cgroup, запускающий cgmanager для test1
lxc-start 1420160065.419 ОШИБКА lxc_start - не удалось создать настроенную сеть
lxc-start 1420160065.446 ОШИБКА lxc_start - не удалось создать 'test1'
lxc-start 1420160065.451 ОШИБКА lxc_start_ui - Не удалось запустить контейнер.

Так что пока безуспешно, но мы на шаг ближе.

Вышеперечисленные связанные lxc-usersточки нити , чтобы /etc/systemd/logind.confне упомянуть три контроллера: net_cls, net_prioи debug. Для меня пропал только последний. После внесения изменений вам необходимо будет повторно войти в систему, так как изменения вступают в силу после создания сеанса входа в систему.

Этот блог одного из авторов LXC дает следующий шаг:

Ваш пользователь, в то время как он может создавать новые пространства имен пользователя, в которых он будет иметь uid 0 и будет иметь некоторые привилегии root для ресурсов, связанных с этим пространством имен, очевидно, не получит никаких дополнительных привилегий на хосте.

Одной из таких вещей является создание новых сетевых устройств на хосте или изменение конфигурации моста. Чтобы обойти это, мы написали инструмент под названием «lxc-user-nic», который является единственной двоичной частью SETUID в LXC 1.0 и выполняет одну простую задачу. Он анализирует файл конфигурации и на основе его содержимого создает сетевые устройства для пользователя и соединяет их. Чтобы предотвратить злоупотребления, вы можете ограничить количество устройств, которые пользователь может запросить, и к какому мосту они могут быть добавлены.

Примером является мой собственный файл / etc / lxc / lxc-usernet:

stgraber veth lxcbr0 10

Это говорит о том, что пользователю «stgraber» разрешено создавать до 10 устройств типа veth и добавлять их в мост с именем lxcbr0.

Между тем, что предлагает пространство имен пользователя в ядре и этим инструментом setuid, у нас есть все, что нужно для запуска большинства дистрибутивов непривилегированным.

Если у вашего пользователя есть sudoправа, и вы используете Bash, используйте это:

echo "$(whoami) veth lxcbr0 10"|sudo tee -a /etc/lxc/lxc-usernet

и убедитесь, что тип ( veth) совпадает с указанным в конфигурации контейнера, а мост ( lxcbr0) настроен и работает.

И теперь мы получаем еще один набор ошибок:

lxc-start 1420192192.775 INFO lxc_start - клонирование нового пространства имен пользователя
lxc-start 1420192192.775 INFO lxc_cgroup - драйвер cgroup, запускающий cgmanager для test1
lxc-start 1420192192.923 УВЕДОМЛЕНИЕ lxc_start - переключение на gid / uid 0 в новом пространстве имен пользователя
lxc-start 1420192192.923 ОШИБКА lxc_start - Отказано в доступе - не удалось получить доступ / home / user. Пожалуйста, предоставьте ему доступ 'x' или добавьте ACL для корня контейнера.
lxc-start 1420192192.923 ОШИБКА lxc_sync - неверный порядковый номер 1. ожидается 2
lxc-start 1420192192.954 ОШИБКА lxc_start - не удалось создать 'test1'
lxc-start 1420192192.959 ОШИБКА lxc_start_ui - Не удалось запустить контейнер.

Гениально, это можно исправить. Другая lxc-usersнить тех же главных героев, что и в первой, прокладывает путь.

На данный момент sudo chmod -R o+X $HOMEпотребуется выполнить быструю проверку , но ACL-списки также являются приемлемым вариантом. YMMV.


Я все еще застрял в том факте, что если я хочу запустить контейнер userns LXC от имени другого пользователя, он завершится неудачно. Создание работает (с одним предупреждением:) WARN: could not reopen tty: Permission denied. Но запуск sudo -H -i -u database lxc-start -n mysql -dне удался, как в вашем вопросе. Те же ошибки. Однако ваше исправление не работает с sudo. Если я это сделаю, sudo -H -i -u database cat /proc/self/cgroupя получу точно такой же вывод, как если бы я запускал его как мой вызывающий пользователь. Очевидно, что при попытке запустить контейнер с помощью sudo, как и другой пользователь, он попытается написать в моей cgroup, что не удалось ... :-( Любое понимание?
Huygens
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.