LINUX.ORG.RU

Контейнер не хочет корректно выгружаться.

 , ,


0

1

Есть контейнер с Debian Stretch внутри Debian Stretch (LXC 2.x).
Запускается и работает одинаково хорошо через lxc-start -n container и systemctl start lxc@container.
Нормально выключается через lxc-stop -n container, возвращая виртуальный адаптер сети хосту. Но вот при попытке systemctl stop lxc@container виснет до таймаута, а затем убивается systemd, не возвращая хосту сетевой адаптер и отказываясь запускаться снова (Оно и понятно - сетевого адаптера то нет).
Пытался гуглить, но подавляющее большинство информации - по LXD, которого нет, и про проблему с сигналом, который посылается LXC PID 1 контейнера - SIGPWR, которую вроде бы решили.
В чём может быть проблема, где и какие логи стоит посмотреть? Как это отладить?

Deleted
Ответ на: комментарий от intelfx
# /lib/systemd/system/lxc@.service
[Unit]
Description=LXC Container: %i
# This pulls in apparmor, dev-setup, lxc-net
After=lxc.service
Wants=lxc.service
Documentation=man:lxc-start man:lxc

[Service]
Type=simple
KillMode=mixed
KillSignal=SIGPWR
TimeoutStopSec=120s
ExecStart=/usr/bin/lxc-start -F -n %i
# Environment=BOOTUP=serial
# Environment=CONSOLETYPE=serial
Delegate=yes
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

И ещё это в lxc.service

# /lib/systemd/system/lxc.service
[Unit]
Description=LXC Container Initialization and Autoboot Code
After=network.target lxc-net.service
Wants=lxc-net.service
Documentation=man:lxc-autostart man:lxc

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/usr/lib/x86_64-linux-gnu/lxc/lxc-apparmor-load
ExecStart=/usr/lib/x86_64-linux-gnu/lxc/lxc-containers start
ExecStop=/usr/lib/x86_64-linux-gnu/lxc/lxc-containers stop
# Environment=BOOTUP=serial
# Environment=CONSOLETYPE=serial
Delegate=yes
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target
Мне, к сожалению, это мало о чём говорит. Хотя да, ничего похожего на lxc-stop нет.

Deleted
()
Ответ на: комментарий от Deleted

А, есть KillSignal=SIGPWR что вроде как и должно «убивать» systemd (PID 1) внутри контейнера. Но этого не происходит. Может нужна какая-то конфигурация что бы systemd внутри контейнера реагировал на этот сигнал? Alpine то в другом контейнере (Там OpenRC) выгружается нормально.

Deleted
()
Ответ на: комментарий от Deleted

Ну да, есть догадка.

Чему для твоего контейнера равен lxc.signal.halt? В конфиге. Если не SIGPWR, я озвучу гипотезу и предлагаемое решение.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)

у тебя уже второй тред про попытку заставить древний, голый lxc работать.
lxc setgid: Invalid argument (комментарий) только сегодня иронизировал над любовью нашего контингента к дебиану.
интерфейс тебе systemd не вернёт, оно тут вообще ни при чём. может быть интерфейс где-то в другом неймспейсе, а может и нет.
99% тредов за lxc — это мышемакаки с проксмоксом, ну ненайдёшь ты тут компетенции в древнерептилоидных технологиях.
или переходи на светлую сторону или советую тебе писать прямо на discuss.linuxcontainers

system-root ★★★★★
()
Ответ на: комментарий от intelfx

В конфиге, а так же всём что lxc.include рекурсивно - не указано.
Документация говорит что если не задано, то SIGPWR по умолчанию.

Deleted
()
Ответ на: комментарий от system-root

Но он же работает. Кроме проблем с выключением второго контейнера, которые наверняка можно решить. Были бы официальные репы для дебиана с LXD, или за что ты там агитировал, - попробовал бы. Но их нет, как и желания переходить на убунту. Я только хорошо так осел, и тут опять куда-то бежать - ну нафиг (Хотя если мне доведётся ещё где-то ещё разворачивать контейнеры - можно будет и попробовать).

Deleted
()
Ответ на: комментарий от Deleted

Тогда я не знаю. :)

Гипотеза была в том, что systemd, вообще говоря, на SIGPWR не реагирует (точнее, реагирует, но не так). Он реагирует на SIGRTMIN+3. lxc-stop посылает контейнеру тот сигнал, который у него в конфиге, а этот юнит посылает строго SIGPWR.

В любом случае, попробуй дописать в юнит в секцию [Service] директиву ExecStop=/usr/bin/lxc-stop -n %i, KillMode= заменить на control-group и KillSignal= убрать. Потом daemon-reload.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от Deleted

попробовал бы. Но их нет

в этом дебиане даже snapd нету? установка LXD через snap — это рекомендованный разработчиками способ, но там нужно почитать про миграцию с 2.х пакетной версии.

system-root ★★★★★
()
Ответ на: комментарий от intelfx

Как сделать это через /etc с ходу я не понял, завтра уже попробую разобраться. Но это дало подсказку как сделать проще (не лучше) - добавлением в /etc/systemd/system/lxc@container.service.d/kill_signal_fix.conf.

[Service]
KillSignal=SIGRTMIN+3
Работает именно так как надо. Благодарю.

Deleted
()
Ответ на: комментарий от system-root

Есть, но... КАКОЙ УЖАС. Предпочту рептилойдные технологии ЭТОМУ в любое время. Нет, ну правда, тащить эту пакость что бы затем тащить ещё LXD, что бы в итоге получить то, что, как оказалось, исправляется двумя строчками? Зачем, какой в этом смысл, особенно если учесть что я один раз хочу настроить эти контейнеры и забыть про них?
Кстати, проигнорировал:

интерфейс тебе systemd не вернёт, оно тут вообще ни при чём. может быть интерфейс где-то в другом неймспейсе, а может и нет.

Так оно и есть - процесс с контейнером же убиваются через SIGKILL, вполне логично что адаптер не возвращается из неймспейса, да и сам неймспейс, который больше не нужен, наверняка висит без дела.

Deleted
()
Ответ на: комментарий от Deleted

то, что, как оказалось, исправляется двумя строчками?

сначала задай себе вопрос, какого хрена ты вообще что-то чинишь, тем более какие-то вшивые две строчки.
дело твоё, но как бы виртуалочка есть, чтобы посмотреть как оно.

system-root ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.