Comme vous le savez probablement, par défaut lorsque vous installez un paquet sur un système basé sur Debian ou Ubuntu, si le paquet contient un service, ce service sera généralement activé et démarré automatiquement lorsque vous installerez le paquet.
C'est un problème pour moi.
Je me suis retrouvé à devoir gérer des modèles pour construire des conteneurs LXC. Il existe plusieurs conteneurs, chacun correspondant à une version Debian ou Ubuntu. (Il existe également des conteneurs basés sur Red Hat, mais ils ne sont pas pertinents ici.)
/var/lib/libvirt/filesystems/debian6_template
/var/lib/libvirt/filesystems/debian7_template
/var/lib/libvirt/filesystems/ubuntu1004_template
/var/lib/libvirt/filesystems/ubuntu1204_template
Parfois, je constate que les modèles ont un package manquant ou nécessitent d'autres modifications, je vais donc les chrooter pour installer le package. Malheureusement, lorsque je fais cela, je me retrouve avec plusieurs copies du service du package en cours d'exécution!
À titre d'exemple, j'ai trouvé que les modèles n'avaient pas de démon syslog, j'en ai donc installé un:
for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
chroot $template apt-get install rsyslog
done
Et rapidement terminé avec quatre copies de rsyslog en cours d'exécution. Sans oublier deux copies d'exim4. Oups!
J'ai lu quelque part (bien que je ne puisse pas le retrouver maintenant) qu'il n'est pas censé démarrer les services lors de l'exécution dans un chroot, mais cela ne se produit clairement pas ici.
Un hack méchant potentiellement viable nécessite le remplacement temporaire des différentes commandes qui démarrent réellement les services, comme start-stop-daemon
et initctl
, bien que ce soit beaucoup plus de travail que je ne voulais vraiment le faire. Si je n'ai pas d'autre choix, cependant ...
La solution idéale ici serait que les systèmes basés sur Debian cessent de faire cette merde, mais à défaut, peut-être une option de ligne de commande obscure ou non documentée pour apt-get
?
Au cas où ce ne serait pas clair, je veux vraiment garder tout ce qui concerne la gestion des modèles en dehors des modèles, si possible.
la source
Tu peux faire:
Je ne l'ai pas testé avec chroot, mais ça devrait marcher. Au début, il définit la variable d'environnement RUNLEVEL, donc les processus lancés par apt-get ne démarreront aucun service, car ils "penseront" que le système fonctionne en mode unique. Comme l'environnement est modifié de la façon dont il peut affecter les futures commandes, il est nécessaire de quitter le shell lorsque l'environnement modifié n'est plus nécessaire, ceci est accompli par la commande exit à la fin. Il peut y avoir des packages (rares?) Qui ne s'installent pas correctement en mode simple (mais AFAIK cela ne devrait pas être un problème dans la plupart des cas).
la source
export RUNLEVEL=1
la partie importante ici? Que fait-il exactement se produire?rsyslog
il s'agissait d'un des «rares» packages qui a complètement explosé lors de l'installation de cette manière. Cela peut néanmoins être utile, donc vous pouvez garder le vote positif :)