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

Alte Sysvinit-Gewohnheiten auf Systemd portieren?

Ich habe eine Reihe von Skripten, mit denen ich neue stabile Debian-Systeme installieren und konfigurieren konnte. Um Programme automatisch zu starten verwende ich /etc/rc.local aber für andere Fälle musste ich die /etc/inittab manuell ändern Datei. Ich habe auch andere Änderungen wie das Hinzufügen von --noclear in die Zeile 1:2345:respawn:/sbin/getty --noclear 38400 tty1 .

Da ich den Herunterfahrvorgang anpassen musste, habe ich Folgendes getan:

l0:0:wait:/etc/rc.halt 0
...
l6:6:wait:/etc/rc.halt 6

und meine /etc/rc.halt sieht so aus

#!/bin/sh
#   
# rc.halt
#   
# This script is executed when entering level 6/0 (on halt or reboot)

su - teststand -c "/home/teststand/stop_server.sh"  # my custom command

# making sure the halt/reboot process is resumed
test -n "${1}" && /etc/init.d/rc ${1}

exit 0

Heute habe ich zum ersten Mal ein neues Debian 8 mit systemd installiert als Standard-Init-System. Daran habe ich nicht gedacht und war zuerst überrascht, dass die Datei /etc/inittab Datei fehlte.

Auf meinen laufenden Systemen (@work &@home) betreibe ich meine Systeme immer noch mit sysvinit und deshalb habe ich 0 Erfahrung mit systemd .

Ich weiß, dass ich zur alten sysvinit wechseln kann aber ich möchte die Unterschiede mit systemd sehen . Außerdem passe ich gerade eine neue Installation an und habe nicht allzu viel Zeit, um sie fertigzustellen, deshalb habe ich gerade keine Zeit, mir die Dokumentation anzusehen.

Meine Frage:Gibt es eine Möglichkeit, systemd schnell zu ändern Verhalten, damit ich --noclear hinzufügen kann zu getty und mit /etc/rc.halt als Ausgangspunkt für Neustart/Anhalten?

Grundsätzlich kann ich meine alte inittab schnell importieren ändert sich in systemd ?

Danke

Akzeptierte Antwort:

systemd ist nicht abwärtskompatibel mit System 5 init , nur System 5 rc .

Die Systemverwaltung im Stil von Linux System 5 besteht aus zwei Teilen, init der als Prozess #1 und rc läuft das für die Ausführung von Start- und Stoppskripten zuständig ist. Diese stammen eigentlich aus zwei unterschiedlichen Paketen in Debian. init stammt aus dem sysvinit-Paket; und rc stammt normalerweise aus dem sysv-rc-Paket, könnte aber auch aus dem file-rc- oder dem openrc-Paket stammen.

/etc/inittab ist eine Konfigurationsdatei, die von init verarbeitet wird . systemd bietet dafür keinen Abwärtskompatibilitätsmechanismus. Der System 5-Abwärtskompatibilitätsmechanismus von systemd gilt nur für System 5 rc , das die Programme in /etc/init.d/ ausführt . (Es ist nur für diese spezielle Variante von rc , Außerdem. systemd implementiert keinen Abwärtskompatibilitätsmechanismus für die Konfigurationsmechanismen von file-rc und openrc.)

Dies ist nicht spezifisch für systemd. So ziemlich nein Ersatz-Init/System-Manager (mit nur einer Ausnahme in drei Jahrzehnten) verarbeitet /etc/inittab .

Um einen Dienst in systemd einzubinden, müssen Sie die Mechanismen verwenden, die es macht Support, nämlich eine eigene Serviceeinheit Dateien und (über einen Generator, der automatisch in Unit-Dateien konvertiert) das System 5 rc Konfigurationsdateien in /etc/init.d/ .

Vergessen Sie Runlevels.

All das Runlevel-Zeug, mit dem Sie arbeiten, wurde auf Systemd-Linux-Betriebssystemen für „veraltet“ erklärt. Gibt es nicht Führen Sie Level 0 oder 6 aus, um einzutreten. Sie existieren nicht ohne ein paar Kompatibilitäts-Shims.

Um einen Dienst beim Herunterfahren laufen zu lassen, besteht die offensichtliche Antwort, die von vielen gegeben wird, darin, eine Diensteinheit zu erstellen, die WantedBy ist das shutdown.target . Dies hat jedoch einige subtile Fallstricke. Eine bessere, aber weniger offensichtliche Antwort besteht darin, eine ansonsten normale Diensteinheit mit DefaultDependencies=yes zu erstellen um sicherzustellen, dass es mit dem Shutdown-Ziel kollidiert, und legen Sie das Fleisch des Dienstes in ExecStop statt in ExecStart .

[Unit]
Documentation=https://unix.stackexchange.com/questions/233561/

[Service]
Type=oneshot
User=teststand
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/teststand/stop_server.sh

[Install]
WantedBy=multi-user.target

Rolle nicht deinen eigenen Dæmon Supervisor des armen Mannes in Shell-Skript.

Solche Sachen sind immer schlecht geschrieben.

Verwandt:Machen Sie tail -f exit auf einem kaputten Rohr?

Wenn Ihr „Dienst“ einfach das Ausführen eines Befehls namens „stop_server.sh“ ist, dann ist die Schlussfolgerung, dass dies ein Skript ist, das einen Server unter einem handgerollten Shell-Skript-Dienstverwaltungssystem stoppt.

Es ist für diese schlecht geschriebenen, klapprigen, unzuverlässigen und gefährlichen Katastrophen:stop_server.sh stop_server.sh stop_server.sh stop_server.sh stop_server.sh stop_server.sh

Sie haben systemd. Machen Sie davon Gebrauch und führen Sie jeden Dienst aus, der hier ausgeführt wird, indem Sie geeignete Dienstverwaltungsmechanismen verwenden. Sie werden diesen komischen ExecStop nicht brauchen - Service überhaupt nur, wenn Sie Ihren aktuellen machen Dienst lauffähig über systemd mit DefaultDependencies=true , da systemd das Herunterfahren des Dienstes übernimmt zum Zeitpunkt des Herunterfahrens.

Nehmen Sie einen Dæmon Supervisor eines armen Mannes in Shell-Skript, das einen Dienst „verwaltet“, und packen Sie das dann in eine systemd-Diensteinheit für einen zweiten Dienst, den man dann beim Herunterfahren startet, wenn das Ziel nicht mehr ist, als zu verwalten der erste Dienst und es herunterfahren zu lassen, wenn das System angehalten oder ausgeschaltet wird, ist ein guter Weg, um einen Eintrag im systemd House of Horror zu erhalten.

Die Welt möchte, dass Sie Ihren Bildschirm reinigen.

nicht wollen Ein virtuelles Terminal zwischen dem Abmelden und dem anschließenden Anmelden zu leeren, schwimmt sehr gegen den Strom, wie Greg Wooledge und andere herausgefunden haben. Das Vorhandensein vertraulicher Ausgaben von privilegierten Benutzern oder Vorgesetzten, die nach dem Abmelden zurückbleiben, ist seit den 1970er Jahren ein Sicherheitsproblem für Unices (und tatsächlich andere Timesharing-Betriebssysteme mit Fernzugriff), und es erfordert viel Mühe, alles rückgängig zu machen die Dinge, die Menschen unternommen haben, um dieses Problem abzuwenden.

  • Viele Systeme haben eine clear_console standardmäßig in ihren Shell-Logout-Skripten. (Dies ist an sich schon problematisch, da es nicht gut mit grafischen Programmen funktioniert, die auf dem virtuellen Kernel-Terminal #1 laufen, und nicht mit anderen Arten von Terminals funktioniert, ob virtuell oder real.)

    Dieser Befehl muss entfernt werden.

  • Die Standardeinstellung in getty-Programmen, die auf virtuelle Terminals abzielen, wie mingetty , soll das Terminal löschen. (Dies geschieht vor der Anmeldung, was bedeutet, dass die Terminalausgabe nicht gelöscht werden kann, wenn ein TTY-Anmeldedienst gestoppt wird. Ironischerweise wäre diese Funktionalität besser in login platziert worden , das dank der Notwendigkeit von PAM beim Abmelden immer noch läuft.)

    Der --noclear Option muss bereitgestellt werden, um dies zu deaktivieren. Dies beinhaltet das Schreiben einer oder mehrerer Unit-File-Override-Dateien, das Ändern von ExecStart Einstellung oder einfach auf [email protected] zeigen in einer eigenen lokalen Einheitsdatei.

  • vom Systemd bereitgestellter [email protected] Template Service Unit setzt TTYVTDisallocate=yes was systemd anweist, ein virtuelles Kernel-Terminal zu löschen. (Dies funktioniert wiederum nicht mit anderen Arten von Terminals, nicht einmal mit virtuellen Terminals im Benutzerraum, wie sich teilweise in seinem Namen widerspiegelt.)

    Auch dies muss entfernt werden, wiederum mit einer Überschreibung oder einer anderen Dienstvorlage, auf die durch [email protected] verwiesen wird .

Weiterführende Literatur

  • Jonathan de Boyne Pollard (2015). /etc/inittab gehört der Vergangenheit an. . Häufig gegebene Antworten.
  • https://unix.stackexchange.com/a/196014/5132
  • Wie führe ich ein Skript direkt vor dem Herunterfahren mit systemd aus?
  • Jonathan de Boyne Pollard (2014). Missbrauchen Sie su nicht für das Löschen von Benutzerprivilegien. . Häufig gegebene Antworten.
  • Greg Wooledge (08.04.2014). Hör auf, meine gottverdammte Konsole zu löschen . Gregs Wiki.
  • Jonathan de Boyne Pollard (2015-08-22). System friert mit mehreren ttys in Debian Jessie ein . [E-Mail-geschützt] debian-user.
  • https://unix.stackexchange.com/a/194218/5132
  • Jonathan de Boyne Pollard (2015). Das systemd House of Horror . Häufig gegebene Antworten.
Verwandte:Gute detaillierte Erklärung der /etc/network/interfaces-Syntax?
Linux
  1. Linux – Wie finde ich heraus, ob ein System Sysv, Upstart oder Systemd Initsystem verwendet?

  2. Centos – Was ist der Unterschied zwischen /usr/lib/systemd/system und /etc/systemd/system?

  3. Behebung System wurde nicht mit systemd als init-Systemfehler gebootet

  4. Was sind die Sicherheitsimplikationen von systemd im Vergleich zu systemv init?

  5. So finden Sie heraus, ob ein System SysV, Upstart oder Systemd initsystem verwendet

Befehl zum Herunterfahren von Linux

Fsck-Befehl unter Linux

Ist Linux ein Betriebssystem oder ein Kernel?

Dokumentieren der Systemverfügbarkeit in Linux

So aktualisieren Sie Ubuntu 18.04 auf Ubuntu 20.04

SystemD - Wofür wird SystemD verwendet?