Buildroot建構指南——根檔案系統(Rootfs)
Buildroot的Rootfs建構流程有一個大架構,有些部分是Buildroot系統做好的,有些細節需要自己來實作,Rootfs也是Buildroot中最為複雜的部分。
Rootfs的建構流程概述
Rootfs的建構流程如圖1所示。其中淺色框中為Buildroot實作的架構,深紫色框為使用者實作的腳本。
Figure 1 Buildroot系統的rootfs制作
需要歸納的幾點如下:
1. 新版buildroot已經把rootfs的/etc/init.d/的rcS等啟動腳本移到了package/initscripts/目錄下。
2. 系統預設的rcS腳本不會直接做系統使用者态啟動初始化操作,而是會調用/etc/init.d/目錄下的SXX開頭的腳本執行系統使用者态啟動的流程,其中XX是數字,數字越小的腳本優先于數字大的腳本被調用。用于實際的系統使用者态啟動腳本應該以SXX這這種格式命名,install到output/target/etc/init.d/目錄下。
3. fakeroot是一個主機上使用的軟體包,它會被buildroot下載下傳編譯,用于為建構rootfs提供一個虛拟的root權限環境,隻有在root權限下,才能把output/target/中的目錄和檔案變成root使用者,并建立dev節點。有了fakeroot環境,系統建構者無需擷取主機的root權限,也能在fakeroot下把檔案改為root使用者,并制作root方式。
4. 使用者特定格式的rootfs制作腳本,最後都會被寫到一個腳本中,該腳本會在fakeroot環境中執行。
如何建構自己的Rootfs
清楚流程後可以在Buildroot環境下建構自己的Rootfs了,以友善的tiny4412開發闆的rootfs為例,demo一次建構自己的rootfs的流程。
友善官方提供的rootfs壓縮包在CD光牒中是rootfs_qtopia_qt4-20141213.tar.gz,這個rootfs非常臃腫,我們需要對它進行裁剪,最好是能夠用busybox做一個最小的rootfs出來,但是由于暫時沒有摸清楚它的每一個細節,怕直接編譯的rootfs無法啟動,因而我們最好在它官方的/etc/init.d/目錄下的啟動腳本的基礎上做進一步裁剪,先保證系統能夠啟動。
1. 在buildroot/system/目錄中,拷貝一份skeleon/目錄到tiny4412_skeleton/ ,同時拷貝一份device_table.txt到tiny4412_device_table.txt,因為tiny4412的檔案系統中有特殊的部分需要修改,為了不影響通用的模闆,是以進行拷貝。
Figure 2 拷貝後的system/目錄中内容
2. 根據友善官方的rootfs内容,對tiny4412_skeleton/etc/目錄進行一些删減和修改,删減修改後截圖如下
Figure 3 删減修改後的tiny4412_skeleton/etc/目錄
3. 将官方檔案系統中,/etc/init.d/中的腳本cp到tiny4412_skeleton/etc/init.d/中,其實rcS更名為S00_tiny4412以比對SXX的格式,XX代表數字。
4. 将tiny4412_device_table.txt稍作修改,去掉passwd等一些最小系統中用不上的内容。
Figure4 修改後的tiny4412_device_table.txt檔案
5. 由于tiny4412的檔案系統比較特别,使用了友善專用的make_ext4fs工具來制作的,并且這是個不開源的bin程式,把一些參數和節點都在裡面寫死了,因而我們需要單獨在fs/中,為制作tiny4412的檔案系統添加方法。
6. 在fs/目錄下添加tiny4412_ext4/目錄,将友善官方提供的make_ext4fs工具cp到該目錄下,當然Config.in檔案和tiny4412_ext4.mk腳本是必不可少的的。别忘了在fs/Config.in中将新添加的配置檔案Config.in source進去哦!
Figure5 專為制作tiny4412 ext4檔案系統而添加的腳本目錄
Figure6 tiny4412_ext4/目錄中的内容
Figure7 在fs/Config.in中将新加入的Config.in關聯進去
7. 在tiny4412_ext4/Config.in中加入以下的配置代碼,其中BR2_TARGET_ROOTFS_TINY4412_EXT4是必不可少,讓系統能夠識别的檔案系統類型的變量。剩下的變量則是可在menuconfig中配置的,檔案系統大小,image制作工具的路徑,以及image最後的名字
config BR2_TARGET_ROOTFS_TINY4412_EXT4
bool"ext4 root filesystem for tiny4412"
help
Build aext4 root filesystem specify for tiny4412
if BR2_TARGET_ROOTFS_TINY4412_EXT4
config BR2_TARGET_ROOTFS_TINY4412_EXT4_LEN
string"length of rootfs"
default"397508608"
config BR2_TARGET_ROOTFS_TINY4412_EXT4_MK_TOOL_PATH
string "make image toolpath"
default"$(TOPDIR)/fs/tiny4412_ext4/make_ext4fs"
config BR2_TARGET_ROOTFS_TINY4412_EXT4_IMAGE_NAME
string"image name"
default"rootfs_qtopia_qt4.img"
endif
8. 在tiny4412_ext4.mk腳本中加入rootfs建構腳本。制作腳本的核心其實也就是ROOTFS_TINY4412_EXT4_CMD函數,它會在fs/common.mk腳本中,被寫入fakeroot的執行腳本,然後會在fakeroot環境中被執行。ROOTFS_TINY4412_EXT4_CMD 函數 調用make_ext4fs工具根據配置的參數,生成rootfs的image。
################################################################################
#
# Build the TINY4412_EXT4 root filesystem image
#
################################################################################
TINY4412_EXT4_OPTS := -s -l$(BR2_TARGET_ROOTFS_TINY4412_EXT4_LEN)
TINY4412_EXT4_OPTS += -a root -L Linux
ifeq ($(BR2_TARGET_ROOTFS_TINY4412_EXT4),y)
PACKAGES_PERMISSIONS_TABLE :=
endif
define ROOTFS_TINY4412_EXT4_CMD
$(BR2_TARGET_ROOTFS_TINY4412_EXT4_MK_TOOL_PATH) $(TINY4412_EXT4_OPTS)$@ $(TARGET_DIR)
endef
$(eval $(call ROOTFS_TARGET,tiny4412_ext4))
9. 接下來是make menuconfig的配置了。在menuconfig --> Systemconfiguration中,customer skeleton path 和 path to permissiontable 這兩項填充為1—4步驟中,我們所拷貝修改過的tiny4412_skeleton和tiny4412_device_table.txt。
Figure8 menuconfig --> Systemconfiguration的配置
10. 在menuconfig --> Filesystemimages中,選中我們剛剛特制的ext4 rootfs tor tiny4412,剩下的參數估計被make_ext4fs工具程式内部寫死了,用預設的就行。另外,在該選項中,busybox被預設選中,是以busybox中的所有軟體預設都被當做應用編譯和install到output/target/目錄下。
Figure9 menuconfig --> Filesystem images的配置
11. 儲存之後,make rootfs-tiny4412_ext4 就生成我們自己的檔案系統了。用tiny4412的SD卡燒錄進去,是可以boot起來的,對S00_tiny4412腳本進行進一步裁剪後,我們可以得到一個在tiny4412開發闆上最小的能boot起來的Linux系統。