關於Linux啟動時掛載rootfs的幾種方式

2021-09-08 15:05:09 字數 1770 閱讀 7841

一直對linux啟動時掛載根檔案系統的過程存在著很多疑問,今天在水木精華區找到了有用的資料,摘錄如下:

1、linux啟動時,經過一系列初始化之後,需要mount 根檔案系統,為最後執行init程序等做準備,mount 根檔案系統有這麼幾種方式:

1)檔案系統已經存在於硬碟(或者類似的裝置)的某個分割槽上了,kernel根據啟動的命令列引數(root=/dev/***),直接進行mount。 這裡有乙個問題,在root檔案系統本身還不存在的情況下,kernel如何根據/dev/***來找到對應的裝置呢?注意:根檔案系統和其他檔案系統的mount方式是不一樣的,kernel通過直接解析裝置的名稱來獲得裝置的主、從裝置號,然後就可以訪問對應的裝置驅動了。所以在init/main.c中有很長一串的root_dev_names(如hda,hdab,sda,sdb,nfs,ram,mtdblock……),通過這個表就可以根據裝置名稱得到裝置號。注意,bootloader或核心中設定的啟動引數(root=/dev/***)只是乙個代號,實際的根檔案系統中不一定存在這個裝置檔案!

2)從軟碟機等比較慢的裝置上裝載根檔案系統,如果kernel支援ramdisk,在裝載root檔案系統時,核心判斷到需要從軟盤(fdx)mount(root=/dev/fd0),就會自動把檔案系統映象複製到ramdisk,一般對應裝置ram0,然後在ram0上mount根檔案系統。 從原始碼看,如果kernel編譯時沒有支援ramdisk,而啟動引數又是root=/dev/fd0,系統將直接在軟盤上mount,除了速度比較慢,理論上是可行的(沒試過,不知道是不是這樣?)

3)啟動時用到initrd來mount根檔案系統。注意理解ramdisk和initrd這兩個概念,其實ramdisk只是在ram上實現的塊裝置,類似與硬碟操作,但有更快的讀寫速度,它可以在系統執行的任何時候使用,而不僅僅是用於啟動;initrd(boot loaderinitialized ramdisk)可以說是啟動過程中用到的一種機制,具體的實現過程也使用ramdisk技術。就是在裝載linux之前,bootloader可以把乙個比較小的根檔案系統的映象裝載在記憶體的某個指定位置,姑且把這段記憶體稱為initrd(這裡是initrd所佔的記憶體,不是ramdisk,注意區別),然後bootloader通過傳遞引數的方式告訴核心initrd的起始位址和大小(也可以把這些引數編譯在核心中),在啟動階段就可以暫時的用initrd來mount根檔案系統。initrd的最初的目的是為了把kernel的啟動分成兩個階段:在kernel中保留最少最基本的啟動**,然後把對各種各樣硬體裝置的支援以模組的方式放在initrd中,這樣就在啟動過程中可以從initrd所mount的根檔案系統中裝載需要的模組。這樣的乙個好處就是在保持kernel不變的情況下,通過修改initrd中的內容就可以靈活的支援不同的硬體。在啟動完成的最後階段,根檔案系統可以重新mount到其他裝置上,但是也可以不再 重新mount(很多嵌入式系統就是這樣)。initrd的具體實現過程是這樣的:bootloader把根檔案系統映象裝載到記憶體指定位置,把相關引數傳遞給核心,核心啟動時把initrd中的內容複製到ramdisk中(ram0),把initrd占用的記憶體釋放掉,在ram0上mount根檔案系統。從這個過程可以看出,核心需要對同時對ramdisk和initrd的支援(這種需要都編入核心,不能作為模組)。

2、嵌入式系統根檔案系統的一種實現方法:對於kernel和根檔案系統都儲存在flash中的系統,一般可以利用linux啟動的initrd的機制。具體的過程前面已經比較清楚了,還有一點就是在啟動引數中傳遞root=/dev/ram0,這樣使得用initrd進行mount的根檔案系統不再切換,因為這個時候實際的裝置就是ram0。還有就是initrd的起始位址引數為虛擬位址,需要和bootloader中用的實體地址對應。

啟動時檢查

dubbo 缺省會在啟動時檢查依賴的服務是否可用,不可用時會丟擲異常,阻止 spring 初始化完成,以便上線時,能及早發現問題,預設check true 可以通過check false 關閉檢查,比如,測試時,有些服務不關心,或者出現了迴圈依賴,必須有一方先啟動。另外,如果你的 spring 容器...

當linux啟動時卡住mysql服務時

我們在linux環境下安裝完mysql之後,一般會把mysql新增到系統自動啟動列表中,修改方法是 在 etc rc.local檔案中新增 usr local mysql bin mysqld safe user mysql 這樣通常為使用者帶來了很多方便,但是筆者的linux系統突然有一天啟動時被...

servlet啟動時載入

servlet預設是在第一次訪問的時候建立的物件。servlet啟動時載入,就是讓 tomcat 伺服器啟動的時候建立servlet的物件 servlet物件是第一次被訪問的時候會被建立的,init方法就會執行。假設在init方法中做了一些比較耗時的操作 比如 載入了一些配置檔案並且解析可能需要花費...