歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux管理 >> Linux問題解決

Linux技巧:在系統引導期間查找rootfs

作為一名Linux管理員,您可能會在增加外部存儲卷之後或者甚至在安裝新 Linux 操作系統之後,嘗試重新啟動服務器時遇到諸如 cannot mount rootfs 和 kernel panic 之類的 rootfs 錯誤。本文將概要介紹 x86 平台上的 Linux 引導進程,顯示出現此問題的原因,並提供避免或修正此問題的四個技巧。
問題概述


根文件系統(在樣例錯誤消息中名為 rootfs)是 Linux 的最基本的組件。根文件系統包含支持完整的 Linux 系統所需的所有內容。它包含所有應用程序、配置、設備、數據等。沒有根文件系統,您的 Linux 系統將無法運行。


在重新啟動系統後,您可能會遇到 cannot mount rootfs 錯誤(在 Linux 主機得到 kernel panic 之後)。這種問題經常會在從外部存儲中增加一些存儲卷之後出現,也可能會在完成文件復制並需要重新啟動來完成安裝時出現。


如果出現此問題,您的系統將不會重新啟動。診斷和修正此問題都需要花時間。本文介紹的 4 個技巧應當可以幫助您解決問題並節省時間。


另一個問題是 Linux 內核需要裝入根文件系統,但是它找不到目標設備。換言之,根文件系統沒有出現在它應該在的位置。例如,您把 Linux 根文件系統安裝在 /dev/sda 磁盤中,但是您的系統在重新啟動時無法裝入它。出現這個問題有兩個可能的原因:


1.磁盤 /dev/sda 在系統重新啟動時沒有顯示。

出現這種情況的可能的原因是您的 Linux 主機沒有裝入根文件系統的關鍵驅動器。情況未必如此。Linux 安裝程序將把需要的所有驅動器構建到 initrd 映像中,以便 Linux 系統可以在啟動時輕松地載入設備驅動器。但是,如果您是手動安裝了磁盤,則可能會出現此錯誤。

 

2.顯示了磁盤 /dev/sda,但是它不是根文件系統。在重新啟動後,您的根文件系統已經改為 /dev/sdb。

這是最可能出現的情況。

那麼,系統重新啟動後 /dev/sda 是如何被重命名為 /dev/sdb 的?在 Linux 中,/dev/sd* 表示 SCSI 設備。Linux 將把這些設備的名稱從 sda 改為 sdz(以及從 sdaa 改為 sdzz,以此類推)。它將把第一個 SCSI 設備命名為 /dev/sda,把第二個 SCSI 設備命名為 /dev/sdb,以此類推。


如果使用在根文件系統設備適配器驅動器之前裝入的驅動器(最初位於 /dev/sda)在適配器中安裝設備,則根文件系統將移到命令鏈的下一個字母(/dev/sdb),並且根文件系統不是遇到的第一個設備。因此,如果它在行首找不到 rootfs,它就無法裝入。


這是所發生情況的簡單說明,但是為了給這個場景補充更多上下文,讓我們概要說明一下 Linux 引導進程。


Linux 引導的工作原理


以下步驟將概要介紹 Linux 引導進程的工作原理:


1.計算機在啟動時首先執行的是初始測試 POST(開機自檢,Power On Self Test),它將測試多個設備,包括處理器、內存、顯卡和鍵盤。此外,還將測試引導介質(硬盤、軟盤和 CD-ROM)。在 POST 之後,ROM 中的加載程序將載入引導扇區,該扇區隨後將從活動分區中載入操作系統。您可以通過編輯服務器 BIOS 來更改引導介質順序。

2.引導扇區總是在同一個位置 — 引導設備的磁道 0、柱面 0、磁頭 0。此扇區包含名為 loader 的程序(對於 Linux,它通常是 LILO 或 GRUB);實際上是此程序引導操作系統。加載程序不是安裝在 MBR 中,就是安裝在活動主分區的第一個扇區中。

3.如果服務器中安裝了多個操作系統,您需要從引導加載程序菜單中選擇需要引導的操作系統。如果安裝了多個內核,您還可以在此菜單中選擇要載入的內核。

4.然後,引導加載程序將解壓縮並載入內核。內核將首先載入內核模塊,然後檢測硬件(軟驅、硬盤、網絡適配器等),檢驗硬件配置,然後掃描和載入設備驅動程序。

5.在此階段,內核將裝入根文件系統和系統文件。在重新編譯期間,可以(或通過其他程序)配置系統文件的位置。如果載入失敗,kernel panic 將出現,並且系統將凍結(freeze)。這是先前提到的載入失敗類型。

6.接下來,內核將啟動系統初始化進程 init,這將成為第一個進程。隨後它將啟動系統的其余部分。init 進程是 Linux 的第一個進程,它是所有其他進程的父進程。此進程是在任何 Linux/UNIX® 系統中第一個運行的進程;它的 PID 始終為 1。

7.然後,init 將檢驗 /etc/inittab 文件以確定必須啟動哪些進程。此文件將提供關於 runlevel 及在各個 runlevel 上應當啟動的進程的 init 信息。然後,init 將查找第一個帶有 sysinit(系統初始化)操作的行,然後將執行指定的命令文件,如 Red Hat Linux 中的 /etc/rc.d/rc.sysinit。在執行 /etc/rc.d/rc.sysinit 中的腳本之後,init 將開始啟動與初始 runlevel 關聯的進程。在執行完 runlevel 初始腳本時,Linux 將允許您登錄。

討論的每種解決方案都將處理這張列表中的第 5 步。

Copyright © Linux教程網 All Rights Reserved