Как подключиться к контейнеру linux, запущенному с помощью systemd?

Короче говоря, у меня есть несколько непривилегированных контейнеров, которые запускаются при загрузке, из которых я мог запускать rc.local. Это больше не работает, и в настоящее время запускайте их с помощью модуля systemd. Они запускаются, но я не могу lxc-attach -n <container> им.

Длинная история, я запускаю базовую скользящую установку Debian (отслеживает стабильную, но также могу извлекать из экспериментальных, тестовых и нестабильных через файлы настроек) с lxc 1: 4.0.5-2 и systemd 247.2-5. Это было после apt-get -y dist-upgrade. Контейнеры были созданы до обновления (до 24 января 2021 г.) и запускались из rc.local одной строкой:

su -c "lxc-autostart -a" container-user

После некоторого поиска я обнаружил, что могу запускать контейнеры через systemd после создания следующих файлов модулей:

#
# ~/.config/systemd/user/container.service
#
[Unit]
Description=lxc-autostart containers
DefaultDependencies=no
Wants=network.target lxc.service

[Service]
Type=oneshot
RemainAfterExit=yes
Delegate=yes
ExecStart=lxc-autostart -a

[Install]
WantedBy=default.target
#
# ~/.config/systemd/user/container.timer
#
[Unit]
Description=Timer to run container

[Timer]
OnBootSec=30

[Install]
WantedBy=timers.target

После простого systemctl --user enable container.timer, контейнер запускается через 30 секунд после загрузки. Без таймера я вижу сбой службы во время загрузки.

Тут все отлично, пока мне не нужно прикреплять к контейнеру. Вход в систему как пользователь и запуск lxc-attach -n container приводит к следующей ошибке:

lxc-attach: container: conf.c: userns_exec_minimal: 4236 Permission denied - Running parent function failed

После того, как это не удается, мне обычно приходится reset терминал, чтобы я снова мог видеть, что печатаю. Еще я пробовал бежать lxc-attach с участием systemd-run (именно так я изначально отлаживал запуск контейнера) вот так:

systemd-run --user -r -p "Delegate=yes" lxc-attach -n container

Это печатает сообщение о том, Running as unit: run-<rando chars>.service но терминала нет.

Я чувствую, что танцую вокруг решения, но мне не хватает чего-то важного (или двух, или трех). Что действительно раздражает, так это то, что я больше не могу свободно добавлять или удалять пакеты из контейнеров, не останавливая их, su - к chroot rootfs рассматриваемого контейнера, а затем apt-get install <package>. И даже тогда это кажется неправильным, поскольку uid и gid неверны для каждого файла, который загружается и устанавливается таким образом, что отражает настоящий root uid и gid хост-системы. О, и еще, я могу lxc-stop -n <container> без systemd-run. Получение статуса container.service покажет это как active(exited) после его остановки.

Некоторые из ранее существовавших контейнеров имеют openssh-server установлен (когда я смог использовать lxc-attach свободно), что приемлемо для меня для администрирования этих контейнеров, но используемые мной шаблонные контейнеры (lxc-create -n <new container> -t download -- -d debian -r buster -a amd64 например) по умолчанию не установлен ssh-сервер.

Итак, после всего этого, что я могу сделать, чтобы присоединиться к этим контейнерам после их запуска? Неужели я застрял в остановке контейнеров, подключении к ним chroot для установки пакетов, а затем нахождении всех новых установленных файлов, чтобы связать их с правильными uid и gid контейнера?

1 ответ
1

Во-первых, я ошибочно заявил, что отслеживаю стабильную ветку Debian, но оказалось, что на самом деле я отслеживаю тестирование. Я узнал об этом после того, как зашел на # debian-lxc на irc в поисках ответов. Там пользователь (Женеч) упомянул, что их непривилегированные контейнеры работают на стабильной платформе, как и я?!? apt-cache madison lxc lxc-templates systemd подтвердил мою ошибку. Отслеживал это до моих файлов настроек в /etc/apt/preferences.d/.

Я надеюсь, что эта странная проблема будет решена в более поздних версиях systemd и / или lxc, но до тех пор мое временное решение — понизить версию lxc, lxc-templates и systemd в свои стабильные пакеты Debian, 1:3.1.0+really3.0.3-8, 3.0.4-0+deb10u1 и 241-7~deb10u5 соответственно.

Я также настроил системный блок .service файл, чтобы я мог правильно остановить контейнеры:

#
# ~/.config/systemd/user/container.service
#
[Unit]
Description=lxc-autostart containers
DefaultDependencies=no
Wants=network.target lxc.service

[Service]
Type=simple
RemainAfterExit=yes
Delegate=yes
ExecStart=lxc-start -n <container name>
ExecStop=lxc-stop -n <container name>

[Install]
WantedBy=default.target

Напоминания на будущее:

  • systemd 247.2-5 иерархия по умолчанию = унифицированный
  • systemd 241 иерархия по умолчанию = гибрид
  • lxc 3.0.3 требует +2 числа на интерфейс / etc / lxc / lxc-usernet
  • переход на более раннюю версию — отстой

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *