Installer des packages sans démarrer les processus et services en arrière-plan

43

Parfois, l'installation de certaines applications démarrera un processus ou un service à partir de l'application exécutée automatiquement lors de l'installation. Comment puis-je installer sans les démarrer?

Oxwivi
la source
Je me demande quelle est la possibilité de laisser un système dans un état instable lors de l'installation de packages de noyau ou DKMS utilisant ce type de configuration. Je ne sais pas grand chose de ce domaine.
ændrük
@ ændrük Cela m'a inquiété. Vous voyez que j'installe Ubuntu sur un lecteur minimal, puis au lieu d’amorcer, j’utilise un Live CD / USB pour chrootinstaller les paquetages dont j’ai besoin. Bien sûr, les pilotes, en particulier, les pilotes GPU ne sont pas là et doivent être installés.
Oxwivi

Réponses:

35

Il existe un moyen un peu hackish, mais assez fiable, de le faire, que j'utilise depuis longtemps dans un script d'installation automatisée.

Commencez par créer un répertoire /root/fakecontenant , par exemple , des liens symboliques vers /bin/true:

initctl
invoke-rc.d
restart
start
stop
start-stop-daemon
service
deb-systemd-helper

Vous pouvez également leur faire des scripts bash qui ne font rien et renvoient le succès.

Ensuite, incluez ce répertoire au $PATHdébut de lors de l'installation des packages:

PATH=/root/fake:$PATH apt-get install whatever

Cela empêche uniquement les démons de démarrer / redémarrer, alors que la création d'un initramfs est toujours en cours.

Explication

Les scripts en cours d’exécution lors de l’installation et de la suppression des packages exécutent, invoke-rc.dou d’autres, les commandes mentionnées pour démarrer et arrêter les services. Cependant, ils ne les appellent pas avec des chemins absolus (du moins, je n'en ai pas rencontré un).

Donc, en insérant les fausses commandes "aucune opération" au début de $PATH, les commandes réelles ne sont jamais appelées.

Etant donné que seules les commandes utilisées pour démarrer / arrêter les services sont simulées, tout le reste, en particulier les tâches importantes telles que la mise à jour / la création d'initramfs-images, fonctionnent toujours.

bseibold
la source
Vous ne connaissez pas bien les liens symboliques, pouvez-vous élaborer avec toutes les étapes que vous suivez?
Oxwivi
Un lien symbolique est un type de fichier spécial qui n'a pas de contenu. Il fait plutôt référence à un autre fichier (par chemin / nom). Ils peuvent être créés avec ln -s, dans ce cas par exemple ln -s /bin/true /root/fake/initctl.
bseibold
Comment empêche-t-il les démons de démarrer / redémarrer? Selon @ psusi, la réponse invoke-rc.dest responsable.
Oxwivi
En plaçant le répertoire avec les commandes fictives au début de la $PATHvariable, tous les appels à invoke-rc.det autres pouvant être utilisés pour démarrer et arrêter les démons utilisent les commandes fictives. Autrement dit, à moins qu'ils ne soient appelés avec un chemin absolu, mais je ne l'ai jamais rencontré.
bseibold
Ah, maintenant je vois comment cela fonctionne - en gros, les liens symboliques mènent à des impasses. Mais quelle est exactement la /bin/truechose? Et que dire du reste des commandes impliquées dans les paquets? Ne seront-ils pas jetés hors-piste par les spécifiés $PATH?
Oxwivi
27

Les démons d'arrière-plan sont lancés avec invoke-rc.d, ce qui garantit que le démon n'est pas démarré si son script rc indique qu'il n'est pas supposé s'exécuter dans le niveau d'exécution actuel du système. Vous pouvez remplacer son idée du niveau d'exécution actuel du système en définissant la variable d'environnement RUNLEVEL. Rien n'est supposé fonctionner dans les niveaux d'exécution 0 et 6, mais il semble que ce invoke-rc.dsoit un buggy et qu'il fonctionne de toute façon si vous utilisez ces niveaux d'exécution. La plupart des démons ne s'exécutent pas au niveau d'exécution 1, vous pouvez donc empêcher leur démarrage lors de l'installation de la manière suivante:

sudo RUNLEVEL=1 apt-get install redis-server
psusi
la source
J'installe Ubuntu sur un lecteur minimal, puis, au lieu de démarrer, j'utilise un Live CD / USB pour chrootinstaller les packages dont j'ai besoin. À cause des choses qui commencent à fonctionner, parfois je suis déconnecté de la session ubuntu (live CD). Quoi qu'il en soit, ce que je veux demander, c'est comment utiliser ceci RUNLEVELdans chroot?
Oxwivi
@ Oxwivi, de la même manière, mais il est supposé détecter automatiquement que vous êtes dans un chroot et ignorer les démons de démarrage.
Psusi
Est-il possible que le buggy invoke-rc.dsoit responsable des problèmes que j'ai rencontrés?
Oxwivi
@ Oxwivi, c'est possible, mais il est plus probable qu'un paquet particulier soit buggé et qu'il ne l'utilise pas invoke-rc.d. Quel paquet était-ce?
Psusi
Je n'en ai aucune idée, je viens d'énumérer tous les paquets à installer et le terminal ne me dérange plus pour afficher le résultat.
Oxwivi
5

Je crois que vous devez utiliser l' --no-triggersoption de ligne de commande lorsque vous effectuez l' dpkginstallation. Quelque chose comme ça:

dpkg -i --no-triggers SomeBigPackage.deb

Pour que ce paramètre soit persistant et apt-get installne déclenche aucun déclencheur, créez un fichier de configuration personnalisé pour dpkg dans /etc/dpkg/dpkg.cfg.d/custom:

# Install packages without starting background processes and services
# See http://askubuntu.com/q/74061  
no-triggers

Notez que dpkg enregistre toujours les déclencheurs comme ayant été exécutés même s’ils n’ont pas:

$ sudo apt-get install redis-server 
…
Starting redis-server: redis-server.
$ service redis-server status
redis-server is not running

Vous pouvez également demander au script d’installation d’exécuter la servicecommande pour désactiver le nouveau service:

service name_of_service stop
dan_linder
la source
1
Un apt-getéquivalent? Ou existe-t-il un moyen de configurer dpkgpour --no-triggersutiliser dpkgdirectement ou apt-getpour installer quelque chose?
Oxwivi
dan_linder, j'espère que cela ne vous dérange pas que je modifie une réponse à la question de @ Oxwivi. N'hésitez pas à le modifier / l'inverser s'il ne vous convient pas.
ændrük
5
Ceci est une erreur. Les déclencheurs n'ont rien à voir avec les démons de démarrage. Les déclencheurs sont un package effectuant une action pour se reconfigurer en réponse à un autre, par exemple, si vous installez un package qui ajoute un hook initramfs, il déclenche le package initramfs-tools pour reconstruire votre initramfs.
Psusi
3

Ce que j'ai fini par faire, c'est émuler ce que fait debootstrap lors de l'installation de paquets, sauf que j'ai utilisé dpkg-divert:

Commencez par déplacer les fichiers réels:

dpkg-divert --add --rename --local /sbin/start-stop-daemon
dpkg-divert --add --rename --local /sbin/initctl

Créez ensuite des versions factices:

echo \
"#!/bin/sh
echo
echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "/sbin/start-stop-daemon"
chmod 755 "/sbin/start-stop-daemon"

echo \
"#!/bin/sh
echo
echo \"Warning: Fake initctl called, doing nothing\"" > "/sbin/initctl"
chmod 755 "/sbin/initctl"

Ensuite, faites vos mises à jour, installations, etc. pour apt-get, puis nettoyez avec:

rm /sbin/initctl /sbin/start-stop-daemon
dpkg-divert --remove --rename /sbin/initctl
dpkg-divert --remove --rename /sbin/start-stop-daemon

Je sais qu'il existe d'autres commandes pouvant être utilisées pour arrêter / démarrer des services, mais debootstrap ne s'intéresse qu'à start-stop-daemonet initctl, j'ai donc emboîté le pas.

Tal
la source
3

Un one-liner rapide:

echo -e '#!/bin/sh\nexit 101' | install -m 755 /dev/stdin /usr/sbin/policy-rc.d && apt-get install **Package** && rm -f /usr/sbin/policy-rc.d
pl1nk
la source
En ce qui concerne la personne qui a mis le "quick one-liner", vous avez oublié de définir /usr/sbin/policy-rc.d comme exécutable. Ce sera ignoré autrement.