Was ist der Unterschied zwischen "systemctl mask" und "systemctl disable"?

35

Ich möchte die Boot-Zeit meines Ubuntu GNOME 16.04 verbessern, indem ich die Plymouth-Dienste beim Booten deaktiviere. Ich habe auf verschiedenen Websites zwei Antworten gefunden, nämlich:

# systemctl disable plymouth-quit-wait.service 
# systemctl mask plymouth-quit-wait.service 

Ich kann keine der oben genannten Aktionen ausführen, es sei denn, ich weiß, was sie tun.

Perlstern
quelle
4
Lesen Sie hier fedoramagazine.org/systemd-masking-units
Rinzwind

Antworten:

52

Wenn ein Dienst ist enabled, dann gibt es irgendwo in einen Symlink

/etc/systemd/system

in eine Unit-Datei, meistens irgendwo in

/lib/systemd/system

Wenn Sie enableeinen Dienst in Anspruch nehmen, werden die vollständigen Pfade des erstellten Links und Ziels auf stdout gedruckt.

Durch Deaktivieren des Dienstes wird der Symlink gelöscht, sodass die Gerätedatei selbst nicht betroffen ist. Der Dienst wird jedoch beim nächsten Systemstart beim Lesen von systemd nicht geladen /etc/systemd/system.

Ein deaktivierter Dienst kann jedoch geladen werden und wird gestartet, wenn ein davon abhängiger Dienst gestartet wird . enableund disablekonfigurieren Sie das Autostart-Verhalten nur für Einheiten, und der Status kann leicht überschrieben werden.

Ein maskierter Dienst ist ein Dienst, zu dessen Unit-Datei ein Symlink besteht /dev/null. Dies macht es "unmöglich", den Dienst zu laden, selbst wenn er von einem anderen aktivierten Dienst benötigt wird.

Bei maskeinem Service wird ein Symlink von /etc/systemd/systembis erstellt /dev/null, wobei die ursprüngliche Gerätedatei an einer anderen Stelle unberührt bleibt . Bei unmaskeinem Service wird der Symlink gelöscht.

Ich habe jedoch festgestellt, dass diese Befehle nicht immer eingehalten werden.

Wenn ich versuche, die meisten Dienste zu maskieren, schlägt dies fehl:

$ sudo systemctl mask bluetooth.service
Failed to execute operation: Invalid argument

Natürlich habe ich zuerst den Dienst eingestellt. @Anwar schlägt vor, dass die Maskierung nur für nicht kritische Dienste möglich ist.

Das Demaskieren eines maskierten Dienstes schlägt ebenfalls fehl (im Hintergrund), sofern ich ihn nicht selbst maskiert habe. Ich glaube, das liegt daran, dass es nirgendwo eine Unit-Datei für den Service gibt, außer in Form eines Symlinks zu /dev/null, diesmal in /lib/systemd/system:

$ file $(locate fuse.service)
/lib/systemd/system/fuse.service: symbolic link to /dev/null
$ sudo systemctl unmask fuse.service
$ systemctl status fuse
● fuse.service
   Loaded: masked (/dev/null; bad)
   Active: inactive (dead)

Ich bin nicht der einzige, der dieses Problem hat

Um den maskierten Dienst x11-common tatsächlich zu demaskieren, musste ich den Symlink zu /dev/nullund löschen sudo apt-get install --reinstall x11-common && sudo systemctl daemon-reload. Wenn ich es jetzt mit systemctl status x11-commonabfrage, sehe ich, dass der Dienst einen schönen grünen Kreis hat und geladen und aktiv (beendet) ist, obwohl er keine Unit-Datei hat.

Zur weiteren Bezugnahme kann dieser Artikel über die Verwendung von Systemctl von Nutzen sein.

Zanna
quelle
1
Hmm, ich verstehe systemctl status x11-common ● x11-common.service Loaded: masked (/dev/null; bad) Active: inactive (dead). Ist das schlecht? Aber ich bin auf Debian und nicht auf Ubuntu. Wie auch immer, nette Erklärung. Vielen Dank.
Faheem Mitha
@FaheemMitha Ich bin nicht sicher, ob der Dienst benötigt wird - mein System scheint ohne ihn zu funktionieren. Keine Erfahrung mit Debian, sorry!
Zanna
17

Das ist ziemlich einfach.

  • systemctl start, systemctl stop: startet (stoppt) das betreffende Gerät sofort ;
  • systemctl enable, systemctl disable: markiert (unmarkiert) das Gerät für den Autostart beim Booten (auf eine gerätespezifische Art und Weise, wie in seinem [Install]Abschnitt beschrieben);
  • systemctl mask, systemctl unmask: Alle Versuche, die betreffende Einheit manuell oder in Abhängigkeit von einer anderen Einheit, einschließlich der Abhängigkeiten des Standardstartziels, zu starten, sind nicht zulässig. Beachten Sie, dass das Markieren für Autostart in systemd durch Hinzufügen einer künstlichen Abhängigkeit vom Standard-Boot-Ziel zum betreffenden Gerät implementiert wird, sodass "mask" auch Autostart nicht zulässt.

Ref .: systemctl (1) .

Mehr: Lennart Pöttering (02.03.2011). "Die drei Ebenen von Off" . systemd für Administratoren . 0pointer.de.

intelfx
quelle
Hervorragende Übersicht! Siehe auch So verwenden Sie Systemctl zum Verwalten von Systemd-Diensten und -Einheiten .
Peter Mortensen
6

Zusamenfassend,

  • disableDeaktiviert das Gerät während des Startvorgangs. Dieses Gerät kann jedoch jederzeit nach dem Start gestartet werden.

  • maskDeaktiviert das Gerät vollständig. Es kann nicht ohne Demaskierung gestartet werden. Das bedeutet automatisch, dass es beim Booten fehlschlägt.

Anwar
quelle
Ich bin neugierig - mache maskund unmaskarbeite für dich? (Ich verstehe vollkommen, wenn Sie nicht testen möchten!)
Zanna
1
@ Zanna ja. Das funktioniert doch. Ich habe gerade vorher nochmal getestet. mit [email protected]service.
Anwar
Hmm, ich muss herausfinden, warum es bei mir nicht funktioniert. Ich weiß, ich bin nicht der einzige
Zanna
Möglicherweise funktioniert es für nicht kritische Dienste. Es ist immer noch neu, denke ich. Übrigens war Ihre Antwort informativer. Es war hilfreich
Anwar