Penso di aver trovato una soluzione migliore di quelle attualmente presentate qui. In parte perché, per quanto ne so, cgmanager è morto, in parte perché la mia soluzione non sembra una sciagurata soluzione, ma soprattutto perché questa discussione si presenta ancora quando si cerca una soluzione al problema. In realtà è piuttosto semplice: usa la modalità utente di systemd .
Concesso se non usi systemd questa soluzione non ti aiuterà. In tal caso, ti consiglierei di capire se il tuo sistema init ha un modo per consentire agli utenti non privilegiati di eseguire servizi all'avvio e usarlo come punto di partenza.
Utilizzo della modalità utente di systemd per avviare automaticamente i contenitori lxc non privilegiati
Suppongo che i container lxc non privilegiati funzionino correttamente e lxc-autostart
funzionino mentre l'utente del container funziona. In tal caso, procedi come segue:
- Crea il file
~/.config/systemd/user/lxc-autostart.service
nella home di qualunque utente abbia i contenitori 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
- Quindi mentre l'utente esegue:
systemctl --user enable lxc-autostart
(Nota, l' --user
opzione dice a systemctl che la stai usando in modalità utente. Tutte le cose che faccio normalmente con systemctl, start, stop, statuc, enable, ecc., Lavoro con --user.)
- Quindi eseguire quanto segue, dove
$user
è il nome dell'utente che ha i contenitori lxc:
sudo loginctl enable-linger $user
Ciò è necessario affinché systemd avvii un'istanza utente di systemd $user
all'avvio. Altrimenti ne inizierebbe solo uno al momento del $user
login.
Per maggiori informazioni, consiglierei la pagina systemd / timer della wiki di archlinux e le pagine man di systemd .
Accesso all'istanza systemd di un utente come root
Puoi effettivamente avviare / interrompere / qualunque sia il servizio systemd di un utente come root, tuttavia questo richiede di impostare la XDG_RUNTIME_DIR
variabile di ambiente. Supponiamo che $user
l'utente abbia l'istanza a cui desideri accedere ed $uid
è uid, quindi è così che avresti avviato lxc-autostart.service definito sopra:
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart
Puoi anche usare systemd-run
per eseguire comandi arbitrari come quell'utente in un modo che non rompa lxc. Sto usando i seguenti comandi per arrestare / avviare i miei contenitori prima / dopo il backup, dove si $name
trova il nome del contenitore lxc di cui si esegue il backup:
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
(Si noti che senza --wait
systemd-run non si blocca fino a quando il contenitore non viene arrestato.)