linux啟動時掛載rootfs的幾種方式 .

來源:互聯網
上載者:User

根檔案系統(在範例錯誤訊息中名為 rootfs)是 Linux 的最基本的組件。根檔案系統包含支援完整的 Linux 系統所需的所有內容。它包含所有應用程式、配置、裝置、資料等

 

 

Linux 中,rootfs 是必不可少的。PC 上主要實現有 ramdisk 和直接掛載 HD(Harddisk,硬碟) 上的根檔案系統;嵌入式中一般不從 HD 啟動,而是從 Flash 啟動,最簡單的方法是將 rootfs load 到 RAM 的 RAMDisk,稍複雜的就是 直接從Flash 讀取的 Cramfs,更複雜的是在 Flash 上分區,並構建 JFFS2 等檔案系統

 

 

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

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

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

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 loader initialized RAM disk)可以說是啟動過程中用到的一種機制,具體的實現過程也使用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中用的物理地址對應。

根檔案系統(在範例錯誤訊息中名為 rootfs)是 Linux 的最基本的組件。根檔案系統包含支援完整的 Linux 系統所需的所有內容。它包含所有應用程式、配置、裝置、資料等

 

 

Linux 中,rootfs 是必不可少的。PC 上主要實現有 ramdisk 和直接掛載 HD(Harddisk,硬碟) 上的根檔案系統;嵌入式中一般不從 HD 啟動,而是從 Flash 啟動,最簡單的方法是將 rootfs load 到 RAM 的 RAMDisk,稍複雜的就是 直接從Flash 讀取的 Cramfs,更複雜的是在 Flash 上分區,並構建 JFFS2 等檔案系統

 

 

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

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

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

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 loader initialized RAM disk)可以說是啟動過程中用到的一種機制,具體的實現過程也使用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中用的物理地址對應。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.