天天看點

buildroot arm linux,基于Buildroot的Linux系統建構之根檔案系統

導讀:前面《《基于Buildroot的Linux系統建構之快速通關》》介紹了Buildroot建構系統快速入手的一些基本操作,《《基于Buildroot直接進行核心配置》》主要介紹了在Buildroot中如何直接進行核心配置裁剪,作為嵌入式Linux,根檔案系統的配置建構除核心之外最為複雜亦是最為重要的部分。本文分析記錄使用過程中的一些淺見,或有疏漏錯誤之處,請交流指出,不勝感激。

1.根檔案系統

通常而言檔案系統是作業系統對存儲媒體(磁盤或閃存等)的進行管理,實作存儲對象檔案式的通路管理的軟體。主要實作媒體管理、檔案的讀寫通路、應用接口、權限管理等功能。當然嚴格講這麼描述是有問題,比如VFS虛拟檔案系統。Anyway,這不是本文要讨論的重點,随它去吧。引入隻為了解友善。

那麼何為根檔案系統呢?它是一種檔案系統,其關鍵點在于這個“根”,是指核心啟動後加載的第一個檔案系統,核心代碼映像儲存在根檔案系統中,而系統引導啟動程式會在根檔案系統挂載之後從中把一些基本的初始化腳本和服務等加載到記憶體中去運作。引自《《百度百科》》

下圖是Ubuntu的根檔案系統樣式。

buildroot arm linux,基于Buildroot的Linux系統建構之根檔案系統

2.1 拷貝根檔案系統骨架skeleton至$TARTGET_DIR

基本的Linux根檔案系統是Unix檔案夾目錄層次結構,skeleton是建構根檔案系統的基礎。

skeleton配置入口:

System configuration ---》Root FS skeleton

sekleton可以配置為預設樣式

skeleton為于。/system/skeleton下:

buildroot arm linux,基于Buildroot的Linux系統建構之根檔案系統

inittab 的文法:

《id》::《runlevels》:《acTIon》:《process》

id,用于指定序列槽控制台名,需與實際對應,如為空則指/dev/console

runlevels,BusyBox不支援這個屬性,如設定則忽略

acTIon:

sysinit,運作當init啟動時在執行其他操作之前的程式,如加載檔案系統等

respawn,用于運作程式并在終止時重新開機這個程式,常用于控制一個程式以守護程序運作

askfirst,如其名(ask first then run),作用同respawn,不同的是需要使用者互動式确認,使用者需要輸入回車進行運作确認。它用于在終端上啟動互動式shell,而不提示輸入使用者名或密碼。

once,如其名,僅在開機啟動時運作一次所控制的程式,該程式終止後也不會重新開機這個程式

wait,用于運作程式并等待其完成後才執行後續操作。如可以用這個指令運作一些同步完成的操作。

restart,用于運作當init接收到SIGHUP信号時所需運作的程式,并訓示inittab需要重新加載

ctrlaltdel,用于當init接收到SIGINT信号時所需要運作的程式,中斷信号通常在啟動階段會由Ctrl+Alt+Del發出。

shutdown,用于當init接收到關機指令所需運作的程式。這個是由于init程序一直駐留背景運作。

process,上述acTIon控制需要運作的程式,如mount,swapoff等等。

2.1.2 systemV init

BusyBox是一個精簡版本的systemV init系統,想對于BusyBox,systemV init有兩個優勢:

首先,啟動腳本是以子產品化格式編寫的使在建構時或運作時添加新軟體包變得容易。

其次,它具有運作級别的概念,它允許啟動一系列程式或從一個運作級别切換到另一個運作級别時,立即停止。

支援8個運作級别(0-6以及S級别):

各級别的作用:

S,運作啟動程式使用

0,停止系統

1-5,作為通用使用

6,重新開機系統使用

2.1.3 systemd init

systemd 是于2010年由Lennart Poettering和Kay Sievers建立的一套內建工具,用于基于init守護程式管理Linux系統。包括裝置管理(udev)和日志記錄等。systemd是最新技術,并且仍在迅速發展。它在桌面和伺服器Linux發行版中很常見。這裡對具體機制細節不做描述,我也沒研究過。

2.2 建構安裝軟體包

軟體包部署安裝一般包括以下一些步驟:

将建構所有配置需建構的目标軟體包

如Busybox,Qt,OpenSSH,lighttpd等

其中大多數将在$(TARGET_DIR)中安裝檔案:程式,庫,字型,資料檔案,配置檔案等。

2.3 運作cleanup

這一步咋一看不明是以,為啥要清理。安裝完所有軟體包後,将執行清除步驟以減小根檔案系統的大小。主要涉及:

删除頭檔案,pkg-config檔案,CMake檔案,靜态庫,手冊頁和說明檔案。

使用strip剝離所有程式和庫,以删除不需要的資訊。

取決于BR2_ENABLE_DEBUG和BR2_STRIP_ *選項。

其他特定的清理步驟:使用Python時清理不需要的Python檔案等。請參閱Buildroot代碼中的TARGET_FINALIZE_HOOKS。

2.4 拷貝根檔案系統覆寫

要自定義根檔案系統的内容,如添加配置檔案,腳本,符号連結,目錄或任何其他檔案,一種可能的解決方案是使用根檔案系統重載。

根檔案系統覆寫隻是一個目錄,在安裝了所有軟體包之後,其内容将複制到根檔案系統中。允許覆寫檔案。

選項BR2_ROOTFS_OVERLAY包含以空格分隔的疊加路徑清單。

那麼實際操作咋整?可以将預設建構的根檔案系統挂載進行調試,如需要修改某部分的内容修改好,并将該檔案夾拷貝出來,在Buildroot配置項将重載開啟,重載路徑指向該檔案夾,Buildroot将在建構過程中自動複制該内容覆寫對應的部分。

2.5執行post-build腳本

如根檔案系統覆寫還不夠滿足要求,此時可以考慮使用post-build腳本來做補充,常常用來完成下面類似的需求:

可用于自定義現有檔案,删除不需要的檔案以節省空間,添加動态生成的新檔案(建構日期等)

在建立根檔案系統映像之前執行。 可以用任何語言編寫,經常使用shell腳本。

BR2_ROOTFS_POST_BUILD_SCRIPT包含以空格分隔的後生成腳本路徑清單。

$(TARGET_DIR)路徑作為第一個參數傳遞,其他參數可以在BR2_ROOTFS_POST_SCRIPT_ARGS選項中傳遞。

相關的環境變量:

BR2_CONFIG,Buildroot.config檔案的路徑

HOST_DIR,STAGING_DIR,TARGET_DIR,BUILD_DIR,BINARIES_DIR,BASE_DIR

關于根檔案系統還有權限表、使用者表、裝置表、裝置管理以及映象檔案如何部署等.