buildroot官方教材
buildroot官方的教程training
内核头文件版本
在工具链菜单中有一个重要的选项是:内核的头文件版本。
当我们构建一个用户空间的程序,库或是C库时,通过使用内核头文件来提供与内核的接口。
该接口是向后兼容的,但也能引入新的特性。
所以使用的内核头文件的版本必须与硬件运行的内核的版本相同或者更老一点。
管理Linux内核配置
Linux内核本身使用kconfig来定义它的配置。
Buildroot的menuconfig中并不能复制所有的Linux内核配置选项,所以需要通过其它的方式来定义Linux内核配置。
在menuconfig中的Kernel菜单中选择内核版本后,你可以通过如下的几种方式来定义内核配置:
- 使用一个defconfig文件
a. 将使用内核源码提供的defconfig
b. 在内核源码中的arch/< ARCH >/configs中
c. Buildroot使用时不会修改该文件
d. 使用defconfig的方式,是一种很好的开始的点。 - 使用自定义的config文件
a. 可以通过给定.config或者defconfig文件的路径
b. 通常在你需要进行自定义配置时使用 - 额外的碎片文本
a. 也可以通过一些配置文件的碎片文本进行传递
b. 可以作为配置选项的补充或者覆盖
运行一个Linux内核配置的命令如下:
make linux-menuconfig
make linux-nconfig
make linux-xconfig
make linux-gconfig
只有如下的文件夹中的内容将发生改变:
$(O)/build/linux-< version >/
该内容可以通过clean命令清除。
使用如下的命令来保存这些配置:- make linux-update-config,保存一个config文件。
- make linux-update-defconfig,保存一个最小化的defconfig文件。
- 只有在使用自定义配置文件时,上述的文件才能生效。
典型的流程如下:
make < tuple >_defconfig
,使用defconfig文件来扩展出一个完整的.config文件。make menuconfig
,配置对应的构建系统,包括工具链、bootloader、内核系统等。- 执行
make
开始构建系统。 - 如果在menuconfig中配置了内核映像,则可以运行:
make linux-menuconfig
来自定义内核配置。 - 执行
make linux-update-defconfig
保存最小化的defconfig配置文件,在$(O)/build/linux-< version >/中。 - 执行
make
生成linux映像。在$(O)/images/中。
以下是本人生成一个qemu_ppc_mpc8544ds(qemu的PowerPC mpc8544ds板卡虚拟机)的Linux映像的操作步骤:
我的Buildroot目录为:~/LinuxEmbedded/buildroot/buildroot;
生成目录为:~/LinuxEmbedded/buildroot/buildroot_output。
cd ~/LinuxEmbedded/buildroot/buildroot_output
make -C ../buildroot O=$(pwd) qemu_ppc_mpc8544ds_defconfig
make -C ../buildroot O=$(pwd) menuconfig
make
make linux-menuconfig
make linux-update-defconfig
make
根文件系统
创建一个根文件系统的整体步骤如下:
根文件系统的骨架
所有的目标硬件的包都依赖于骨架的包,所以首先最关键的步骤就是复制根文件系统的骨架到$(TARGET_DIR)文件夹。
骨架(skeleton)是一个虚拟包,依赖于选择的初始化系统的skeleton-init-{ sysv, systemd, none },而skeleton-init-{ sysv, systemd, none }又依赖于skeleton-custom。
通过配置BR2_ROOTFS_SKELETON_CUSTOM和BR2_ROOTFS_SKELETON_CUSTOM_PATH选项可以使用自定义的骨架。
因为skeleton-init-*文件被替换掉了,所以自定义的骨架必须要提供所有的数据,Buildroot不推荐使用自定义的骨架。因为自带的基本骨架已经能满足绝大多数的工程的需求了,此外还需要自定义根文件系统覆盖和构建后处理的脚本。
骨架包的依赖结构如下:
安装包,所有选择的目标包都会被构建,大多数都安装在$(TARGET_DIR)文件夹中,包括:程序,库,字体,数据文件,配置文件等。
详细的过程参考,创建你自己的Buildroot包的章节。
清理步骤,该步骤是为了减小根文件系统的大小,主要包括:删除头文件,pkg-config文件,CMake文件,静态库,文档文件,等;(BR2_ENABLE_DEBUG和BR2_STRIP_*选项)剥离所有程序和库的封装,移除不需要的信息;清理不需要的Python文件(TARGET_FINALIZE_HOOKS)。
根文件系统覆盖,可以自定义你自己的根文件系统,增加配置文件、脚本、链接符号、文件夹或其它的文件等。根文件系统的覆盖为一个独立的文件夹,其文件内容将覆盖原有的根文件系统。BR2_ROOTFS_OVERLAY包括了独立空间的覆盖文件夹的路径。
如在.config文件中设置选项BR2_ROOTFS_OVERLAY,为:
BR2_ROOTFS_OVERLAY="board/myproject/rootfs-overlay"
构建后处理脚本,某些时候,仅仅使用根文件覆盖并不能满足我们的需求,此时可以使用构建后处理脚本,来动态的生成新的文件,覆盖已经存在的文件或清除不需要的文件。 BR2_ROOTFS_POST_BUILD_SCRIPT选项中定义了脚本的路径(独立的空间)。
脚本的第一个参数为:$(TARGET_DIR),其它的参数可以通过BR2_ROOTFS_POST_SCRIPT_AGS选项传递。
如下为一个构建后处理的脚本示例(路径为:board/myproject/post-build.sh):
#!/bin/sh
TARGET_DIR=$1
BOARD_DIR=board/myproject/
# Generate a file identifying the build (git commit and build date)
echo $(git describe) $(date +%Y-%m-%d-%H:%M:%S) > \
$TARGET_DIR/etc/build-id
# Create /applog mountpoint, and adjust /etc/fstab
mkdir -p $TARGET_DIR/applog
grep -q "^/dev/mtdblock7" $TARGET_DIR/etc/fstab || \
echo "/dev/mtdblock7\t\t/applog\tjffs2\tdefaults\t\t0\t0" >> \
$TARGET_DIR/etc/fstab
# Remove unneeded files
rm -rf $TARGET_DIR/usr/share/icons/bar
Buildroot的配置为:
BR2_ROOTFS_POST_BUILD_SCRIPT="board/myproject/post-build.sh"
生成文件系统映像
在Filesysem images菜单中,可以选择生成核中格式的文件映像。
为了生成这些映像,Buildroot将生成一个shell脚本:更改所有文件的Owner权限为root用户;为全局和单个包生成一个用户权限表;运行文件系统映像生成工具。
该脚本通过fakeroot的工具执行。
权限表
默认所有文件的所有者为root用户,并保持其安装在$(TARGET_DIR)中的权限。
可以通过创建一个或者几个权限表来自定义文件的所有者和安装文件的权限。
选项BR2_ROOTFS_DEVICE_TABLE中定义了这些权限表文件的路径。
默认的权限列表文件为system/device_table.txt。
设备列表
当系统使用静态/dev时,可能需要创建额外的设备节点。
可以使用一个或者几个设备列表文件。
BR2_ROOTFS_STATIC_DEVICE_TABLE选项包含一个以空格分隔的设备表文件列表。
默认的设备列表文件为system/device_table_dev.txt。
每个包也可以指定自己专有的设备文件。
用户列表
可以通过BR2_ROOTFS_USERS_TABLES选项来指定特殊的用户列表的路径,用来添加一些特殊的Unix用户和组。
生成映像后处理脚本
一旦生成所有的文件系统的映像后,将会调用一个post-image脚本。用来:提取根文件系统来执行NFS引导;生成最终的固件映像;启动烧写Flash的过程。
BR2_ROOTFS_POST_IMAGE_SCRIPT定义了脚本文件的路径。
第一个参数为$(BINARIES_DIR),可以通过e BR2_ROOTFS_POST_SCRIPT_ARGS来指定其它的参数。