標籤:
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壓縮包在光碟片中是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)[email protected] $(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系統。
Buildroot構建指南——根檔案系統(Rootfs)