以前我一直搞不懂 initrd 是做啥用的,呵!最近搞 windows CE BSP 再看了下面兩篇文章,就清楚很多了,想搞 linux 的人可以好好看看,不管是程式開發或是系統管理,瞭解一下原理都會有很大的幫助。

先簡單的說明一下 initrd 的功用:
x86 Linux 在開機時,分成幾個階段。當 BIOS POST(Power On Self Test) 後會載入指定開機裝置上的 bootloader,這塊區域的大小只有 512 bytes,所以沒法放入很複雜的程式,因此這段碼主要是用來載入 bootloader 的 second stage。Second stage 的 code 會將 kernel 及 initrd 載入記憶體中,將 initrd mount 成暫時的 root,裡面放置開機時必要的 drivers。用這些 driver kernel 才能正確的取得資源並初始化,接下來 mount real root 然後提供更豐富的功能給使用者。

Kernel 是與平臺無關的程式碼、演算法、服務的集合,所以一些如 MMU 的初始、磁碟的存取、網路的通訊都是透過下層的 HAL + drivers 來提供。試想,在開機時,如果 kernel 不知道怎麼存取 HD/flash,那怎麼可能接著下去開機呢?所以,不管是 PC or embedded,都會有一個跟平臺相依的 bootloader(如 grub, lilo, u-boot, redboot...),來完成一些硬體環境的 initialization。然後把 kernel 及 initrd 丟到 RAM 裡。

這時 RAM controller 一定已經被設定好了(PC 是由 BIOS 完成,embedded 是由 bootloader),所以 kernel 可以很直接的在 RAM 裡執行,並經由 bootloader 傳入的參數得知 initrd 在 RAM 的哪個位置(並且知道怎麼解讀它的結構),然後從中取得它要的 driver。試想,如果說 IDE driver 被放在 initrd 而不是 build in 在 kernel 裡,且 initrd 沒有被 bootloader 載入到 RAM 中,那就根本沒有辨法接著完成開機的動作。所以有時候新 build 好的 kernel 在開機時沒法 mount root,就可以從下面幾方面去檢查

  • Boot media(IDE HD, SATA HD, USB thumb disk...) 的 driver 沒有 build in 在 kernel 裡 or 放到 initrd 裡
  • Boot media 所掛的 bus driver(IDE, SATA, SCSI, USB) 沒有 build in 在 kernel or 放到 initrd 裡

之所以會需要 initrd,是因為如果所有的 driver/service 都 build in 到 kernel 裡,那 kernel 一定會肥到不行。可是如果不放到 kernel 裡 kernel 又沒法認識所執行的 hardware environment。還有像一些 linux live CD,會需要很多很多的 driver 以適用於不同的執行環境 ,想把這些 driver 放進 kernel 的想法也不是很實際。所以,就會有 initrd 這種東東,在開機時用來支援 kernel 去 probe/access hardware,一開完機就會將 initrd 所佔用的 RAM release 掉。也因為 initrd 要被載入到 RAM 中,所以相對的 bootloader 也要改寫,才會在 kernel 執行前把 initrd 放到 RAM 中。

Build linux kernel 很好玩,但也很令人頭大,尤其經過了幾次莫名的當機 or root mount 不上,會令人跳腳。所以會需要這些鳥知識,呵。文章請參考以下連結
Linux 初始 RAM 磁盘(initrd)概述