Я думаю, что нашел лучшее решение, чем представленные здесь. Отчасти потому, что, насколько я могу судить, cgmanager мертв, отчасти потому, что мое решение не похоже на хакерский обходной путь, а в основном потому, что это обсуждение все еще появляется при поиске решения проблемы. На самом деле все довольно просто: используйте пользовательский режим systemd .
Конечно, если вы не используете systemd, это решение не поможет. В этом случае я бы посоветовал вам выяснить, есть ли в вашей системе инициализации какой-либо способ, позволяющий непривилегированным пользователям запускать службы при загрузке и использовать их в качестве отправной точки.
Использование режима пользователя systemd для автоматического запуска непривилегированных контейнеров lxc
Я предполагаю, что у вас есть непривилегированные контейнеры 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
опция сообщает systemctl, что вы используете ее в пользовательском режиме. Все, что я обычно делаю с systemctl, запуска, остановки, statuc, включения и т. Д., Работает с --user.)
- Затем запустите следующее, где
$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
(Обратите внимание, что без --wait
systemd-run не блокируется, пока контейнер не будет остановлен.)
/etc/init/lxc.conf
указатели. Это выскочка, которая запускает привилегированные контейнеры. Не должно быть слишком сложно скопировать его и изменить, чтобы отключить непривилегированные контейнеры./proc/self/cgroup
том , что он содержит последовательности , как/user/0.user/1.session
вместо/user/1000.user/1.session
В случае, если кто-то наткнется на этот вопрос и ответит на вопрос об автозапуске непривилегированных контейнеров LXC (я, конечно, много раз проверю здесь), вот решение, которое хорошо работает и которое я использовал, чтобы оно работало на моем сервере:
http://blog.lifebloodnetworks.com/?p=2118 Николас Дж. Инграселлино.
Короче говоря, это включает в себя создание двух сценариев, и они работают вместе при запуске, чтобы позволить LXC запускать непривилегированные контейнеры каждого из перечисленных пользователей без необходимости фактически входить в учетную запись пользователя; другими словами, выполнение команды от имени пользователя со всей магией CGroups. В соответствии с наилучшей практикой SO, я приведу здесь все это, но стоит прочитать его оригинальную статью.
Я просто хотел бы подчеркнуть, что, похоже, он работает безопасно, правильно и не требует рут SSH для учетных записей других пользователей.
Здесь также есть более подробная информация (касающаяся связанных проблем) здесь: https://gist.github.com/julianlam/4e2bd91d8dedee21ca6f, которая может быть полезна для понимания, почему это так.
источник
Я написал небольшой скрипт для решения этой проблемы, просто следуйте закомментированным инструкциям.
источник
Извините: ответил слишком рано. Это не сработало, хотя 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, тогда следующая команда должна обратиться к тому, что вы ищете ...
Это просто запустит указанную выше команду при входе через bash. Это также предполагает, что bash является оболочкой входа в систему. Пожалуйста, замените имя:
LXC-CONTAINER-NAME
именем вашего контейнера LXC, который вы хотите запустить.источник
Я использовал другой подход, и он работает
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"
источник