Parfois, l'installation de certaines applications lancera automatiquement un processus ou un service de l'application lors de l'installation. Comment puis-je installer sans les démarrer ?
Réponses
Trop de publicités?Il existe un moyen un peu hackish, mais assez fiable pour faire cela que j'utilise depuis un certain temps dans un script d'installation automatisé.
Créez d'abord un répertoire, par exemple /root/fake
, qui contient des liens symboliques vers /bin/true
appelés:
initctl
invoke-rc.d
restart
start
stop
start-stop-daemon
service
deb-systemd-helper
Vous pouvez également en faire des scripts bash qui ne font rien et renvoient un succès.
Ensuite, incluez ce répertoire au début de $PATH
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, tandis que des tâches comme la création d'un initramfs continuent d'être effectuées.
Explication
Les scripts exécutés lors de l'installation et de la désinstallation des packages exécutent invoke-rc.d
ou d'autres 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'ai pas encore rencontré un cas où c'est le cas).
En insérant les commandes "no operation" falsifiées au début de $PATH
, les vraies commandes ne sont jamais appelées.
Comme seules les commandes utilisées pour démarrer/arrêter les services sont falsifiées, tout le reste, en particulier des tâches importantes comme la mise à jour/création d'images initramfs, continuent de fonctionner.
Les démons d'arrière-plan sont démarrés avec invoke-rc.d
, ce qui garantit que le démon ne sera pas démarré si son script rc indique qu'il ne doit pas s'exécuter dans le niveau d'exécution système actuel. Vous pouvez outrepasser son idée du niveau d'exécution système actuel en définissant la variable d'environnement RUNLEVEL. Rien n'est censé être exécuté dans les niveaux d'exécution 0 et 6, mais il semble que invoke-rc.d
soit buggé et exécute quand même des choses si vous utilisez ces niveaux d'exécution. La plupart des démons ne s'exécutent pas dans le niveau d'exécution 1, vous pouvez donc les empêcher d'être démarrés à l'installation comme ceci:
sudo RUNLEVEL=1 apt-get install redis-server
Il existe une meilleure solution :
cat > /usr/sbin/policy-rc.d <
Ce que j'ai fini par faire est d'émuler ce que debootstrap fait lors de l'installation de packages, sauf que j'ai utilisé dpkg-divert :
D'abord déplacez les vrais fichiers :
dpkg-divert --add --rename --local /sbin/start-stop-daemon
dpkg-divert --add --rename --local /sbin/initctl
Ensuite créez des versions factices :
echo \
"#!/bin/sh
echo
echo \"Attention : Faux start-stop-daemon appelé, ne fait rien\"" > "/sbin/start-stop-daemon"
chmod 755 "/sbin/start-stop-daemon"
echo \
"#!/bin/sh
echo
echo \"Attention : Faux initctl appelé, ne fait rien\"" > "/sbin/initctl"
chmod 755 "/sbin/initctl"
Ensuite faites vos mises à niveau, installations, etc., et enfin 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 qui peuvent être utilisées pour arrêter/démarrer des services, mais debootstrap se soucie uniquement de start-stop-daemon
et initctl
, donc j'ai suivi la même logique.