Je pense avoir trouvé une meilleure solution que celles actuellement présentées ici. En partie parce que pour autant que je sache, cgmanager est mort, en partie parce que ma solution ne ressemble pas à une solution de contournement hacky, mais surtout parce que cette discussion apparaît toujours lors de la recherche d'une solution au problème. C'est assez simple en fait: utilisez le mode utilisateur systemd .
Accordé si vous n'utilisez pas systemd, cette solution ne va pas vous aider. Dans ce cas, je vous conseillerais de déterminer si votre système init a un moyen d'autoriser les utilisateurs non autorisés à exécuter des services au démarrage et à l'utiliser comme point de départ.
Utilisation du mode utilisateur systemd pour démarrer automatiquement les conteneurs lxc non privilégiés
Je suppose que vous avez des conteneurs lxc non privilégiés qui fonctionnent correctement et que cela fonctionne lxc-autostart
comme l'utilisateur du conteneur fonctionne. Si oui, procédez comme suit:
- Créez le fichier
~/.config/systemd/user/lxc-autostart.service
dans la maison de tout utilisateur disposant des conteneurs 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
- Alors que cet utilisateur s'exécute:
systemctl --user enable lxc-autostart
(Remarque, l' --user
option indique à systemctl que vous l'utilisez en mode utilisateur. Toutes les choses que je fais normalement avec systemctl, démarrer, arrêter, statuc, activer, etc., fonctionnent avec --user.)
- Exécutez ensuite ce qui suit, où
$user
est le nom de l'utilisateur qui possède les conteneurs lxc:
sudo loginctl enable-linger $user
Ceci est nécessaire pour que systemd démarre une instance d'utilisateur systemd $user
au démarrage. Sinon, il n'en démarrerait qu'un au moment de la $user
connexion.
Pour plus d'informations, je recommanderais la page systemlin / timer archlinux wiki et les pages de manuel systemd .
Accès à l'instance systemd d'un utilisateur en tant que root
Vous pouvez réellement démarrer / arrêter / quel que soit le service systemd d'un utilisateur en tant que root, mais cela vous oblige à définir la XDG_RUNTIME_DIR
variable d'environnement. Supposons que $user
c'est l'utilisateur dont vous souhaitez accéder à l'instance et $uid
son uid, alors voici comment démarrer le lxc-autostart.service défini ci-dessus:
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart
Vous pouvez même utiliser systemd-run
pour exécuter des commandes arbitraires en tant que cet utilisateur d'une manière qui ne casse pas lxc. J'utilise les commandes suivantes pour arrêter / démarrer mes conteneurs avant / après la sauvegarde, où $name
est le nom du conteneur lxc en cours de sauvegarde:
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
(Notez que sans --wait
systemd-run ne bloque pas tant que le conteneur n'est pas arrêté.)