導讀:前面《《基于Buildroot的Linux系統構建之快速通關》》介紹了Buildroot構建系統快速入手的一些基本操作,《《基于Buildroot直接進行內核配置》》主要介紹了在Buildroot中如何直接進行內核配置裁剪,作為嵌入式Linux,根文件系統的配置構建除內核之外最為復雜亦是最為重要的部分。本文分析記錄使用過程中的一些淺見,或有疏漏錯誤之處,請交流指出,不勝感激。
1.根文件系統
通常而言文件系統是操作系統對存儲介質(磁盤或閃存等)的進行管理,實現存儲對象文件式的訪問管理的軟件。主要實現介質管理、文件的讀寫訪問、應用接口、權限管理等功能。當然嚴格講這么描述是有問題,比如VFS虛擬文件系統。Anyway,這不是本文要討論的重點,隨它去吧。引入只為理解方便。
那么何為根文件系統呢?它是一種文件系統,其關鍵點在于這個“根”,是指內核啟動后加載的第一個文件系統,內核代碼映像保存在根文件系統中,而系統引導啟動程序會在根文件系統掛載之后從中把一些基本的初始化腳本和服務等加載到內存中去運行。引自《《百度百科》》
下圖是Ubuntu的根文件系統樣式。
2.1 拷貝根文件系統骨架skeleton至$TARTGET_DIR
基本的Linux根文件系統是Unix文件夾目錄層次結構,skeleton是構建根文件系統的基礎。
skeleton配置入口:
System configuration ---》Root FS skeleton
sekleton可以配置為默認樣式
skeleton為于。/system/skeleton下:
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
關于根文件系統還有權限表、用戶表、設備表、設備管理以及映象文件如何部署等.
評論
查看更多