如何使用systemd-nspawn進行Linux系統恢復

systemd linux_如何使用systemd-nspawn進行Linux系統恢復

systemd linux

只要存在GNU / Linux系統,系統管理員就需要從根文件系統損壞,意外的配置更改或其他阻止系統啓動到“正常”狀態的情況中恢復。 

Linux發行版通常在啓動時提供一個或多個菜單選項(例如,在GRUB菜單中),這些菜單選項可用於營救損壞的系統。 通常,他們在禁用大多數系統服務的情況下將系統引導到單用戶模式。 在最壞的情況下,用戶可以修改引導加載程序中的內核命令行,以將標準外殼用作初始化(PID 1)進程。 這種方法最複雜,並且充滿了複雜性,在需要搶救系統時可能會導致挫敗感和浪費時間。 

當另一個系統(具有相同體系結構和通常相似的配置)可用時,簡化修復過程的常用技術是從損壞的系統中提取存儲設備,並將它們作爲輔助設備連接到工作系統。 對於物理系統,這通常很簡單,但是大多數雲計算平臺也可以支持此操作,因爲它們允許將損壞實例的根存儲卷安裝到另一個實例上。 

將根文件系統附加到另一個系統後,使用fsck和其他工具即可輕鬆解決文件系統損壞。 解決配置錯誤,損壞的程序包或其他問題可能會更加複雜,因爲它們需要掛載文件系統以及查找和更改正確的配置文件或數據庫。 

使用systemd

systemd之前,使用文本編輯器編輯配置文件是糾正配置的實用方法。 找到必要的文件並瞭解其內容可能是一個單獨的挑戰,這超出了本文的範圍。 

但是,當GNU / Linux系統使用systemd時 ,最好使用它提供的工具來進行許多配置更改-例如,啓用和禁用服務需要在各個位置創建或刪除符號鏈接。 systemctl工具用於進行這些更改,但使用它需要運行一個systemd實例並正在(在D-Bus上)偵聽請求。 當根文件系統作爲附加文件系統掛載到另一臺計算機上時,不能使用運行中的systemd實例進行這些更改。 

手動啓動目標系統的systemd也不可行,因爲它被設計爲系統上的PID 1進程並管理所有其他進程,這將與用於修復的系統上已經在運行的實例衝突。 

幸運的是, systemd能夠啓動容器,具有自己的PID 1的完全封裝的GNU / Linux系統以及利用Linux內核提供的各種名稱空間功能的環境。 與Docker和Rocket這樣的工具不同, systemd不需要容器映像來啓動容器。 它可以啓動一個植根於現有文件系統中任何位置的文件。 這是使用systemd-nspawn工具完成的,該工具將創建必要的系統名稱空間並在容器中啓動初始過程,然後在容器中提供控制檯。 與chroot (僅更改文件系統的表觀根目錄)相反,此類型的容器將具有單獨的文件系統名稱空間,在/ dev , / run/ proc上安裝的合適文件系統,以及單獨的進程名稱空間和IPC名稱空間。 請查閱systemd-nspawn 手冊頁以瞭解有關其功能的更多信息。 

展示其工作原理的示例

在此示例中,包含損壞的系統根文件系統的存儲設備已連接到正在運行的系統,在該系統中顯示爲/ dev / vdc 。 設備名稱將根據現有存儲設備的數量,設備的類型以及用於將其連接到系統的方法而有所不同。 根文件系統可以使用整個存儲設備,也可以使用該設備內的分區。 由於最常見(簡單)的配置將根文件系統放置在設備的第一個分區中,因此本示例將使用/ dev / vdc1。 確保使用系統的正確設備名稱替換以下命令中的設備名稱。

損壞的根文件系統也可能比設備上的單個文件系統更爲複雜。 它可以是LVM卷集中的一個卷,也可以是組合到軟件RAID設備中的一組設備上的卷。 在這些情況下,必須執行組成和激活保存文件系統的邏輯設備的必要步驟,然後才能將其安裝。 同樣,這些步驟超出了本文的範圍。 

先決條件

首先,請確保已安裝systemd-nspawn工具-大多數GNU / Linux發行版默認都不安裝它。 大多數發行版中的systemd-container軟件包都提供了該軟件包,因此請使用發行版的軟件包管理器來安裝該軟件包。 本示例中的指令已使用Debian 9進行了測試,但在任何現代GNU / Linux發行版中均應類似地工作。 

使用下面的命令幾乎肯定會需要root權限,因此您要麼需要以root身份登錄,要麼使用sudo獲得具有root權限的shell,要麼爲每個命令加上sudo前綴。 

驗證並安裝文件系統

首先,使用fsck驗證目標文件系統的結構和內容: 

 $ fsck /dev/vdc1 

如果發現文件系統有任何問題,請適當回答問題以更正它們。 如果文件系統已充分損壞,則可能無法修復,在這種情況下,您將不得不尋找其他方法來提取其內容。 

現在,創建一個臨時目錄並將目標文件系統掛載到該目錄: 

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

掛載文件系統後,啓動一個以該文件系統爲根文件系統的容器: 

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

用於啓動容器的命令行參數爲: 

  • --directory / tmp / target-rescue提供容器的根文件系統的路徑。 
  • --boot在容器的根文件系統中搜索合適的init程序並啓動它,並將參數從命令行傳遞給它。 在此示例中,目標系統還使用systemd作爲其PID 1進程,因此其餘參數將用於該進程。 如果要修復的目標系統使用任何其他工具作爲其PID 1進程,則需要相應地調整參數。 
  • -systemd-nspawn的參數與容器的PID 1進程的參數分開。 
  • --unit rescue.target告訴容器中的systemd在引導過程中應嘗試到達的目標名稱。 爲了簡化目標系統中的救援操作,請將其引導到“救援”模式,而不是正常的多用戶模式。 

如果一切順利,您應該會看到類似以下的輸出: 

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

  1. 在此輸出中,您可以看到systemd作爲容器中的init進程啓動,並檢測到它正在容器中運行,因此可以適當地調整其行爲。 啓動各種單位文件以使容器處於可用狀態,然後請求目標系統的根密碼。 如果要具有root權限的shell提示符,可以在此處輸入root密碼,也可以按Ctrl + D允許啓動過程繼續,這將顯示正常的控制檯登錄提示符。 

完成對目標系統的必要更改後,快速連續按三下Ctrl +] 。 這將終止容器並使您返回原始外殼。 從那裏,您可以通過卸載目標系統的文件系統並刪除臨時目錄來進行清理: 

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

而已! 現在,您可以刪除目標系統的存儲設備,並將它們返回到目標系統。 

以這種方式使用systemd-nspawn的想法,尤其是--boot參數 ,來自於StackExchange上發佈的一個問題 。 感謝Shibumi和kirbyfan64sos爲這個問題提供了有用的答案!

翻譯自: https://opensource.com/article/18/11/systemd-nspawn-system-recovery

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章