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

9

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

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

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

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

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

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

HRJ
источник

Ответы:

3

Я думаю, что нашел лучшее решение, чем представленные здесь. Отчасти потому, что, насколько я могу судить, 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опция сообщает systemctl, что вы используете ее в пользовательском режиме. Все, что я обычно делаю с systemctl, запуска, остановки, statuc, включения и т. Д., Работает с --user.)

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

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

Для получения дополнительной информации я бы порекомендовал страницу systemd / timer вики archlinux и справочные страницы 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

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

Wieke
источник
7

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

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

@reboot lxc-autostart

закодированный
источник
Это звучит великолепно. Тем не менее, похоже, что нет способа запустить команду при выключении (через cron). Любые идеи?
HRJ
Я не знаю каких-либо простых способов запустить работу при завершении работы. Вы, вероятно, должны были бы с правами root добавить задание для выгрузки для закрытия контейнеров для каждого пользователя, которому они принадлежат. Вы можете посмотреть на /etc/init/lxc.confуказатели. Это выскочка, которая запускает привилегированные контейнеры. Не должно быть слишком сложно скопировать его и изменить, чтобы отключить непривилегированные контейнеры.
закодировано
1
Мне приходит в голову, что, поскольку каждый процесс в контейнере является видимым с хоста, контейнеру, вероятно, не требуется ничего особенного для его закрытия, каждый процесс должен получать сигнал TERM от хоста. Скорее всего, вам не нужно делать ничего особенного при выключении. Если вы хотите запустить некоторые сценарии или другие подобные вещи при завершении работы, это не так, но большинство процессов должны иметь возможность нормально завершить работу.
закодировано
Работает ли подход crontab? В Ubuntu 14.04 я получаю ошибку «Ошибка вызова cgmanager_move_pid_sync: недопустимый запрос», которая возникает из-за того, что PAM, а именно libpam-systemd, не участвует в процессе смены пользователя. Вы можете видеть в /proc/self/cgroupтом , что он содержит последовательности , как /user/0.user/1.sessionвместо/user/1000.user/1.session
Daniel ольхи
3

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

Кевин Тельджер
источник
2

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

Тьяго де Арруда
источник
0

Извините: ответил слишком рано. Это не сработало, хотя lxc-ls показывает «AUTOSTART» как «ДА».

Вот ссылка с гораздо более полезной информацией, и, возможно, кто-то может использовать ее: 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». Я не смотрел на то, как система ищет непривилегированные контейнеры во время загрузки.

LXC N00B
источник
0

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

#!/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
Сэм
источник
-1

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

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

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

user249005
источник
-1

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

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

AUTO START CONFIG

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 Изображение randomart ключа: + - [RSA 2048] ---- + | | | | | о | | * + | | ES | | = * | | = о = | | , +. +. | | oO = oo | + ----------------- +

userlxc @ GEST-4: ~ $ cat .ssh / id_rsa.pub >> .ssh / authorized_keys userlxc @ GEST-4: ~ $ ls -lrt .ssh / авторизованный_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-тест ОСТАНОВЛЕН - - НЕТ
UBUSER1404USERLXCCONT01 ОСТАНОВЛЕН - - НЕТ

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

@reboot ssh userlxc @ localhost "lxc-autostart"

user323185
источник