В 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, это решение не поможет. В этом случае я бы посоветовал вам выяснить, есть ли в вашей системе инициализации какой-либо способ разрешить непривилегированным пользователям запускать службы при загрузке и использовать это в качестве отправной точки.
Я предполагаю, что у вас есть непривилегированные контейнеры lxc, работающие правильно и lxc-autostart
как работает пользователь контейнера. Если да, сделайте следующее:
~/.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
systemctl --user enable lxc-autostart
(Обратите внимание --user
option сообщает systemctl, что вы используете его в пользовательском режиме. Все, что я обычно делаю с помощью systemctl, start, stop, statuc, enable и т.д., работает с --user.)
$user
это имя пользователя, у которого есть контейнеры lxc:sudo loginctl enable-linger $user
Это необходимо, чтобы systemd запустил пользовательский экземпляр systemd для $user
при загрузке. В противном случае он запустил бы только один в данный момент $user
авторизуется.
Для получения дополнительной информации я бы рекомендовал вики Archlinux systemd / таймер страница и справочные страницы systemd.
На самом деле вы можете запускать / останавливать / любую службу 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"
EXTLXCCONT01 ОСТАНОВЛЕН - - ДА
UBUSER1404USERCONT01-test STOPPED - - НЕТ
UBUSER1404USERLXCCONT01 ОСТАНОВЛЕН - - НЕТ
3º Создайте запись crontab у владельца контейнера.
@reboot ssh userlxc @ localhost "lxc-autostart"