天天看點

Buildroot建構指南——根檔案系統(Rootfs)Buildroot建構指南——根檔案系統(Rootfs)Rootfs的建構流程概述如何建構自己的Rootfs

Buildroot建構指南——根檔案系統(Rootfs)

Buildroot的Rootfs建構流程有一個大架構,有些部分是Buildroot系統做好的,有些細節需要自己來實作,Rootfs也是Buildroot中最為複雜的部分。

Rootfs的建構流程概述

Rootfs的建構流程如圖1所示。其中淺色框中為Buildroot實作的架構,深紫色框為使用者實作的腳本。

Buildroot建構指南——根檔案系統(Rootfs)Buildroot建構指南——根檔案系統(Rootfs)Rootfs的建構流程概述如何建構自己的Rootfs

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的檔案系統中有特殊的部分需要修改,為了不影響通用的模闆,是以進行拷貝。

Buildroot建構指南——根檔案系統(Rootfs)Buildroot建構指南——根檔案系統(Rootfs)Rootfs的建構流程概述如何建構自己的Rootfs

Figure 2 拷貝後的system/目錄中内容

2.      根據友善官方的rootfs内容,對tiny4412_skeleton/etc/目錄進行一些删減和修改,删減修改後截圖如下

Buildroot建構指南——根檔案系統(Rootfs)Buildroot建構指南——根檔案系統(Rootfs)Rootfs的建構流程概述如何建構自己的Rootfs

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等一些最小系統中用不上的内容。

Buildroot建構指南——根檔案系統(Rootfs)Buildroot建構指南——根檔案系統(Rootfs)Rootfs的建構流程概述如何建構自己的Rootfs

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進去哦!

Buildroot建構指南——根檔案系統(Rootfs)Buildroot建構指南——根檔案系統(Rootfs)Rootfs的建構流程概述如何建構自己的Rootfs

Figure5 專為制作tiny4412 ext4檔案系統而添加的腳本目錄

Buildroot建構指南——根檔案系統(Rootfs)Buildroot建構指南——根檔案系統(Rootfs)Rootfs的建構流程概述如何建構自己的Rootfs

Figure6 tiny4412_ext4/目錄中的内容

Buildroot建構指南——根檔案系統(Rootfs)Buildroot建構指南——根檔案系統(Rootfs)Rootfs的建構流程概述如何建構自己的Rootfs

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。

Buildroot建構指南——根檔案系統(Rootfs)Buildroot建構指南——根檔案系統(Rootfs)Rootfs的建構流程概述如何建構自己的Rootfs

Figure8 menuconfig -->  Systemconfiguration的配置

10.  在menuconfig -->   Filesystemimages中,選中我們剛剛特制的ext4 rootfs tor tiny4412,剩下的參數估計被make_ext4fs工具程式内部寫死了,用預設的就行。另外,在該選項中,busybox被預設選中,是以busybox中的所有軟體預設都被當做應用編譯和install到output/target/目錄下。

Buildroot建構指南——根檔案系統(Rootfs)Buildroot建構指南——根檔案系統(Rootfs)Rootfs的建構流程概述如何建構自己的Rootfs

Figure9 menuconfig -->   Filesystem images的配置

11.  儲存之後,make rootfs-tiny4412_ext4 就生成我們自己的檔案系統了。用tiny4412的SD卡燒錄進去,是可以boot起來的,對S00_tiny4412腳本進行進一步裁剪後,我們可以得到一個在tiny4412開發闆上最小的能boot起來的Linux系統。

繼續閱讀