GNU/Linux >> Znalost Linux >  >> Linux

Jak používat systemd-nspawn pro obnovu systému Linux

Od té doby, co existují systémy GNU/Linux, se správci systému potřebovali zotavit z poškození kořenového souborového systému, náhodných změn konfigurace nebo jiných situací, které bránily zavedení systému do "normálního" stavu.

Linuxové distribuce obvykle nabízejí jednu nebo více možností nabídky při spouštění (například v nabídce GRUB), které lze použít k záchraně rozbitého systému; obvykle zavádějí systém do režimu pro jednoho uživatele s deaktivovanou většinou systémových služeb. V nejhorším případě by uživatel mohl upravit příkazový řádek jádra v bootloaderu tak, aby jako proces init (PID 1) používal standardní shell. Tato metoda je nejsložitější a plná komplikací, které mohou vést k frustraci a ztrátě času, když systém potřebuje záchranu.

Další zdroje pro Linux

  • Cheat pro příkazy Linuxu
  • Cheat sheet pro pokročilé příkazy systému Linux
  • Bezplatný online kurz:Technický přehled RHEL
  • Síťový cheat pro Linux
  • Cheat sheet SELinux
  • Cheat pro běžné příkazy pro Linux
  • Co jsou kontejnery systému Linux?
  • Naše nejnovější články o Linuxu

A co je nejdůležitější, všechny tyto metody předpokládají, že poškozený systém má nějakou fyzickou konzoli, ale to již není v době cloud computingu samozřejmostí. Bez fyzické konzole existuje jen málo (pokud vůbec nějaké) možnosti, jak ovlivnit proces spouštění tímto způsobem. I fyzické stroje mohou být malá, vestavěná zařízení, která nenabízejí snadno použitelnou konzoli a nalezení správných kabelů a adaptérů sériového portu a nastavení emulátoru sériového terminálu, to vše pro použití portu sériové konzoly při práci s nouzové, je často komplikované.

Když je k dispozici jiný systém (stejné architektury a obecně podobné konfigurace), běžnou technikou pro zjednodušení procesu opravy je vyjmutí paměťového zařízení (zařízení) z poškozeného systému a jeho připojení k funkčnímu systému jako sekundární zařízení. U fyzických systémů je to obvykle jednoduché, ale většina platforem cloud computingu to může také podporovat, protože umožňují připojení kořenového úložiště poškozené instance na jinou instanci.

Jakmile je kořenový souborový systém připojen k jinému systému, je řešení poškození souborového systému přímočaré pomocí fsck a další nástroje. Řešení chyb v konfiguraci, poškozených balíčků nebo jiných problémů může být složitější, protože vyžadují připojení souborového systému a umístění a změnu správných konfiguračních souborů nebo databází.

Použití systemd

Před systemd , úprava konfiguračních souborů pomocí textového editoru byla praktickým způsobem opravy konfigurace. Nalezení potřebných souborů a pochopení jejich obsahu může být samostatnou výzvou, která přesahuje rámec tohoto článku.

Když systém GNU/Linux používá systemd mnoho konfiguračních změn se však nejlépe provádí pomocí nástrojů, které poskytuje – například povolení a zakázání služeb vyžaduje vytvoření nebo odstranění symbolických odkazů na různých místech. systemctl K provedení těchto změn se používá nástroj, ale jeho použití vyžaduje systemd instance běží a naslouchá (na D-Bus) požadavkům. Když je kořenový souborový systém připojen jako další souborový systém na jiném počítači, běžící systemd instance nelze k provedení těchto změn použít.

Ruční spuštění systemd cílového systému není ani praktické, protože je navržen tak, aby byl procesem PID 1 v systému a spravoval všechny ostatní procesy, které by byly v konfliktu s již běžící instancí v systému použitém pro opravy.

Naštěstí systemd má schopnost spouštět kontejnery, plně zapouzdřené systémy GNU/Linux s vlastním PID 1 a prostředím, které využívají různé funkce jmenného prostoru nabízené linuxovým jádrem. Na rozdíl od nástrojů jako Docker a Rocket, systemd nevyžadují ke spuštění kontejneru obrázek kontejneru; může spustit jeden rootovaný v libovolném bodě existujícího souborového systému. To se provádí pomocí systemd-nspawn nástroj, který vytvoří potřebné systémové jmenné prostory a spustí počáteční proces v kontejneru, poté poskytne konzolu v kontejneru. Na rozdíl od chroot , který mění pouze zdánlivý kořen souborového systému, tento typ kontejneru bude mít samostatný jmenný prostor souborového systému, vhodné souborové systémy připojené na /dev , /spustit a /proc a samostatný jmenný prostor procesu a jmenný prostor IPC. Podívejte se na systemd-nspawn manuálovou stránku, kde se dozvíte více o jejích možnostech.

Příklad ukazující, jak to funguje

V tomto příkladu bylo úložné zařízení obsahující kořenový souborový systém poškozeného systému připojeno k běžícímu systému, kde se zobrazuje jako /dev/vdc . Název zařízení se bude lišit v závislosti na počtu existujících úložných zařízení, typu zařízení a způsobu jeho připojení k systému. Kořenový souborový systém může využívat celé úložné zařízení nebo být v oddílu v zařízení; protože nejběžnější (jednoduchá) konfigurace umístí kořenový souborový systém do prvního oddílu zařízení, tento příklad použije /dev/vdc1. Nezapomeňte nahradit název zařízení v příkazech níže správným názvem zařízení vašeho systému.

Poškozený kořenový souborový systém může být také složitější než jeden souborový systém na zařízení; může to být svazek v sadě svazků LVM nebo na sadě zařízení kombinovaných do softwarového zařízení RAID. V těchto případech je nutné provést nezbytné kroky ke složení a aktivaci logického zařízení, které souborový systém drží, než bude k dispozici pro připojení. Tyto kroky opět přesahují rámec tohoto článku.

Předpoklady

Nejprve zajistěte systemd-nspawn nástroj je nainstalován – většina distribucí GNU/Linux jej ve výchozím nastavení neinstaluje. Poskytuje jej systemd-container balíček na většině distribucí, takže k instalaci tohoto balíčku použijte správce balíčků vaší distribuce. Pokyny v tomto příkladu byly testovány pomocí Debianu 9, ale měly by fungovat podobně na jakékoli moderní distribuci GNU/Linux.

Použití níže uvedených příkazů bude téměř jistě vyžadovat oprávnění root, takže se buď budete muset přihlásit jako root, použijte sudo chcete-li získat shell s oprávněními root, nebo před každým příkazem uveďte sudo .

Ověřte a připojte souborový systém

Nejprve použijte fsck pro ověření struktur a obsahu cílového souborového systému:

$ fsck /dev/vdc1

Pokud zjistí nějaké problémy se souborovým systémem, odpovězte na otázky, abyste je opravili. Pokud je souborový systém dostatečně poškozen, nemusí být opravitelný, v takovém případě budete muset najít jiné způsoby, jak extrahovat jeho obsah.

Nyní vytvořte dočasný adresář a připojte cílový souborový systém do tohoto adresáře:

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

S připojeným souborovým systémem spusťte kontejner s tímto souborovým systémem jako jeho kořenovým souborovým systémem:

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

Argumenty příkazového řádku pro spuštění kontejneru jsou:

  • --adresář /tmp/target-rescue poskytuje cestu ke kořenovému souborovému systému kontejneru.
  • --boot vyhledá vhodný init program v kořenovém souborovém systému kontejneru a spustí jej, přičemž mu předá parametry z příkazového řádku. V tomto příkladu cílový systém také používá systemd jako jeho proces PID 1, takže zbývající parametry jsou určeny pro něj. Pokud cílový systém, který opravujete, používá jako proces PID 1 jakýkoli jiný nástroj, budete muset odpovídajícím způsobem upravit parametry.
  • -- odděluje parametry pro systemd-nspawn od těch, které jsou určeny pro proces PID 1 kontejneru.
  • --unit rescue.target říká systemd v kontejneru název cíle, kterého by se měl pokusit dosáhnout během procesu spouštění. Chcete-li zjednodušit záchranné operace v cílovém systému, spusťte jej do „záchranného“ režimu, nikoli do normálního režimu pro více uživatelů.

Pokud vše půjde dobře, měli byste vidět výstup, který vypadá podobně jako tento:

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):

V tomto výstupu můžete vidět systemd spuštění jako proces init v kontejneru a zjištění, že je spuštěn uvnitř kontejneru, aby mohl vhodně upravit své chování. Spustí se různé soubory jednotek, aby se kontejner dostal do použitelného stavu, poté je vyžadováno heslo root cílového systému. Zde můžete zadat heslo uživatele root, pokud chcete zobrazit výzvu prostředí s oprávněními uživatele root, nebo můžete stisknout Ctrl+D abyste umožnili pokračování procesu spouštění, čímž se zobrazí normální výzva k přihlášení do konzoly.

Po dokončení nezbytných změn v cílovém systému stiskněte Ctrl+] třikrát rychle za sebou; tím se kontejner ukončí a vrátíte se do původního shellu. Odtud můžete vyčistit odpojením souborového systému cílového systému a odstraněním dočasného adresáře:

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

A je to! Nyní můžete odstranit úložná zařízení cílového systému a vrátit je do cílového systému.

Nápad použít systemd-nspawn tímto způsobem, zejména parametr --boot , pochází z otázky zveřejněné na StackExchange. Děkujeme Shibumi a kirbyfan64sos za poskytnutí užitečných odpovědí na tuto otázku!


Linux
  1. Jak používat BusyBox na Linuxu

  2. Jak nainstalovat a používat Hashcat pro obnovu hesla v Linuxu:[Cyber ​​Forensics]

  3. Linux – Jak zakázat pípání systému pro neprivilegované uživatele?

  1. Jak používám cron v Linuxu

  2. Jak používat pokročilý rsync pro velké zálohy Linuxu

  3. Jak používat příkazy strace a ltrace v Linuxu

  1. Jak používám Cockpit pro domácí správu linuxového serveru

  2. Jak používat htop ke sledování procesů systému Linux

  3. Jak používat Su Command v Linuxu