深度技術學院如何修複一個Panic的Linux核心
作者:深度系統 文章來源:http://www.sdgho.com 釋出時間:2017-06-21 08:44
寫這篇文章是有原因的。為了配置完全的靜默啟動,筆者對自己的工作計算機上運作的Linux執行了不當的mkinitcpio操作,原因是忽略了mkinitcpio.conf檔案中的一處邏輯錯誤。這使得mkinitcpio生産了新的核心檔案,但這個核心檔案不能正常工作。重新開機的時候,核心啟動中止于Panic狀态。

一般情況下,新核心不能正常工作時,可以通過使用initramfs核心檔案的fallback版本來臨時啟動系統,甚至可以直接将fallback版本覆寫回去以回退更改,但這次要命的是,mkinitcpio同時修改了vmlinuz核心檔案,而且vmlinuz沒有fallback版本。對于一般使用者,可以直接重裝系統解決;但是筆者的工作站環境配置相當複雜,這意味着除了可能損失我的工作檔案之外,我還需要花費大量額外的時間來重配開發環境。
注意:本教程之“修複”,指“嘗試回退毀滅性的人為更改”,故不可用于恢複不知原因的核心崩潰。
一、從LiveCD啟動并檢視磁盤
憑着兼職Linux伺服器運維那段時間積累的經驗,我立即想到可以用LiveCD啟動來獲得一個臨時的、用于修複核心的Linux環境。
筆者使用的是Arch Linux 64位版,是以我從從Arch Linux的LiveCD啟動。正确進入LiveCD内建的root使用者之後,我們需要檢視自己的主硬碟的裝置名。執行fdisk -l,在筆者的情況下,我的主硬碟、挂載至根目錄的分區對應的裝置檔案是/dev/sdb2。
二、chroot至硬碟上的系統根目錄
要chroot到硬碟上的系統根目錄,并能正常調用硬碟上的系統元件對硬碟上的系統作出更改,我們首先要手動挂載硬碟上的根分區。執行(我的裝置檔案是/dev/sdb2):
mount /dev/sdb2 /mnt
先不要急。這時候chroot到/mnt雖然能進入硬碟上主系統的bash,但是你幾乎不能正确完成任何複雜的任務,因為還有一些重要的目錄沒有挂載。我們執行指令,分别挂載proc目錄、/sys目錄、/dev目錄和/run目錄。進入/mnt,分别執行:
mount -t proc proc proc/
mount --rbind /sys sys/
mount --rbind /dev dev/
mount --rbind /run run/
這些目錄的作用分别是:
proc目錄:虛拟的、Procfs格式的檔案系統,用于存放程序狀态檔案(在Linux下,這些檔案表面看起來都是文本檔案,實際上是程序狀态的檔案映射);
/sys目錄:對于Arch Linux,這是一個類似proc目錄的、Sysfs格式的虛拟檔案系統,用于儲存連接配接到系統的裝置檔案;對于傳統Unix和類Unix,它是一個指向核心代碼樹的軟連結;
/dev目錄:儲存裝置檔案,比如你的硬碟就是/dev/sdXY之類的;
/run目錄:存放最近的啟動之後系統的部分資訊;
挂載了這些東西之後,我們可以chroot到我們的主硬碟的根目錄了:
chroot /mnt
後悔藥++。對于我來說,我隻需要修改mkinitcpio.conf檔案并重新執行mkinitcpio操作,就能重新生成正确的核心檔案。一般的,如果是錯誤地修改了配置導緻的核心Panic,這個環境可以解決大部分問題。
三、一些技巧
1、許多配置檔案在LiveCD裡的那個系統裡有正确的版本或範本,如果不記得正常的時候是什麼樣子的,可以參照一下它們;
2、對于Arch Linux,可以在不chroot到/mnt的情況下,直接使用pacstrap指令對/mnt這個挂載點進行軟體包管理;
3、可以在兩個tty下操作,這樣在chroot到/mnt下之後依然能從LiveCD的檔案系統裡向/mnt轉移檔案。
本教程應該對大部分Linux發行版都可用,希望能對部分Linux使用者産生幫助。