GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So verwalten Sie systemd-Einheiten beim Start

Systemd ist ein Init-System und Systemmanager in Linux-Systemen und ist mit LSB und SysV kompatibel. Sie können die Systemd-Suite verwenden, um Systemstartdienste und -ressourcen in einem Linux-System zu verwalten und zu optimieren. Es ist ein praktisches Tool für Systemadministratoren, um ihr System zum Laufen zu bringen, Prozesse zu optimieren, Systemdienste zu debuggen und Fehler zu beheben.

Dieser Artikel baut auf unserer systemd-Serienanleitung auf und zeigt, wie Sie Systemeinheiten verwalten, Dateisysteme mounten, Fehler beheben und Ihnen Tipps und Tricks bei der Arbeit mit Systemen geben.

Unser erster systemd-Leitfaden hat aufgezeigt, warum systemd ein praktisches Tool für Linux-Systemadministratoren ist. Die zweite zeigt, wie man Systemaufgaben mit systemd-Timern plant und die langwierigen Systemstartaufgaben automatisiert.

Linux-Startup

Als Retro-Linux-Benutzer war ich immer existent (noch immer), wenn das Fedora-System bootet und vor der Anmeldeaufforderung seitenweise Diagnosemeldungen vorbeiscrollen. Diese Seiten enthalten Informationen zu Startprozessen, dem Mounten von Dateisystemen und vielem mehr. Um zu verstehen, wie Startdienste verwaltet und optimiert werden, werfen wir einen kurzen Blick darauf, was zwischen dem Drücken der Einschalttaste und der Anmeldeaufforderung passiert.

Ein Boot-Vorgang beginnt mit dem Hardware-Boot, der die Systemhardware initialisiert, dem Betriebssystem-Boot, der den Kernel lädt, dann systemd und dem Linux-Start, wobei systemd die Prozesse des Systems vorbereitet. Der Startvorgang beginnt, wenn der Kernel die Kontrolle über den Host an systemd übergibt. An diesem Punkt kann ein Systemadministrator Dienste, Units, Sockets, D-Bus-Aktivierung verwalten, Prozesse verfolgen, Daemons und Dateisystem-Mount-Punkte.

Systemd-Komponenten

Im Folgenden sind einige Bausteine ​​der systemd-Software-Suite aufgeführt, die Sie verwenden können, um den Start von Linux zu verwalten.

  • systemd-boot – ein UEFI-Bootmanager.
  • systemd-firstboot – verwaltet die Initialisierung der grundlegenden Systemeinstellungen vor dem ersten Booten.
  • systemd-logind – ein Sitzungsverwaltungstool.
  • systemd-networkd – Netzwerkkonfigurationen verwalten.
  • systemd-sysusers  – ein Tool zum Erstellen von Systembenutzergruppen und Hinzufügen von Benutzern zu Gruppen beim Booten.
  • systemd/Journal — Systemprotokollierung verwalten.
  • systemd/Timers — Timer zur Steuerung von .service-Dateien oder Ereignissen.

Systemctl

Um systemd zu verwalten, verwenden Sie den Befehl systemctl, der sowohl die Funktionalität des SysVinit-Dienstes als auch chkconfig nutzt. Sie können es verwenden, um Systemeinheiten zu verwalten, die Darstellungen von Systemdiensten und -ressourcen sind.

# systemctl daemon-reload

Verwaltung der Systemeinheiten

Units in systemd können Dienste (.service), Einhängepunkte (.mount), Geräte (.device) oder Sockets (.socket) sein. Systemctl bietet verschiedene Befehle zum Verwalten von Einheiten.

Verwenden Sie den folgenden Befehl, um den Systemstatus zu analysieren:

$ systemctl status #Show system status 
$ systemctl or #List running units
$ systemctl list-units #List running units
$ systemctl --failed #List failed units
$ systemctl list-unit-files #List installed unit files1
$ systemctl status pid #Show process status for a PID

Verwenden Sie die folgenden Befehle, um den Gerätestatus zu überprüfen:

$ systemctl help unit #Show a manual page associated with a unit
$ systemctl status unit #Status of a unit
$ systemctl is-enabled unit #Check whether a Unit is enabled

Verwenden Sie die folgenden Befehle, um eine Unit zu starten und neu zu laden:

systemctl start unit  #start a unit immediately
systemctl stop unit   #stop a unit immediately
systemctl restart unit   #restart a unit
systemctl reload unit  #reload a unit and configurations
systemctl daemon-reload   #reload systemd manager configuration

Verwenden Sie die folgenden Befehle, um eine Einheit zu maskieren:

systemctl mask unit     #mask a Unit to make it impossible to start
systemctl unmask unit     #Unmask a unit

Verwenden Sie die folgenden Befehle, um eine Einheit zu aktivieren:

systemctl enable Unit   #enable a Unit to start automatically at boot
systemctl enable --now unit   #enable a Unit to start automatically and immediately at boot
systemctl disable unit   #disable a Unit to no longer start at boot
systemctl reenable unit     #disable and enable anew

Einheitendateien bearbeiten

Linux lädt Unit-Dateien von mehreren Orten in Ihrem System. Sie können den Befehl [systemctl show –property=UnitPath] ausführen, um die vollständige Liste anzuzeigen.

  •  /usr/lib/systemd/system/:Einheiten, die von installierten Paketen bereitgestellt werden.
  •  /etc/systemd/system/:Einheiten, die vom Systemadministrator installiert wurden.

Beispiel-Unit-Datei:

/etc/systemd/system/unit.d/example_unit.conf
[Unit]
Requires=new dependency
After=new dependency

Umgang mit Abhängigkeiten

Sie können Unit-Abhängigkeiten auflösen, indem Sie die Unit-Dateien richtig entwerfen.
Zum Beispiel, wenn Unit A erfordert, dass Unit B ausgeführt wird, bevor A gestartet wird. Fügen Sie dann Requires=B und After=B zum Abschnitt [Unit] von A hinzu.

# /etc/systemd/system/unit.d/example_unit.conf
[Unit]
Requires=B
After=B

Wenn die Abhängigkeit optional ist, fügen Sie Wants=B und After=B hinzu.

/etc/systemd/system/unit.d/example_unit.conf
[Unit]
Requires=B
After=B
Wants=B

Hinweis:Abhängigkeiten werden auf Dienste und nicht auf Ziele gesetzt.

Servicetypen

Sie können verschiedene Startdiensttypen in einer benutzerdefinierten Dienstdatei mit dem Parameter Type=im Abschnitt [Service] festlegen:

/etc/systemd/system/unit.d/example_unit.conf
[Unit]
Requires=B
After=B
Wants=B
[Service]
Type=simple
  • Type=simple (Standard):Systemd geht davon aus, dass der Dienst sofort gestartet wird.
  • Type=forking:systemd betrachtet den Dienst als gestartet, sobald sich der Prozess verzweigt und der Elternteil beendet wurde.
  • Type=oneshot:Sie können es für Skripte verwenden, die einen einzelnen Job ausführen und dann beendet werden. Sie können RemainAfterExit=yes setzen, damit systemd den Dienst immer noch als aktiv betrachten kann, nachdem der Prozess beendet wurde.
  • Type=idle:systemd verzögert die Ausführung der Service-Binärdatei, bis alle Jobs abgesetzt sind.
  • Type=notify:Sie können es wie Type=simple verwenden, aber der Daemon wird dem Systemd signalisieren, wenn er bereit ist.
  • Type=dbus:Der Dienst gilt als bereit, wenn der angegebene BusName auf dem Systembus von DBus erscheint.

Ersatzgerätedateien

Sie können eine Unit-Datei in [/usr/lib/systemd/system/] ersetzen, indem Sie eine neue Unit-Datei mit einem ähnlichen Namen erstellen und die Unit erneut aktivieren, um die symbolischen Links zu aktualisieren.

# systemctl reenable Unit

Alternativ können Sie den Befehl [# systemctl edit –full Unit] ausführen, der die Unit-Datei in Ihrem Editor öffnet und automatisch neu lädt, wenn Sie mit der Bearbeitung fertig sind.

# systemctl edit --full Unit

Drop-in-Dateien

Sie können eine Drop-In-Unit-Datei erstellen, indem Sie das Verzeichnis /etc/systemd/system/unit.d/ erstellen und Ihre neue .conf-Datei platzieren. Die Datei überschreibt oder fügt neue Konfigurationsoptionen hinzu. systemd wird diese Dateien parsen und auf die ursprüngliche Unit-Datei anwenden.

Führen Sie alternativ den folgenden Befehl [# systemctl edit unit] aus, um die Datei /etc/systemd/system/unit.d/new_override.conf in einem Texteditor zu öffnen und die Unit-Datei automatisch neu zu laden.

Änderungen einer Unit-Datei rückgängig machen

Verwenden Sie den folgenden Befehl, um alle Änderungen rückgängig zu machen, die Sie mit dem Befehl systemctl edit an einer Unit vorgenommen haben.

# systemctl revert unit

Zusätzliche Abhängigkeit zu einer Einheit hinzufügen

/etc/systemd/system/unit.d/newcustomdependency.conf
[Unit]
Requires=new customdependency
After=new customdependency

Energieverwaltung

Systemd bietet verschiedene Befehle zum Neustarten oder Ausschalten Ihres Systems.

systemctl reboot     #shut down and reboot the system
systemctl poweroff   #shut down and power-off the system
systemctl suspend     #suspend the system
systemctl hibernate    #put the system into hibernation
systemctl hybrid-sleep   #put the system into hybrid-sleep state

Dateisysteme und Partitionen einhängen

systemd ist für das Mounten der in /etc/fstab angegebenen Partitionen und Dateisysteme zuständig. Sie können ein Dateisystem verwalten oder einhängen, indem Sie alle erforderlichen Parameter in einer Unit-Datei definieren. Geben Sie Details zum Dateisystem und zum Einhängepunkt an. Systemd gibt Ihnen mehr Flexibilität bei der Arbeit mit Einhängeeinheiten. Es verwendet die Datei /etc/fstab für die Dateisystemkonfiguration und das Mounten. Der Prozess beinhaltet die Verwendung des Werkzeugs systemd-fstab-generator, um Mount-Units aus den Daten in der fstab-Datei zu erstellen.

Erstellen Sie eine Systemd-Mount-Einheit

Die Abbildung zeigt Fedora 33, auf dem ein btrfs-Dateisystem läuft.
Stellen Sie sicher, dass Sie freien Speicherplatz in der Datenträgergruppe haben.

# lsblk

Verfügbare Mount-Unit-Dateien auflisten:

[root@foss]# systemctl list-unit-files -t mount
OR
[root@foss]# systemctl status *mount

Erstellen Sie eine systemd .mount Unit-Datei:

Überprüfen Sie die UUID des Dateisystems mit dem Befehl blkid.

[root@foss]# blkid /dev/sda2
/dev/sda2: LABEL="fedoraworkstation33" UUID="688a6af2-xxx-4da4-xxx-878c5b0f063b" UUID_SUB="690a86e7-yyyy-9a92-4bc6-49cca4yyyy8df" BLOCK_SIZE="4096" TYPE="btrfs" PARTUUID="0byyyb88-02"

Erstellen Sie eine neue Datei [var-lib-docker.mount] im Verzeichnis etc/systemd/system. Fügen Sie unten Konfigurationsdaten hinzu. Beachten Sie, dass der Name der Unit-Datei und der Einhängepunkt identisch sein müssen.

# vi /etc/systemd/system/var-lib-docker.mount
[Unit]
Description=docker mount
[Mount]
What=/dev/disk/by-uuid/688a6af2-77e1-4da4-bc63-878c5b0f063b
Where=/var/lib/docker
Type=btrfs
Options=defaults
[Install]
WantedBy=multi-user.target

Beachten Sie, dass das „Was“-Argument UUID, LABEL und Pfad zur Festplatte annehmen kann.

Die Beschreibung im Abschnitt [Unit] stellt den Einhängenamen bereit, der mit dem Einhängesystem systemctl -t angezeigt wird. Die Konfigurationsdaten im Abschnitt [Mount] enthalten dieselben Daten wie in der fstab-Datei.

Enable the Mount Unit to start after boot:

[root@foss]# systemctl enable var-lib-docker.mount
Created symlink /etc/systemd/system/multi-user.target.wants/var-lib-docker.mount → /etc/systemd/system/var-lib-docker.mount.

Der Befehl erstellt einen symbolischen Link im /etc/systemd/system-Verzeichnis, wodurch die Mount-Unit bei allen nachfolgenden Bootvorgängen gemountet werden kann.

Starten und mounten Sie das Dateisystem:

# systemctl start var-lib-docker.mount

Prüfen Sie, ob das Dateisystem gemountet wurde:

# systemctl status var-lib-docker.mount
● var-lib-docker.mount - Docker mount
Loaded: loaded (/etc/systemd/system/var-lib-docker.mount; enabled; vendor preset: disabled)
Active: inactive (dead)
Where: /var/lib/docker
What: /dev/disk/by-uuid/688a6af2-77e1-4da4-bc63-878c5b0f063b

Sie können auch die Unit-Datei des Docker-Dienstes ändern, um sicherzustellen, dass der Dienst erst startet, nachdem der Mount-Dienst aufgerufen wurde.

# cat /usr/lib/systemd/system/docker.service
[Unit]
Description=docker service unit file
After=network.target var-lib-docker.mount # Added mount unit for docker service to wait
Requires=docker.socket

Starten Sie neu und prüfen Sie den Status der Mount Service Unit.

# systemctl reboot
# systemctl status var-lib-docker.mount

Suchen Sie nach dem Einhängepunkt [var-lib-docker]:

# mount | grep var-lib-docker

Tipps und Tricks

Führen Sie einen Dienst aus, nachdem das Netzwerk hochgefahren ist

Sie können den Start eines Dienstes verzögern, bis das Netzwerk betriebsbereit ist, indem Sie Ihrer .service-Datei die folgenden Abhängigkeiten hinzufügen.

/etc/systemd/system/test_foo.service
[Unit]
Wants=network-online.target
After=network-online.target

Darüber hinaus können Sie nss-lookup.target hinzufügen, wenn ein Dienst DNS-Abfragen durchführen muss.

/etc/systemd/system/test_foo.service
[Unit]
Wants=network-online.target
After=network-online.target nss-lookup.target
...

Verwenden Sie den folgenden Befehl, um zu überprüfen, welcher Dienst nss-lookup.target.

einliest
# systemctl list-dependencies --reverse nss-lookup.target

Installieren Sie systemd GUI-Konfigurationstools

Sie können auch mit systemd arbeiten, indem Sie die folgenden GUI-Tools verwenden.

  • SystemdGenie – ist ein systemd-Verwaltungstool, das auf KDE basiert.
  • Systemadm – ist ein grafischer Browser für systemd-Units.

systemd-Optimierungen

Systemd bietet schnelle Bootzeiten von <2s für aktuelle Desktop-Umgebungen. Wir könnten es jedoch mit den folgenden Schritten weiter optimieren, ohne Code schreiben zu müssen:

  •  Erwägen Sie zunächst, die initrd zu umgehen, wenn Sie eine in Ihrem System verwenden.
  • Erwägen Sie, SELinux und Auditing zu deaktivieren, indem Sie selinux=0 in der Kernel-Befehlszeile hinzufügen. Beachten Sie jedoch, dass Systemadministratoren aus Sicherheitsgründen empfehlen, SElinux eingeschaltet zu lassen.
  • Erwägen Sie, Syslog zu deinstallieren und stattdessen das Journal zu verwenden. Journal ist das Standard-Logging-Tool in neueren systemd-Systemen.
  • Wenn Ihre Konsolenausgabe langsam ist, verwenden Sie das Quiet-Flag in der Befehlszeile und deaktivieren Sie die System-Debug-Protokollierung.
  • Erwägen Sie, Cron zu entfernen und stattdessen systemd-Timer zu verwenden.
  • Verwenden Sie eine moderne Desktop-Umgebung wie GNOME 40, die ConsoleKit nicht einbindet.
  • Überprüfen und deaktivieren Sie unnötige Startvorgänge oder Dienste. Ein Systemstart wird schneller, wenn Sie beim Booten weniger Prozesse starten.
  • Bitte entfernen Sie Shell-basierte Dienste wie SysV-Init-Skripte und ersetzen Sie sie durch Unit-Dateien.
  • Vermeiden Sie die Verwendung von Type=forking und das Sortieren von Abhängigkeiten. Ersetzen Sie sie stattdessen nach Möglichkeit durch Socket-Aktivierung und Type=simple. Es wird eine besser parallelisierte Inbetriebnahme von Diensten ermöglichen.

Fehlerbehebung

Untersuchen Sie fehlgeschlagene Dienste

Verwenden Sie den folgenden Befehl, um systemd-Dienste zu finden, die nicht gestartet werden konnten:

# systemctl --state=failed

Diagnose eines Dienstes

Sie können auch weitere Fehlerbehebungsinformationen zu einem Dienst abrufen, indem Sie die Umgebungsvariable SYSTEMD_LOG_LEVEL auf debug setzen.
Um beispielsweise den systemd-networkd-Daemon im Debug-Modus auszuführen, fügen Sie eine Drop-in-Datei für den Dienst und die folgenden zusätzlichen hinzu Konfigurationen.

[Service]
Environment=SYSTEMD_LOG_LEVEL=debug

Alternativ können Sie die Umgebungsvariable auch manuell mit folgendem Befehl setzen:

# SYSTEMD_LOG_LEVEL=debug /lib/systemd/systemd-networkd

Nachdem Sie Ihre Einstellungen vorgenommen haben, starten Sie den Dienst neu und überwachen Sie das Dienstjournal mit der Option -f/–follow, um alle Protokolle anzuzeigen.

Systemprotokolle

Systemprotokolle speichern einen Verlauf von Systemaktivitäten wie Startzeit, Start von Diensten, Systemjobs, Hintergrunddienste, fehlgeschlagene Aktivitäten und vieles mehr. Systemd verwaltet einen „Katalog“ von Fehlern, Meldungen, möglichen Lösungen und hebt kritische Kontexte in den Protokollmeldungen hervor, die unbemerkt bleiben könnten. Sie können systemd-Protokolle mit dem Befehl journalctl überprüfen.

$ journalctl --pager-end

Das Flag –pager-end startet Ihre Protokollüberprüfung am Ende der Ausgabe von journalctl.

Zusätzliche Ressourcen

  1. Systemd.unit Handbuchseite.
  2. Systemleitfaden des Fedora-Projekts.
  3. Beschreibung von systemd von Freedesktop.org.
  4. Systemd ArchWiki.

Abschluss

systemd bietet eine robuste Möglichkeit, den Linux-Start mit systemd-Units zu verwalten. Der Artikel hat verschiedene Möglichkeiten zur Verwendung des Befehls systemctl zum Bearbeiten von Unit-Dateien und zum Verwalten von systemd-Units hervorgehoben. Es wurde hervorgehoben, wie eine neue systemd-Mount-Unit erstellt wird, um ein neues Dateisystem zu mounten und es während des Starts zu initiieren. Abschließend habe ich einige systemd-Optimierungstipps und Tipps zur Fehlerbehebung bei fehlgeschlagenen Diensten geteilt.


Linux
  1. So verwalten Sie Linux-Dateifunktionen

  2. So verwalten Sie das Kontopasswort in Linux

  3. So verwalten Sie Systemd-Dienste mit Systemctl unter Linux

  4. So verwalten Sie eine Swap-Partition unter Linux

  5. Wie stoppen Sie den systemd-Dienst

Systemctl-Befehle zum Verwalten des Systemd-Dienstes

So führen Sie ein Skript beim Booten in Debian 11 aus

So löschen Sie Systemd-Journalprotokolle

So verwalten Sie Datenbanken in MariaDB unter Ubuntu 18.04

CentOS / RHEL 7:Leitfaden für Anfänger zu systemd-Diensteinheiten

Wie kann ich einen systemd-Dienst so konfigurieren, dass er regelmäßig neu gestartet wird?