Назад | Перейти на главную страницу

Как автоматически запускать непривилегированные контейнеры lxc?

В Ubuntu 14.04 я создал непривилегированный контейнер, который можно запускать и останавливать вручную.

Но я бы хотел, чтобы это началось и остановилось вместе с системой.

Я добавил в конфигурацию контейнера следующее: lxc.start.auto = 1 lxc.start.delay = 5

Однако системные сценарии, похоже, не выбирают непривилегированные контейнеры.

Там есть нить связанных с этим на linuxcontainers.org, но решение, похоже, ограничено root пользователь.

Есть ли чистый способ сделать это для пользователя без полномочий root (с согласия пользователя root)?

Я бы рекомендовал использовать удобный @reboot псевдоним в Cron Ubuntu бежать lxc-autostart.

Как пользователь, владеющий непривилегированным контейнером, запустите crontab -e и добавьте следующую строку:

@reboot lxc-autostart

Думаю, я нашел лучшее решение, чем те, которые сейчас представлены здесь. Отчасти потому, что, насколько я могу судить, cgmanager мертв, отчасти потому, что мое решение не похоже на хакерский обходной путь, но главным образом потому, что это обсуждение все еще появляется при поиске решения проблемы. На самом деле это довольно просто: использовать режим пользователя systemd.

Конечно, если вы не используете systemd, это решение не поможет. В этом случае я бы посоветовал вам выяснить, есть ли в вашей системе инициализации какой-либо способ разрешить непривилегированным пользователям запускать службы при загрузке и использовать это в качестве отправной точки.

Использование пользовательского режима systemd для автоматического запуска непривилегированных контейнеров lxc

Я предполагаю, что у вас есть непривилегированные контейнеры lxc, работающие правильно и lxc-autostart как работает пользователь контейнера. Если да, сделайте следующее:

  1. Создайте файл ~/.config/systemd/user/lxc-autostart.service в доме любого пользователя, у которого есть контейнеры lxc:
[Unit]
Description="Lxc-autostart for lxc user"

[Service]
Type=oneshot
ExecStart=/usr/bin/lxc-autostart
ExecStop=/usr/bin/lxc-autostart -s
RemainAfterExit=1

[Install]
WantedBy=default.target
  1. Затем при запуске этого пользователя:
systemctl --user enable lxc-autostart

(Обратите внимание --user option сообщает systemctl, что вы используете его в пользовательском режиме. Все, что я обычно делаю с помощью systemctl, start, stop, statuc, enable и т.д., работает с --user.)

  1. Затем запустите следующее, где $user это имя пользователя, у которого есть контейнеры lxc:
sudo loginctl enable-linger $user

Это необходимо, чтобы systemd запустил пользовательский экземпляр systemd для $user при загрузке. В противном случае он запустил бы только один в данный момент $user авторизуется.

Для получения дополнительной информации я бы рекомендовал вики Archlinux systemd / таймер страница и справочные страницы systemd.

Доступ к экземпляру systemd пользователя как root

На самом деле вы можете запускать / останавливать / любую службу systemd пользователя как root, однако для этого вам необходимо установить XDG_RUNTIME_DIR переменная окружения. Предполагать $user - это пользователь, к экземпляру которого вы хотите получить доступ, и $uid это uid, тогда вы должны запустить службу lxc-autostart.service, определенную выше:

sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart

Вы даже можете использовать systemd-run запускать произвольные команды от имени этого пользователя таким образом, чтобы не нарушать lxc. Я использую следующие команды для остановки / запуска моих контейнеров до / после резервного копирования, где $name это имя контейнера lxc, для которого создается резервная копия:

sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --wait lxc-stop -n $name
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --scope lxc-start -n $name

(Обратите внимание, что без --wait systemd-run не блокируется, пока контейнер не остановлен.)

Если кто-то наткнется на этот вопрос и ответ на вопрос об автозапуске непривилегированных контейнеров LXC (я, конечно, часто проверяю здесь), вот решение, которое хорошо работает, и я следил за ним, чтобы заставить его работать на моем сервере:

http://blog.lifebloodnetworks.com/?p=2118 Николаса Дж. Инграсселлино.

Вкратце, это включает в себя создание двух сценариев, и они работают вместе при запуске, чтобы позволить LXC запускать непривилегированные контейнеры каждого указанного пользователя без фактического входа в учетную запись пользователя; другими словами, выполнение команды от имени пользователя со всей магией CGroups без изменений. В соответствии с передовой практикой SO, я процитирую его здесь, но стоит прочитать его оригинальную статью.

Разрешить нашей учетной записи использовать мост…

echo "$USER veth lxcbr0 1024" | sudo tee -a /etc/lxc/lxc-usernet

Создать сценарий Upstart… В /etc/init/lxc-unprivileged.conf Добавить…

description "LXC Unprivileged Containers"
author "Mike Bernson <mike@mlb.org>"

start on started lxc

script
    USERS="[user]"

    for u in $USERS; do
        cgm create all lxc$u
        cgm chown all lxc$u $(id -u $u) $(id -g $u)
        lxc-autostart -L -P /home/$u/.local/share/lxc | while read line;
        do
            set -- $line
            /usr/local/bin/startunprivlxc lxc$u $u $1
            sleep $2
        done
    done
end script

Обязательно замените [user] своей учетной записью.

Создайте сценарий запуска контейнера… В /usr/local/bin/startunprivlxc Добавить…

#!/bin/sh

cgm movepid all $1 $$
sudo -iH -u $2 -- lxc-start -n $3 -d

… И сделать его исполняемым…

sudo chmod +x /usr/local/bin/startunprivlxc

Я просто хотел бы подчеркнуть, что он работает безопасно, правильно и не требует корневого доступа SSH для других учетных записей пользователей.

Здесь также есть дополнительная информация (касающаяся связанных ошибок): https://gist.github.com/julianlam/4e2bd91d8dedee21ca6f что может быть полезно для понимания того, почему это так.

Я написал небольшой сценарий чтобы обойти проблему, просто следуйте прокомментированным инструкциям.

ИЗВИНИТЕ: ответил слишком рано. Это не сработало, хотя lxc-ls показывает «АВТОЗАПУСК» как «ДА».

Вот ссылка с гораздо более полезной информацией, и, возможно, кто-то сможет ею воспользоваться: http://www.geeklee.co.uk/unprivileged-privileged-containers-ubuntu-14-04-lxc/

Я попал на эту страницу, потому что у меня была такая же проблема. Прочитав эту ветку, я понял, что lxc-create не может писать в обычный каталог «/ var / lib / lxc /», если он не запускается с sudo.

Я осмотрелся и нашел rootfs для моего непривилегированного контейнера в "~ / .local / share / lxc" и поместил две строки вопроса в config в этом каталоге.

Я посмотрел на шаблон, который я использовал, «lxc-download» для подсказки, но я думаю, что этот путь был передан, когда вызывается «lxc-download». Я не смотрел, как система ищет непривилегированные контейнеры во время загрузки.

Я запускаю каждый непривилегированный контейнер с одним и тем же пользователем для лучшей изоляции, и вот как я это делаю:

#!/bin/bash

LXC_CONTAINERS="container1 container2"

for LXC_CONTAINER in $LXC_CONTAINERS; do
 su - $LXC_CONTAINER -c "lxc-start -n $LXC_CONTAINER --logfile /home/$LXC_CONTAINER/.local/share/lxc/lxc-$LXC_CONTAINER.log --logpriority DEBUG"
done

Предполагая (которые являются матерью всех способов облажаться), вы входите в систему как пользователь, который "владеет" непривилегированным контейнером lxc, тогда следующая команда должна адресовать то, что вы ищете ...

$ echo "lxc-start -n LXC-CONTAINER-NAME -d" >> .bashrc

Это просто запустит указанную выше команду, когда вы войдете в систему через bash. Это также предполагает, что bash является оболочкой входа в систему. Пожалуйста, замените имя: LXC-CONTAINER-NAME с именем вашего контейнера LXC, который вы хотите запустить.

Я использовал другой подход, и он работает

1º Добавьте следующие записи в файл конфигурации контейнера

КОНФИГУРАЦИЯ АВТО ЗАПУСКА

lxc.start.auto = 1 lxc.start.delay = 5

2º Создайте доверительные отношения между пользователем контейнера и им самим на одном сервере.

userlxc @ GEST-4: ~ $ ssh-keygen -t rsa Создание пары открытых / закрытых ключей rsa. Введите файл, в котором нужно сохранить ключ (/home/userlxc/.ssh/id_rsa): Введите кодовую фразу (пусто, если кодовая фраза отсутствует): Введите ту же парольную фразу еще раз: Ваш идентификатор был сохранен в /home/userlxc/.ssh/id_rsa. Ваш открытый ключ был сохранен в /home/userlxc/.ssh/id_rsa.pub. Отпечаток ключа: c9: b4: e1: f3: bf: a3: 25: cc: f8: bc: be: b6: 80: 39: 59: 98 userlxc @ GEST-AMENCIA-4 Произвольное изображение ключа: + - [RSA 2048] ---- + | | | | | о | | * + | | E S | | = * | | = о =. | | . +. +. | | oO = oo | + ----------------- +

userlxc @ GEST-4: ~ $ cat .ssh / id_rsa.pub >> .ssh / authorized_keys userlxc @ GEST-4: ~ $ ls -lrt .ssh / authorized_keys -rw-rw-r-- 1 userlxc userlxc 404 19 ноября 17:23 .ssh / authorized_keys

Проверьте соединение ssh, у вас должна быть возможность использовать его без пароля userlxc @ GEST-4: ~ $ ssh userlxc @ localhost "lxc-ls --fancy"

ИМЯ СОСТОЯНИЕ IPV4 IPV6 АВТОЗАПУСК

EXTLXCCONT01 ОСТАНОВЛЕН - - ДА
UBUSER1404USERCONT01-test STOPPED - - НЕТ
UBUSER1404USERLXCCONT01 ОСТАНОВЛЕН - - НЕТ

3º Создайте запись crontab у владельца контейнера.

@reboot ssh userlxc @ localhost "lxc-autostart"