首页 > 代码库 > Buildroot构建指南——根文件系统(Rootfs)

Buildroot构建指南——根文件系统(Rootfs)

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)$@  $(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中的所有软件默认都被当做应用编译和installoutput/target/目录下。

技术分享

Figure9 menuconfig -->   Filesystem images的配置

11.  保存之后,make rootfs-tiny4412_ext4 就生成我们自己的文件系统了。用tiny4412的SD卡烧录进去,是可以boot起来的,对S00_tiny4412脚本进行进一步裁剪后,我们可以得到一个在tiny4412开发板上最小的能boot起来的Linux系统。

Buildroot构建指南——根文件系统(Rootfs)