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?
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.
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:
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.
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:
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:
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.
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.
chroot
um die benötigten Pakete zu installieren. Natürlich gibt es keine Treiber, insbesondere keine GPU-Treiber, die installiert werden müssen.Antworten:
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/fake
Symlinks zu/bin/true
aufgerufenen enthält :Sie können sie auch dazu bringen, Skripte zu schlagen, die nichts bewirken und zum Erfolg führen.
Fügen Sie dieses Verzeichnis beim
$PATH
Installieren von Paketen an der Vorderseite ein :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.d
des 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.
quelle
ln -s
, zum Beispiel in diesem Fallln -s /bin/true /root/fake/initctl
.invoke-rc.d
dafür verantwortlich.$PATH
Variablen platzieren, verwenden alle Aufrufe voninvoke-rc.d
und 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./bin/true
Ding? Und was ist mit den restlichen Befehlen, die in den Paketen enthalten sind? Werden sie nicht von der angegebenen Position abgeworfen$PATH
?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, dassinvoke-rc.d
es 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:quelle
chroot
um 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 dieseRUNLEVEL
inchroot
?invoke-rc.d
für die Probleme verantwortlich ist, mit denen ich konfrontiert bin?invoke-rc.d
. Welches Paket war das?Es gibt eine bessere Lösung :
quelle
Ich glaube, Sie müssen die
--no-triggers
Befehlszeilenoption verwenden, wenn Sie diedpkg
Installation durchführen. Etwas wie das:Um diese Einstellung persistent so zu machen , dass
apt-get install
nicht alle Trigger läuft, erstellen Sie eine benutzerdefinierte dpkg Konfigurationsdatei in/etc/dpkg/dpkg.cfg.d/custom
:Beachten Sie, dass dpkg weiterhin Trigger als ausgeführt protokolliert, obwohl dies nicht der Fall ist:
Alternativ können Sie das Installationsskript den
service
Befehl ausführen lassen , um den neuen Dienst zu deaktivieren:quelle
apt-get
Äquivalent? Oder gibt es eine Möglichkeit zu konfigurierendpkg
,--no-triggers
ob mitdpkg
direkter Verwendung oderapt-get
um etwas zu installieren?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:
Dann erstelle Dummy-Versionen:
Führen Sie dann Ihre passenden Upgrades, Installationen usw. durch und räumen Sie anschließend auf mit:
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-daemon
undinitctl
, also folgte ich diesem Beispiel.quelle
Ein schneller Einzeiler:
quelle