Myślę, że znalazłem lepsze rozwiązanie niż obecnie prezentowane tutaj. Po części dlatego, że o ile mogę stwierdzić, cgmanager nie żyje, po części dlatego, że moje rozwiązanie nie wydaje się hackującym obejściem, ale głównie dlatego, że ta dyskusja wciąż pojawia się podczas szukania rozwiązania problemu. Jest to dość proste: użyj trybu użytkownika systemowego .
Oczywiście, jeśli nie używasz systemd, to rozwiązanie nie pomoże. W takim przypadku radzę ci dowiedzieć się, czy Twój system init ma jakiś sposób na umożliwienie nieuprzywilejowanym użytkownikom uruchamiania usług podczas rozruchu i używania tego jako punktu wyjścia.
Używanie trybu użytkownika systemowego do automatycznego uruchamiania nieuprzywilejowanych kontenerów LXC
Zakładam, że masz nieuprzywilejowane kontenery lxc działające poprawnie i działające, lxc-autostart
gdy działa użytkownik kontenera. Jeśli tak, wykonaj następujące czynności:
- Utwórz plik
~/.config/systemd/user/lxc-autostart.service
w domu dowolnego użytkownika, który ma kontenery 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
- Następnie jako ten użytkownik uruchom:
systemctl --user enable lxc-autostart
(Uwaga, --user
opcja mówi systemctl, że używasz go w trybie użytkownika. Wszystkie rzeczy, które normalnie robię z systemctl, start, stop, statuc, enable itp., Praca z --user.)
- Następnie uruchom następujące polecenie, gdzie
$user
jest nazwa użytkownika, który ma kontenery LXC:
sudo loginctl enable-linger $user
Jest to konieczne, aby systemd uruchomił instancję użytkownika systemd $user
podczas uruchamiania. W przeciwnym razie uruchomiłby się tylko w momencie $user
zalogowania.
Aby uzyskać więcej informacji, poleciłbym stronę archlinux wiki systemd / timer i systemd strony man .
Dostęp do wystąpienia systemowego użytkownika jako root
Możesz faktycznie uruchomić / zatrzymać / dowolną usługę systemową użytkownika jako root, jednak wymaga to ustawienia XDG_RUNTIME_DIR
zmiennej środowiskowej. Załóżmy, że $user
jest to użytkownik, do którego instancji chcesz uzyskać dostęp i $uid
jest to identyfikator UID, a następnie uruchom lxc-autostart.service zdefiniowany powyżej:
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart
Możesz nawet użyć systemd-run
do uruchomienia dowolnych poleceń jako ten użytkownik w sposób, który nie psuje LXC. Korzystam z następujących poleceń, aby zatrzymać / uruchomić moje kontenery przed / po utworzeniu kopii zapasowej, gdzie $name
jest nazwa kontenera LXC, którego kopię zapasową wykonuję:
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
(Pamiętaj, że bez --wait
uruchomienia systemowego nie blokuje się, dopóki kontener nie zostanie zatrzymany).