Installieren Sie Pakete, ohne Hintergrundprozesse und -dienste zu starten

43

Manchmal wird bei der Installation einiger Anwendungen ein Prozess oder Dienst von der Anwendung gestartet, die bei der Installation automatisch ausgeführt wird. Wie installiere ich, ohne sie zu starten?

Oxwivi
quelle
Ich frage mich, welches Potenzial es gibt, ein System in einem instabilen Zustand zu belassen, wenn Kernel- oder DKMS-Pakete mit dieser Art von Konfiguration installiert werden. Ich weiß nicht viel über dieses Gebiet.
ændrük
@ændrük Das hat mich beunruhigt. Sie sehen, ich installiere minimal Ubuntu auf einem Laufwerk, und anstatt es zu booten, verwende ich eine Live-CD / USB, chrootum die benötigten Pakete zu installieren. Natürlich gibt es keine Treiber, insbesondere keine GPU-Treiber, die installiert werden müssen.
Oxwivi

Antworten:

35

Es gibt eine etwas hackige, aber sehr zuverlässige Methode, die ich seit einiger Zeit in einem automatisierten Installationsskript verwende.

Erstellen Sie zunächst ein Verzeichnis, das beispielsweise /root/fakeSymlinks zu /bin/trueaufgerufenen enthält :

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

Sie können sie auch dazu bringen, Skripte zu schlagen, die nichts bewirken und zum Erfolg führen.

Fügen Sie dieses Verzeichnis beim $PATHInstallieren von Paketen an der Vorderseite ein :

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

Dies verhindert nur, dass Daemons gestartet / neu gestartet werden, während Dinge wie das Erstellen eines Initramfs noch durchgeführt werden.

Erläuterung

Die Skripte, die bei der Installation und Deinstallation invoke-rc.ddes Pakets ausgeführt werden, oder andere der genannten Befehle zum Starten und Beenden von Diensten. Sie nennen sie jedoch nicht mit absoluten Pfaden (zumindest habe ich keinen gefunden, der dies tut).

Wenn Sie also zu Beginn die gefälschten "no operation" -Befehle einfügen $PATH, werden die echten Befehle nie aufgerufen.

Da nur die Befehle zum Starten / Beenden von Diensten gefälscht werden, funktionieren alle anderen, insbesondere wichtigen Aufgaben wie das Aktualisieren / Erstellen von initramfs-Images, noch.

bseibold
quelle
Sie sind mit Symlinks nicht ganz vertraut. Können Sie alle Schritte erläutern, die Sie unternehmen?
Oxwivi
Ein Symlink ist ein spezieller Dateityp, der keinen Inhalt hat, sondern auf eine andere Datei verweist (nach Pfad / Name). Sie können mit geschaffen werden ln -s, zum Beispiel in diesem Fall ln -s /bin/true /root/fake/initctl.
bseibold
Wie wird verhindert, dass Daemons gestartet / neu gestartet werden? Laut @ psusi ist die Antwort invoke-rc.ddafür verantwortlich.
Oxwivi
Indem Sie das Verzeichnis mit den gefälschten Befehlen am Anfang der $PATHVariablen platzieren, verwenden alle Aufrufe von invoke-rc.dund andere, die zum Starten und Stoppen von Daemons verwendet werden können, die gefälschten Befehle. Das heißt, es sei denn, sie werden mit einem absoluten Pfad aufgerufen, aber ich bin nie darauf gestoßen.
bseibold 10.11.11
Ah, jetzt sehe ich, wie es funktioniert - im Grunde führen die Symlinks zu Sackgassen. Aber was genau ist das /bin/trueDing? Und was ist mit den restlichen Befehlen, die in den Paketen enthalten sind? Werden sie nicht von der angegebenen Position abgeworfen $PATH?
Oxwivi
27

Hintergrund-Daemons werden mit gestartet invoke-rc.d, wodurch sichergestellt wird, dass der Daemon nicht gestartet wird, wenn sein rc-Skript angibt, dass er nicht im aktuellen Runlevel des Systems ausgeführt werden soll. Sie können die Idee des aktuellen System-Runlevels überschreiben, indem Sie die Umgebungsvariable RUNLEVEL festlegen. Nichts sollte in Runlevel 0 und 6 laufen, aber es scheint, dass invoke-rc.des fehlerhaft ist und Dinge trotzdem laufen lässt, wenn Sie diese Runlevel verwenden. Die meisten Daemons werden auf Runlevel 1 nicht ausgeführt, sodass Sie verhindern können, dass sie bei der Installation wie folgt gestartet werden:

sudo RUNLEVEL=1 apt-get install redis-server
Psusi
quelle
Ich installiere minimal Ubuntu auf einem Laufwerk, und anstatt es zu booten, verwende ich eine Live-CD / USB, chrootum die benötigten Pakete zu installieren. Aufgrund der anfänglichen Probleme habe ich manchmal die Ubuntu-Sitzung (Live-CD) beendet. Wie auch immer, ist das , was ich möchte fragen, wie verwende ich diese RUNLEVELin chroot?
Oxwivi
@Oxwivi, genauso, aber es soll automatisch erkennen, dass Sie sich in einer Chroot befinden, und Start-Daemons überspringen.
Psusi
Ist es möglich, dass der Buggy invoke-rc.dfür die Probleme verantwortlich ist, mit denen ich konfrontiert bin?
Oxwivi
@Oxwivi, es ist möglich, aber wahrscheinlicher, dass ein bestimmtes Paket fehlerhaft ist und nicht verwendet wird invoke-rc.d. Welches Paket war das?
Psusi
Ich habe keine Ahnung, ich habe nur alle zu installierenden Pakete aufgelistet und es machte dem Terminal nichts aus, die Ausgabe weiter anzusehen.
Oxwivi
20

Es gibt eine bessere Lösung :

cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod a+x /usr/sbin/policy-rc.d
GnunuX
quelle
5

Ich glaube, Sie müssen die --no-triggersBefehlszeilenoption verwenden, wenn Sie die dpkgInstallation durchführen. Etwas wie das:

dpkg -i --no-triggers SomeBigPackage.deb

Um diese Einstellung persistent so zu machen , dass apt-get installnicht alle Trigger läuft, erstellen Sie eine benutzerdefinierte dpkg Konfigurationsdatei in /etc/dpkg/dpkg.cfg.d/custom:

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

Beachten Sie, dass dpkg weiterhin Trigger als ausgeführt protokolliert, obwohl dies nicht der Fall ist:

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

Alternativ können Sie das Installationsskript den serviceBefehl ausführen lassen , um den neuen Dienst zu deaktivieren:

service name_of_service stop
dan_linder
quelle
1
Irgendein apt-getÄquivalent? Oder gibt es eine Möglichkeit zu konfigurieren dpkg, --no-triggersob mit dpkgdirekter Verwendung oder apt-getum etwas zu installieren?
Oxwivi
dan_linder, ich hoffe, es macht dir nichts aus, wenn ich eine Antwort auf die Frage von @ Oxwivi bearbeite. Sie können es jederzeit ändern / zurücksetzen, wenn es Ihnen nicht gefällt.
ændrük
5
Das ist falsch. Trigger haben nichts mit dem Starten von Daemons zu tun. Auslöser sind ein Paket, das eine Aktion ausführt, um sich als Reaktion auf ein anderes neu zu konfigurieren. Wenn Sie beispielsweise ein Paket installieren, das einen initramfs-Hook hinzufügt, wird das initramfs-tools-Paket ausgelöst, um Ihr initramfs neu zu erstellen.
Psusi
3

Am Ende habe ich emuliert, was Debootstrap bei der Installation von Paketen tut, außer ich habe dpkg-divert verwendet:

Bewegen Sie zuerst die echten Dateien aus dem Weg:

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

Dann erstelle Dummy-Versionen:

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"

Führen Sie dann Ihre passenden Upgrades, Installationen usw. durch und räumen Sie anschließend auf mit:

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

Ich weiß, dass es andere Befehle gibt, die zum Stoppen / Starten von Diensten verwendet werden können, aber debootstrap kümmert sich nur um start-stop-daemonund initctl, also folgte ich diesem Beispiel.

Tal
quelle
3

Ein schneller Einzeiler:

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
quelle
In Bezug auf die Person, die den "schnellen Einzeiler" erstellt hat, haben Sie vergessen, /usr/sbin/policy-rc.d als ausführbare Datei festzulegen. Sonst wird es ignoriert.