Buildroot的Rootfs构建流程有一个大框架,有些部分是Buildroot系统做好的,有些细节需要自己来实现,Rootfs也是Buildroot中最为复杂的部分。
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环境中执行。
清楚流程后可以在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中的所有软件默认都被当做应用编译和install到output/target/目录下。
Figure9 menuconfig --> Filesystem images的配置
11. 保存之后,make rootfs-tiny4412_ext4 就生成我们自己的文件系统了。用tiny4412的SD卡烧录进去,是可以boot起来的,对S00_tiny4412脚本进行进一步裁剪后,我们可以得到一个在tiny4412开发板上最小的能boot起来的Linux系统。