Website-Suche

So erstellen und führen Sie neue Serviceeinheiten in Systemd aus


Vor ein paar Tagen stieß ich auf eine 32-Bit-Distribution von Centos 8 und verspürte den Wunsch, sie auf einem alten 32-Bit-Rechner zu testen. Nach dem Booten wurde mir klar, dass es einen Fehler gab und die Netzwerkverbindung verloren ging, die ich jedes Mal nach dem Booten manuell aktivieren musste. Die Frage war also: Wie könnte ich ein Skript einrichten, das diese Aufgabe erfüllt und jedes Mal ausgeführt wird, wenn ich meinen Computer starte?

Nun, das ist ganz einfach und ich zeige Ihnen die Systematik mit Serviceeinheiten. Doch zunächst eine kleine Einführung in die Service-Einheiten.

In diesem Artikel werde ich erklären, was eine „Serviceeinheit“ in systemd ist und wie einfach es ist, eine solche zu erstellen und auszuführen. Ich werde versuchen zu vereinfachen, was „Ziele“ sind, warum wir sie „Ansammlungen von Einheiten“ nennen und was ihre „Wünsche“ sind. Schließlich nutzen wir eine Serviceeinheit, um nach dem Bootvorgang unser eigenes Skript auszuführen.

Es liegt auf der Hand, dass Ihr Computer aufgrund der von ihm angebotenen Dienste nützlich ist. Um über diese Funktionalität zu verfügen, müssen viele Dienste aufgerufen werden, wenn der Computer hochfährt und verschiedene Ebenen erreicht.

Andere Dienste werden zur Ausführung aufgerufen, wenn der Computer beispielsweise die Rettungsstufe (Runlevel 0) erreicht, andere, wenn er die Mehrbenutzerstufe (Runlevel 3) erreicht. . Sie können sich diese Ebenen als Ziele vorstellen.

Auf einfache Weise ist target eine Sammlung von Serviceeinheiten. Wenn Sie einen Blick auf die Diensteinheiten werfen möchten, die in Ihrer graphical.target-Ebene ausgeführt werden, geben Sie Folgendes ein:

systemctl --type=service

Wie Sie sehen, sind einige Dienste ständig aktiv und „laufen“, während andere nur einmal ausgeführt und dann beendet (beendet) werden.

Wenn Sie den Status eines Dienstes überprüfen möchten, können Sie den Befehl systemctl wie gezeigt verwenden.

systemctl status firewalld.service

Wie Sie sehen, habe ich den Status von firewalld.service überprüft (Tipp: Sie können die automatische Vervollständigung für den Namen des Dienstes verwenden ). Es informiert mich darüber, dass der Dienst firewalld ständig läuft und aktiviert ist.

Aktiviert und deaktiviert bedeutet, dass der Dienst beim nächsten Start dauerhaft geladen wird oder nicht. Andererseits unterliegt das Starten und Stoppen eines Dienstes der Beschränkung der aktuellen Sitzung und ist nicht dauerhaft.

Wenn Sie beispielsweise Folgendes eingeben:

systemctl stop firewalld.service
systemctl status firewalld.service

Sie können sehen, dass der firewalld.service inaktiv (tot) ist, aber immer noch aktiviert, was bedeutet, dass er beim nächsten Start geladen wird. Wenn wir also möchten, dass ein Dienst in Zukunft beim Booten geladen wird, müssen wir ihn aktivieren. Was für ein toller Abschluss! Lassen Sie uns eines erstellen, es ist ganz einfach.

Wenn Sie zum Ordner gehen:

cd /etc/systemd/system
ls -l

Sie können einige Linkdateien von Einheitendiensten und einige Verzeichnisse der „Wünsche“ eines Ziels sehen. Beispielsweise wird im Verzeichnis mit dem Namen /etc/systemd/system/multi-user.target.wants/ aufgeführt, was das Multi-User-Ziel geladen werden soll, wenn der Startvorgang seine Stufe erreicht .

ls multi-user.target.wants/

Wie Sie sehen, enthält es nicht nur Dienste, sondern auch andere Ziele, die ebenfalls Sammlungen von Diensten sind.

Erstellen wir eine Serviceeinheit mit dem Namen connection.service.

vim connection.service

und geben Sie Folgendes ein (drücken Sie “i ” für den Einfügemodus), speichern Sie es und beenden Sie es (mit “esc ” und “:wq! ” ):

[Unit]
Description = making network connection up
After = network.target

[Service]
ExecStart = /root/scripts/conup.sh

[Install]
WantedBy = multi-user.target

Um das Obige zu erklären: Wir haben eine Einheit vom Typ „Dienst“ erstellt (Sie können auch Einheiten vom Typ „Ziel“ erstellen) und wir haben sie so eingestellt, dass sie nach network.target geladen wird (Sie können verstehen, dass die Der Startvorgang erreicht die Ziele in einer definierten Reihenfolge) und wir möchten, dass bei jedem Start des Dienstes ein Bash-Skript mit dem Namen conup.sh ausgeführt wird, das wir erstellen werden.

Der Spaß beginnt mit dem letzten Teil [install]. Es sagt aus, dass es von „multi-user.target“ gesucht wird. Wenn wir also unseren Dienst aktivieren, wird im Ordner multi-user.target.wants ein symbolischer Link zu diesem Dienst erstellt! Habe es? Und wenn wir es deaktivieren, wird dieser Link gelöscht. So einfach.

Aktivieren Sie es einfach und überprüfen Sie:

systemctl enable connection.service

Es informiert uns darüber, dass der symbolische Link im Ordner multi-user.target.wants erstellt wurde. Sie können dies bestätigen, indem Sie den Befehl ls wie gezeigt ausführen.

ls multi-user.target.wants/

Wie Sie sehen können, ist „connection.service“ für den nächsten Start bereit, aber wir müssen zuerst die Skriptdatei erstellen.

cd /root
mkdir scripts
cd scripts
vim conup.sh

Fügen Sie die folgende Zeile in Vim ein und speichern Sie sie:

#!/bin/bash
nmcli connection up enp0s3

Der nmcli-Befehl zum Herstellen der Netzwerkverbindung für die enp0s3-Schnittstelle.

Wenn Sie möchten, dass Ihr Skript etwas anderes ausführt, können Sie natürlich anstelle der zweiten Zeile alles eingeben, was Sie möchten.

Zum Beispiel,

#!/bin/bash
touch /tmp/testbootfile

Dadurch würde eine Datei im Ordner /tmp erstellt (nur um zu überprüfen, ob Ihr Dienst funktioniert).

Wir müssen das Skript auch ausführbar machen, indem wir den Befehl chmod wie gezeigt ausführen.

chmod +x conup.sh

Jetzt sind wir bereit. Wenn Sie nicht bis zum nächsten Start warten möchten (er ist bereits aktiviert), können wir den Dienst für die aktuelle Sitzung starten, indem Sie Folgendes eingeben:

systemctl start connection.service

Voila! Meine Verbindung ist aktiv!

Wenn Sie sich entschieden haben, den Befehl „touch /tmp/testbootfile“ in das Skript zu schreiben, nur um seine Funktionalität zu überprüfen, wird diese Datei im Ordner /tmp erstellt .

Ich hoffe wirklich, Ihnen dabei zu helfen, herauszufinden, worum es bei Diensten, Wünschen, Zielen und der Ausführung von Skripten beim Booten geht.