Systemd arbeitet mit Diensten und Zielen . Ziele entsprechen Runlevels , Services entsprechen Init-Skripten . Der größte Teil der Systemkonfiguration befindet sich in /usr/lib/systemd
, während sich die Standardinitialisierung in befindet /etc/{init.d,rc*.d,inittab}
.
Wenn während des Startvorgangs ein Problem auftritt (Standard sind getty.target oder graphical.target , mit dem Sie es abrufen können systemctl get-default
), wechselt systemd zu Emergency.target .
Dieses "Notfall" -Ziel lädt wiederum die Datei emergency.service
. Dieser Dienst enthält mehrere Zeilen, darunter:
...
[Service]
Environment=HOME=/root
WorkingDirectory=/root
ExecStartPre=-/bin/plymouth quit
ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" to try again\\nto boot into default mode.'
ExecStart=-/bin/sh -c "/sbin/sulogin; /usr/bin/systemctl --fail --no-block default"
...
Wir müssen nur den Anruf ersetzen an /sbin/sulogin
:
ExecStart=-/bin/sh -c "/sbin/sushell; /usr/bin/systemctl --fail --no-block default"
Und wir werden direkt zu einer Shell weitergeleitet, anstatt über Sulogin zur Eingabe des Passworts aufgefordert zu werden. (Wir können verwenden /bin/sh
, /sbin/sushell
stimmen aber mit den Antworten für CentOS6 / RHEL6 überein. Tatsächlich sushell
einfach exec's, $SUSHELL
die standardmäßig verwendet werden /bin/bash
.)
Um diese Änderung "dauerhaft", dh immun gegen yum
Aktualisierungen, zu machen, nehmen Sie die Änderung an einer Kopie dieser Datei vor und platzieren Sie sie in /etc/systemd/system/
. Ersetzen Sie dieselbe Zeile in, damit der "Rettungsmodus" auf die gleiche Weise funktioniert rescue.service
. Hier ist ein Shell / Sed-Skript, um den Prozess zu vereinfachen:
for SERVICE in rescue emergency ; do
sed '/^ExecStart=/ s%"/sbin/sulogin;%"/sbin/sushell;%' /usr/lib/systemd/system/$SERVICE.service > /etc/systemd/system/$SERVICE.service
done
Um dies zu testen, stellen Sie sicher, dass das System ansonsten nicht verwendet wird, und weisen Sie systemd
an, zum rescue
Ziel zu wechseln :
systemctl rescue
Dadurch werden Netzwerkverbindungen geschlossen und eine Shell an der Konsole geöffnet. Sie können mit dem emergency
Ziel testen , aber das funktioniert nicht ganz so sauber (aus irgendeinem Grund) und erfordert möglicherweise einen vollständigen Neustart, um das Ziel zu erreichen.
Sie können diese auch über das Boot-Menü (grub) testen. Zum Testen des Notfallmodus ist es einfach. Booten Sie und wenn Sie das Menü erhalten, drücken Sie "e", um es zu bearbeiten, und navigieren Sie mit dem Steuerkreuz zu der Zeile, die mit beginnt linux16
und anhängt (drücken Sie CTRL-A
, um zum Ende der Zeile zu gelangen) emergency
:
linux16 ... emergency
Zum Testen des Rettungsmodus werden die gleichen Schritte wie oben ausgeführt, Sie müssen jedoch expliziter vorgehen:
linux16 ... systemd.unit=rescue.target