Я думаю, що я знайшов краще рішення, ніж ті, які представлені тут. Частково тому, що наскільки я можу сказати, що cgmanager мертвий, частково тому, що моє рішення не схоже на хитре вирішення проблеми, а здебільшого тому, що ця дискусія все ще з'являється під час пошуку рішення проблеми. Насправді це досить просто: використовуйте системний режим користувача .
Звичайно, якщо ви не використовуєте systemd, це рішення не допоможе. У такому випадку я б порадив вам розібратися, чи є у вашій системі init якийсь спосіб дозволяти непривіреним користувачам запускати сервіси під час завантаження та використовувати це як вихідну точку.
Використання системного режиму користувача для автоматичного запуску непривілейованих контейнерів 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, start, stop, statuc, enable тощо, працюю з --user.)
- Потім запустіть наступне, де
$user
ім'я користувача, у якого є контейнери lxc:
sudo loginctl enable-linger $user
Це необхідно для systemd для запуску екземпляра користувача systemd для $user
під час завантаження. В іншому випадку він розпочне лише один на даний момент $user
вхід у систему.
Для отримання додаткової інформації я б порекомендував сторінку wiki systeml / timeer від archlinux та сторінок systemd man .
Доступ до системного екземпляра користувача як корінь
Ви можете фактично запустити / зупинити / будь-яку системну службу користувача як 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
запуску системи не блокується, поки контейнер не зупинений.)