Root File System

這個部份來了解一下buildroot底下的root filesystem建制流程如下圖所示:

(來源 : free-electrons )

Root filesystem skeleton

root filesystem,最重要的第一步就是要有一個框架,因為Linux也是採用Unix的檔案架構,所以一開始的基本容器就要先決定好,否則你建制好的一些檔案就會沒地方放。在『.config』裡面的變數『BR2_ROOTFS_SKELETON_DEFAULT』,預設會為『y』,代表的是會使用『buildroot/system/skeleton』,而這個資料夾也是第一個會被複製進去『$(TARGET_DIR)』的,但是如果你想要用你自己的框架的話,除了『BR2_ROOTFS_SKELETON_DEFAULT』要為『n』以外,還要設置另外兩個變數『BR2_ROOTFS_SKELETON_CUSTOM』和『BR2_ROOTFS_SKELETON_CUSTOM_PATH』的搭配,但是官方不推薦用這種作法,因為他們做出來的框架其實已經符合大部分人的需求,如果真的有一些客製化的檔案,建議是可以使用『rootfs overlays』和『post-build』來套用。

Installation of packages

經過上一步以後,『$(TARGET_DIR)』裡面就已經有root filesystem的框架了,假設剛剛host,tool-chain的部份都已經建制好了,這一步將開始建立許多你剛剛選擇要安裝在目標板上面的套件,並且將相關的檔案們給移到『$(TARGET_DIR)』裡面。

Cleanup step

經過上一步以後,全部套件都已經安裝到了『$(TARGET_DIR)』的root filesystem裡面了,但是因為target board是嵌入式系統,對資源和空間非常的講究,所以這一步會執行減重的步驟,這部份包含了:

  • 刪除所有的標頭檔,pkg-config,CMake檔案,靜態函式庫,man手冊還有其他的文件等等。
  • 將程式和函式庫裡面不需要的資訊給消除掉,這部份需要用到程式『strip』的幫忙,通常為了以後debug需求,程式或是函式庫裡面都會有許多的symbol,但是像剛剛說的,這些資訊需要刪除以節省空間,就需要用strip程式來將這些symbol給刪掉。在buildroot裡面,主要取決於『BR2_ENABLE_DEBUG』和『BR2_STRIP_*』。
  • 如果有使用一些其他的語言,像是Python之類的,想要刪除一些它所建立出來一些不必要的檔案,這部份請參考關鍵字『TARGET_FINALIZE_HOOKS』,這些有在hooks所註冊的巨集都會在所有套件建制結束後,root filesystem映像檔被建制前會被啟動,舉個例子來說:

上圖看到這個mk檔裡面有定義兩個巨集,然後會在由這個hook定義去呼叫相關的巨集。

Root filesystem overlay

在清除了許多沉餘的資訊以後,下一步就是將你的一些客製化的組態(configuration),腳本(script),連結檔(symbolic links),資料夾和檔案等等的資料給複製到『$(TARGET_DIR)』裡面,『$(TARGET_DIR)』裡面本身就有這些檔案的話,就會直接被蓋掉,既然要在buildroot建置過程去做這件事,那就一定要跟系統說你的overlay的路徑在哪,這部分就要交給變數『BR2_ROOTFS_OVERLAY』來做了,通常Overlay的部分都會宣告在default configuration裡面,有興趣者可以在『configs』裡面用關鍵字『BR2_ROOTFS_OVERLAY』去搜尋。

Post-build scripts

上一步是將許多客製化的檔案給複製到『$(TARGET_DIR)』裡面,但是因為上一步只是『複製』,如果需要更多客製化的『動作』好像就不敷使用,像是修改檔案內容,更進階的移除不需要的檔案等等,所以這一步主要就是在建置root fielsystem之前,提供一個會去執行的腳本(當然也可以用其它的語言來做,但是主要是以shell script)。

Post-build scripts主要在變數『BR2_ROOTFS_POST_BUILD_SCRIPT』裡面宣告,

這邊看一下raspberrypi3的default config,用關鍵字『BR2_ROOTFS_POST_BUILD_SCRIPT』去搜尋找到:

預設的『post-build.sh』路徑可以看到是在『board/raspberrypi3』下面,所以在用vim開啟這個檔案看看:

就發現原來raspberryPi3上的default config,主要是加了一段tty1 console的描述,如果在這一段腳本想要傳參數進去的話,由剛剛raspberrypi3的default config上有看到一個『BR2_ROOTFS_POST_SCRIPT_ARGS』變數,主要是用來傳參數到post-build.sh裡面的。

Generating the filesystem images

到剛剛上一步為止,我們的root filesystem算是已經差不多了,最後在調整一下一些組態檔以後就可以建置映像檔了。如果在buildroot根目錄下使用menuconfig的話,在子目錄『Filesystem images』,底下會有多個檔案系統格式的清單讓你挑選:

當在$(PACKAGES)裡面的所有東西都就緒後,下一步就是建置root filesystem image,第一步會先用make target - 『target-finalize』將『$(TARGET_DIR)』裡面的文件,標頭檔,靜態函式庫等等刪除。然後利用『buildroot/fs/common.mk』裡面的架構來定義三種權限,主要是利用一個叫做『fakeroot』的軟體來建立這些權限和最終的filesystem 映像檔,這套軟體如它的名字一樣,它會模擬成root的權限,所以權限相關的資訊才能被修改。

  • Permission table
    大部分的檔案都會都會由fakeroot將權限設定成root:root,但是有些檔案會需要一些客製化的權限,就由這個Table來設置。

  • Device table
    如果你是使用static的『/dev』,就需要用到這個device table,這個table牽涉到一些device node的權限。

  • Users table
    如果需要對一些特定的user還是group設定權限,可以在這個Table設定。這三個權限都會統一在package章節介紹。

Post-image scripts

上面所有的步驟都跑完了以後,接下來就到最後一步,系統會呼叫『post-image.sh』,這個script會允許你在所有步驟都建置完畢之後在去做一些額外的行為,像是:

  • 產生FW
  • 對root filesystem解壓縮然後做NFS booting
  • 允許gettty
  • 設定hostname和banner
  • 網路設定
  • root的密碼
  • timezone等等

post-image需要對『.config』裡面的變數『 BR2_ROOTFS_POST_IMAGE_SCRIPT』定義,如果需要傳參數進去的話可以用變數『BR2_ROOTFS_POST_SCRIPT_ARGS』。

results matching ""

    No results matching ""