作為一名Linux管理員,您可能會在增加外部存儲卷之后或者甚至在安裝新 Linux 操作系統(tǒng)之后,嘗試重新啟動服務(wù)器時遇到諸如 cannot mount rootfs 和 kernel panic 之類的 rootfs 錯誤。本文將概要介紹 x86 平臺上的 Linux 引導進程,顯示出現(xiàn)此問題的原因,并提供避免或修正此問題的四個技巧。
問題概述
根文件系統(tǒng)(在樣例錯誤消息中名為 rootfs)是 Linux 的最基本的組件。根文件系統(tǒng)包含支持完整的 Linux 系統(tǒng)所需的所有內(nèi)容。它包含所有應(yīng)用程序、配置、設(shè)備、數(shù)據(jù)等。沒有根文件系統(tǒng),您的 Linux 系統(tǒng)將無法運行。
在重新啟動系統(tǒng)后,您可能會遇到 cannot mount rootfs 錯誤(在 Linux 主機得到 kernel panic 之后)。這種問題經(jīng)常會在從外部存儲中增加一些存儲卷之后出現(xiàn),也可能會在完成文件復(fù)制并需要重新啟動來完成安裝時出現(xiàn)。
如果出現(xiàn)此問題,您的系統(tǒng)將不會重新啟動。診斷和修正此問題都需要花時間。本文介紹的 4 個技巧應(yīng)當可以幫助您解決問題并節(jié)省時間。
另一個問題是 Linux 內(nèi)核需要裝入根文件系統(tǒng),但是它找不到目標設(shè)備。換言之,根文件系統(tǒng)沒有出現(xiàn)在它應(yīng)該在的位置。例如,您把 Linux 根文件系統(tǒng)安裝在 /dev/sda 磁盤中,但是您的系統(tǒng)在重新啟動時無法裝入它。出現(xiàn)這個問題有兩個可能的原因:
1.磁盤 /dev/sda 在系統(tǒng)重新啟動時沒有顯示。
出現(xiàn)這種情況的可能的原因是您的 Linux 主機沒有裝入根文件系統(tǒng)的關(guān)鍵驅(qū)動器。情況未必如此。Linux 安裝程序?qū)研枰乃序?qū)動器構(gòu)建到 initrd 映像中,以便 Linux 系統(tǒng)可以在啟動時輕松地載入設(shè)備驅(qū)動器。但是,如果您是手動安裝了磁盤,則可能會出現(xiàn)此錯誤。
2.顯示了磁盤 /dev/sda,但是它不是根文件系統(tǒng)。在重新啟動后,您的根文件系統(tǒng)已經(jīng)改為 /dev/sdb。
這是最可能出現(xiàn)的情況。
那么,系統(tǒng)重新啟動后 /dev/sda 是如何被重命名為 /dev/sdb 的?在 Linux 中,/dev/sd* 表示 SCSI 設(shè)備。Linux 將把這些設(shè)備的名稱從 sda 改為 sdz(以及從 sdaa 改為 sdzz,以此類推)。它將把第一個 SCSI 設(shè)備命名為 /dev/sda,把第二個 SCSI 設(shè)備命名為 /dev/sdb,以此類推。
如果使用在根文件系統(tǒng)設(shè)備適配器驅(qū)動器之前裝入的驅(qū)動器(最初位于 /dev/sda)在適配器中安裝設(shè)備,則根文件系統(tǒng)將移到命令鏈的下一個字母(/dev/sdb),并且根文件系統(tǒng)不是遇到的第一個設(shè)備。因此,如果它在行首找不到 rootfs,它就無法裝入。
這是所發(fā)生情況的簡單說明,但是為了給這個場景補充更多上下文,讓我們概要說明一下 Linux 引導進程。
Linux 引導的工作原理
以下步驟將概要介紹 Linux 引導進程的工作原理:
1.計算機在啟動時首先執(zhí)行的是初始測試 POST(開機自檢,Power On Self Test),它將測試多個設(shè)備,包括處理器、內(nèi)存、顯卡和鍵盤。此外,還將測試引導介質(zhì)(硬盤、軟盤和 CD-ROM)。在 POST 之后,ROM 中的加載程序?qū)⑤d入引導扇區(qū),該扇區(qū)隨后將從活動分區(qū)中載入操作系統(tǒng)。您可以通過編輯服務(wù)器 BIOS 來更改引導介質(zhì)順序。
2.引導扇區(qū)總是在同一個位置 — 引導設(shè)備的磁道 0、柱面 0、磁頭 0。此扇區(qū)包含名為 loader 的程序(對于 Linux,它通常是 LILO 或 GRUB);實際上是此程序引導操作系統(tǒng)。加載程序不是安裝在 MBR 中,就是安裝在活動主分區(qū)的第一個扇區(qū)中。
3.如果服務(wù)器中安裝了多個操作系統(tǒng),您需要從引導加載程序菜單中選擇需要引導的操作系統(tǒng)。如果安裝了多個內(nèi)核,您還可以在此菜單中選擇要載入的內(nèi)核。
4.然后,引導加載程序?qū)⒔鈮嚎s并載入內(nèi)核。內(nèi)核將首先載入內(nèi)核模塊,然后檢測硬件(軟驅(qū)、硬盤、網(wǎng)絡(luò)適配器等),檢驗硬件配置,然后掃描和載入設(shè)備驅(qū)動程序。
5.在此階段,內(nèi)核將裝入根文件系統(tǒng)和系統(tǒng)文件。在重新編譯期間,可以(或通過其他程序)配置系統(tǒng)文件的位置。如果載入失敗,kernel panic 將出現(xiàn),并且系統(tǒng)將凍結(jié)(freeze)。這是先前提到的載入失敗類型。