Я думаю, что нашел лучшее решение, чем представленные здесь. Отчасти потому, что, насколько я могу судить, 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 не блокируется, пока контейнер не будет остановлен.)