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?
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.
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:
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.
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:
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:
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.
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.
chroot
installer 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.Réponses:
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/fake
contenant , par exemple , des liens symboliques vers/bin/true
:Vous pouvez également leur faire des scripts bash qui ne font rien et renvoient le succès.
Ensuite, incluez ce répertoire au
$PATH
début de lors de l'installation des packages: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.d
ou 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.
la source
ln -s
, dans ce cas par exempleln -s /bin/true /root/fake/initctl
.invoke-rc.d
est responsable.$PATH
variable, tous les appels àinvoke-rc.d
et 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é./bin/true
chose? 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
?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 ceinvoke-rc.d
soit 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:la source
chroot
installer 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 ceciRUNLEVEL
danschroot
?invoke-rc.d
soit responsable des problèmes que j'ai rencontrés?invoke-rc.d
. Quel paquet était-ce?Il y a une meilleure solution :
la source
Je crois que vous devez utiliser l'
--no-triggers
option de ligne de commande lorsque vous effectuez l'dpkg
installation. Quelque chose comme ça:Pour que ce paramètre soit persistant et
apt-get install
ne déclenche aucun déclencheur, créez un fichier de configuration personnalisé pour dpkg dans/etc/dpkg/dpkg.cfg.d/custom
:Notez que dpkg enregistre toujours les déclencheurs comme ayant été exécutés même s’ils n’ont pas:
Vous pouvez également demander au script d’installation d’exécuter la
service
commande pour désactiver le nouveau service:la source
apt-get
équivalent? Ou existe-t-il un moyen de configurerdpkg
pour--no-triggers
utiliserdpkg
directement ouapt-get
pour installer quelque chose?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:
Créez ensuite des versions factices:
Ensuite, faites vos mises à jour, installations, etc. pour apt-get, puis nettoyez avec:
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-daemon
etinitctl
, j'ai donc emboîté le pas.la source
Un one-liner rapide:
la source