2009年7月13日 星期一

Kernel 與 initrd

Kernel 是作業系統的核心程式,所有的軟、硬體都是透過 kernel 做溝通的動作。若將一台安裝好的Linux電腦拆開來看,作業系統大致可以分成四個部份:軟體、shell、kernel 和硬體層。而與硬體關係最為密切的就是kernel,若有任何上層的軟體或指令需要使用到硬體的資源時,都必需要透過 kernel 才有辦法取得所需要的資源。


initrd (inital ramdisk) 是啟動系統所需要載入的檔案系統。下圖為 kernel 到 initrd 的流程圖。

kernel 會先在記憶體中製造一個 rootfs 當作臨時的空間供系統使用,然後將 initrd 當作是一個系統將其 mount 到 rootfs 上啟動。當 initrd 被載入後,必須做為 user 與 file system 的仲介,這需要有該檔案系統的模組及其他所有額外必須先被載入的模組,而此時提供適當的模組以讓開機流程繼續下去的就是 initrd。

在 initrd 中有以下幾個最要的觀念:
  • 目錄架構:
  • 當 kernel 啟動載入 initrd 時,並沒有任何系統的目錄架構,此時會先以 initrd 所提供的目錄當作是系統目錄。
  • dev 目錄:
  • dev 目錄中存在一些設備檔,當 initrd 被載入時,這些設備檔便可開始運作。
  • lib 目錄:
  • lib 目錄中存放了許多開機時所必須載入的模組。
  • init 檔:
  • initrd 中的script file,當 kernel 在讀取 initrd 時,會以此檔案的內容依序建立使用目錄及載入模所等所有大小事物。

    在 initrd 建立好相關的檔案系統配置後,便開始慢慢轉向到載入作業系統的部份,下圖為 initrd 轉移到作業系統各階段的任務與實際使用上的關聯性。



    越接近硬體的部份在愈下方,而作業系統是在最後才會被載入的,所以在最上面,而在操作作業系統時,大多是透過額外的機制去存取硬體,如:設備檔或sysfs等。因此,initrd 自然是從硬體層往上循序漸進,在將所有的硬體層部署完成後,以可以進入作業系統的部份。



    參考書目:邱世華.《Linux 作業系統之奧義》.稅知文化

    沒有留言:

    張貼留言