Короче говоря, у меня есть несколько непривилегированных контейнеров, которые запускаются при загрузке, из которых я мог запускать 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 ответ
Во-первых, я ошибочно заявил, что отслеживаю стабильную ветку 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
- переход на более раннюю версию — отстой