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

So verwenden Sie systemd-nspawn für die Linux-Systemwiederherstellung

Seit es GNU/Linux-Systeme gibt, mussten Systemadministratoren Wiederherstellungen nach einer Beschädigung des Root-Dateisystems, versehentlichen Konfigurationsänderungen oder anderen Situationen durchführen, die das System daran gehindert haben, in einen "normalen" Zustand zu booten.

Linux-Distributionen bieten normalerweise beim Booten eine oder mehrere Menüoptionen an (z. B. im GRUB-Menü), die zur Rettung eines kaputten Systems verwendet werden können. normalerweise booten sie das System in einen Einzelbenutzermodus, in dem die meisten Systemdienste deaktiviert sind. Im schlimmsten Fall könnte der Benutzer die Kernel-Befehlszeile im Bootloader ändern, um die Standard-Shell als Init-Prozess (PID 1) zu verwenden. Diese Methode ist die komplexeste und voller Komplikationen, was zu Frustration und Zeitverlust führen kann, wenn ein System gerettet werden muss.

Weitere Linux-Ressourcen

  • Spickzettel für Linux-Befehle
  • Spickzettel für fortgeschrittene Linux-Befehle
  • Kostenloser Online-Kurs:RHEL Technical Overview
  • Spickzettel für Linux-Netzwerke
  • SELinux-Spickzettel
  • Spickzettel für allgemeine Linux-Befehle
  • Was sind Linux-Container?
  • Unsere neuesten Linux-Artikel

Am wichtigsten ist, dass diese Methoden alle davon ausgehen, dass das beschädigte System über eine Art physische Konsole verfügt, aber dies ist im Zeitalter des Cloud Computing nicht mehr selbstverständlich. Ohne eine physische Konsole gibt es (wenn überhaupt) nur wenige Möglichkeiten, den Bootvorgang auf diese Weise zu beeinflussen. Sogar physische Maschinen können kleine, eingebettete Geräte sein, die keine einfach zu bedienende Konsole bieten, und die Suche nach den richtigen seriellen Anschlusskabeln und -adaptern und die Einrichtung eines seriellen Terminalemulators, alles um einen seriellen Konsolenanschluss zu verwenden, während man sich mit einem befasst Notfall, ist oft kompliziert.

Wenn ein anderes System (mit derselben Architektur und im Allgemeinen ähnlicher Konfiguration) verfügbar ist, besteht eine gängige Technik zur Vereinfachung des Reparaturvorgangs darin, das/die Speichergerät(e) aus dem beschädigten System zu extrahieren und sie als sekundäre Geräte an das funktionierende System anzuschließen. Bei physischen Systemen ist dies normalerweise einfach, aber die meisten Cloud-Computing-Plattformen können dies ebenfalls unterstützen, da sie ermöglichen, dass das Root-Speichervolume der beschädigten Instanz auf einer anderen Instanz gemountet wird.

Sobald das Root-Dateisystem mit einem anderen System verbunden ist, ist die Behebung von Dateisystembeschädigungen mit fsck ganz einfach und andere Werkzeuge. Das Beheben von Konfigurationsfehlern, beschädigten Paketen oder anderen Problemen kann komplexer sein, da sie das Mounten des Dateisystems und das Auffinden und Ändern der richtigen Konfigurationsdateien oder Datenbanken erfordern.

Systemd verwenden

Vor systemd war das Bearbeiten von Konfigurationsdateien mit einem Texteditor ein praktischer Weg, um eine Konfiguration zu korrigieren. Das Auffinden der erforderlichen Dateien und das Verstehen ihres Inhalts kann eine separate Herausforderung sein, die den Rahmen dieses Artikels sprengen würde.

Wenn das GNU/Linux-System systemd verwendet Viele Konfigurationsänderungen werden jedoch am besten mit den bereitgestellten Tools vorgenommen. Das Aktivieren und Deaktivieren von Diensten erfordert beispielsweise das Erstellen oder Entfernen von symbolischen Links an verschiedenen Stellen. Die systemctl Tool wird verwendet, um diese Änderungen vorzunehmen, aber um es zu verwenden, ist ein systemd erforderlich Instanz laufen und (auf D-Bus) auf Anfragen warten. Wenn das Root-Dateisystem als zusätzliches Dateisystem auf einem anderen Computer gemountet wird, wird das ausgeführte systemd -Instanz kann nicht verwendet werden, um diese Änderungen vorzunehmen.

Manuelles Starten des systemd des Zielsystems ist auch nicht praktikabel, da es als PID 1-Prozess auf einem System konzipiert ist und alle anderen Prozesse verwaltet, die mit der bereits laufenden Instanz auf dem für die Reparaturen verwendeten System in Konflikt geraten würden.

Zum Glück systemd hat die Fähigkeit, Container, vollständig gekapselte GNU/Linux-Systeme mit eigener PID 1 und Umgebung zu starten, die verschiedene vom Linux-Kernel angebotene Namespace-Funktionen nutzen. Im Gegensatz zu Tools wie Docker und Rocket ist systemd benötigen kein Container-Image, um einen Container zu starten; es kann eines starten, das an jedem Punkt im bestehenden Dateisystem verwurzelt ist. Dies geschieht mit dem systemd-nspawn Tool, das die erforderlichen System-Namespaces erstellt und den anfänglichen Prozess im Container startet und dann eine Konsole im Container bereitstellt. Im Gegensatz zu chroot , was nur das scheinbare Stammverzeichnis des Dateisystems ändert, hat dieser Containertyp einen separaten Dateisystem-Namensraum, geeignete Dateisysteme, die unter /dev gemountet sind , /run , und /proc , sowie einen separaten Prozess-Namespace und IPC-Namespaces. Konsultieren Sie den systemd-nspawn Manpage, um mehr über seine Fähigkeiten zu erfahren.

Ein Beispiel, um zu zeigen, wie es funktioniert

In diesem Beispiel wurde das Speichergerät, das das Root-Dateisystem des beschädigten Systems enthält, an ein laufendes System angeschlossen, wo es als /dev/vdc angezeigt wird . Der Gerätename hängt von der Anzahl vorhandener Speichergeräte, dem Gerätetyp und der zum Verbinden mit dem System verwendeten Methode ab. Das Root-Dateisystem könnte das gesamte Speichergerät verwenden oder sich in einer Partition innerhalb des Geräts befinden. Da die häufigste (einfache) Konfiguration das Root-Dateisystem in der ersten Partition des Geräts platziert, verwendet dieses Beispiel /dev/vdc1. Achten Sie darauf, den Gerätenamen in den folgenden Befehlen durch den korrekten Gerätenamen Ihres Systems zu ersetzen.

Das beschädigte Root-Dateisystem kann auch komplexer sein als ein einzelnes Dateisystem auf einem Gerät; es kann sich um ein Volume in einem LVM-Volume-Set oder auf einem Satz von Geräten handeln, die zu einem Software-RAID-Gerät kombiniert sind. In diesen Fällen müssen die notwendigen Schritte zum Zusammenstellen und Aktivieren des logischen Geräts, das das Dateisystem enthält, durchgeführt werden, bevor es zum Mounten verfügbar ist. Auch diese Schritte würden den Rahmen dieses Artikels sprengen.

Voraussetzungen

Stellen Sie zuerst den systemd-nspawn sicher Tool installiert ist – die meisten GNU/Linux-Distributionen installieren es nicht standardmäßig. Es wird vom systemd-container bereitgestellt Paket auf den meisten Distributionen, verwenden Sie also den Paketmanager Ihrer Distribution, um dieses Paket zu installieren. Die Anweisungen in diesem Beispiel wurden mit Debian 9 getestet, sollten aber auf jeder modernen GNU/Linux-Distribution ähnlich funktionieren.

Die Verwendung der folgenden Befehle erfordert mit ziemlicher Sicherheit Root-Berechtigungen, also müssen Sie sich entweder als Root anmelden oder sudo verwenden um eine Shell mit Root-Berechtigungen zu erhalten, oder stellen Sie jedem der Befehle sudo voran .

Überprüfen und mounten Sie das Dateisystem

Verwenden Sie zuerst fsck um die Strukturen und den Inhalt des Zieldateisystems zu überprüfen:

$ fsck /dev/vdc1

Wenn es Probleme mit dem Dateisystem findet, beantworten Sie die Fragen entsprechend, um sie zu beheben. Wenn das Dateisystem ausreichend beschädigt ist, kann es möglicherweise nicht repariert werden. In diesem Fall müssen Sie andere Wege finden, um seinen Inhalt zu extrahieren.

Erstellen Sie nun ein temporäres Verzeichnis und hängen Sie das Zieldateisystem in dieses Verzeichnis ein:

$ mkdir /tmp/target-rescue
$ mount /dev/vdc1 /tmp/target-rescue

Starten Sie mit dem gemounteten Dateisystem einen Container mit diesem Dateisystem als Root-Dateisystem:

$ systemd-nspawn --directory /tmp/target-rescue --boot -- --unit rescue.target

Die Befehlszeilenargumente zum Starten des Containers sind:

  • --Verzeichnis /tmp/target-rescue stellt den Pfad des Root-Dateisystems des Containers bereit.
  • --boot sucht im Root-Dateisystem des Containers nach einem geeigneten Init-Programm und startet es, wobei Parameter von der Kommandozeile an es übergeben werden. In diesem Beispiel verwendet das Zielsystem auch systemd wie sein PID 1-Prozess, also sind die restlichen Parameter dafür bestimmt. Wenn das Zielsystem, das Sie reparieren, ein anderes Tool als PID 1-Prozess verwendet, müssen Sie die Parameter entsprechend anpassen.
  • -- trennt Parameter für systemd-nspawn von denen, die für den PID 1-Prozess des Containers bestimmt sind.
  • --unit rescue.target sagt systemd im Container den Namen des Ziels, das es während des Bootvorgangs erreichen soll. Um die Rettungsaktionen im Zielsystem zu vereinfachen, booten Sie es in den "Rescue"-Modus und nicht in den normalen Multi-User-Modus.

Wenn alles gut geht, sollten Sie eine Ausgabe sehen, die ungefähr so ​​aussieht:

Spawning container target-rescue on /tmp/target-rescue.
Press ^] three times within 1s to kill container.
systemd 232 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
Detected virtualization systemd-nspawn.
Detected architecture arm.

Welcome to Debian GNU/Linux 9 (Stretch)!

Set hostname to <test>.
Failed to install release agent, ignoring: No such file or directory
[  OK  ] Reached target Swap.
[  OK  ] Listening on Journal Socket (/dev/log).
[  OK  ] Started Dispatch Password Requests to Console Directory Watch.
[  OK  ] Reached target Encrypted Volumes.
[  OK  ] Created slice System Slice.
         Mounting POSIX Message Queue File System...
[  OK  ] Listening on Journal Socket.
         Starting Set the console keyboard layout...
         Starting Restore / save the current clock...
         Starting Journal Service...
         Starting Remount Root and Kernel File Systems...
[  OK  ] Mounted POSIX Message Queue File System.
[  OK  ] Started Journal Service.
[  OK  ] Started Remount Root and Kernel File Systems.
         Starting Flush Journal to Persistent Storage...
[  OK  ] Started Restore / save the current clock.
[  OK  ] Started Flush Journal to Persistent Storage.
[  OK  ] Started Set the console keyboard layout.
[  OK  ] Reached target Local File Systems (Pre).
[  OK  ] Reached target Local File Systems.
         Starting Create Volatile Files and Directories...
[  OK  ] Started Create Volatile Files and Directories.
[  OK  ] Reached target System Time Synchronized.
         Starting Update UTMP about System Boot/Shutdown...
[  OK  ] Started Update UTMP about System Boot/Shutdown.
[  OK  ] Reached target System Initialization.
[  OK  ] Started Rescue Shell.
[  OK  ] Reached target Rescue Mode.
         Starting Update UTMP about System Runlevel Changes...
[  OK  ] Started Update UTMP about System Runlevel Changes.
You are in rescue mode. After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to
boot into default mode.
Give root password for maintenance
(or press Control-D to continue):

In dieser Ausgabe sehen Sie systemd Starten als Init-Prozess im Container und Erkennen, dass er in einem Container ausgeführt wird, damit er sein Verhalten entsprechend anpassen kann. Verschiedene Unit-Dateien werden gestartet, um den Container in einen brauchbaren Zustand zu bringen, dann wird das Root-Passwort des Zielsystems abgefragt. Sie können hier das Root-Passwort eingeben, wenn Sie einen Shell-Prompt mit Root-Berechtigungen wünschen, oder Sie können Strg+D drücken damit der Startvorgang fortgesetzt werden kann, wodurch eine normale Konsolen-Anmeldeaufforderung angezeigt wird.

Wenn Sie die notwendigen Änderungen am Zielsystem abgeschlossen haben, drücken Sie Strg+] dreimal schnell hintereinander; Dadurch wird der Container beendet und Sie kehren zu Ihrer ursprünglichen Shell zurück. Von dort aus können Sie aufräumen, indem Sie das Dateisystem des Zielsystems aushängen und das temporäre Verzeichnis entfernen:

$ umount /tmp/target-rescue
$ rmdir /tmp/target-rescue

Das ist es! Sie können nun das/die Speichergerät(e) des Zielsystems entfernen und an das Zielsystem zurückgeben.

Die Idee, systemd-nspawn zu verwenden auf diese Weise, insbesondere der --boot Parameter , kam von einer Frage, die auf StackExchange gepostet wurde. Vielen Dank an Shibumi und kirbyfan64sos für die Bereitstellung nützlicher Antworten auf diese Frage!


Linux
  1. So verwenden Sie BusyBox unter Linux

  2. Wie ich Cron unter Linux verwende

  3. So verwenden Sie erweitertes rsync für große Linux-Backups

  4. So verwenden Sie den Su-Befehl unter Linux

  5. So installieren und verwenden Sie Hashcat für die Passwortwiederherstellung unter Linux:[Cyber ​​Forensics]

So verschlüsseln Sie das Root-Dateisystem unter Linux

So verwenden Sie den fd-Befehl auf einem Linux-System

So verwenden Sie Virtualbox-VMs auf KVM in einem Linux-System

Wie generiert und verwendet man einen SSH-Schlüssel in einem Linux-System?

So installieren und verwenden Sie Nmap unter Linux Mint 20

So installieren und verwenden Sie YouTube-DL auf einem Linux-System