文章目录
简介
引用自维基百科:
Buildroot是一组Makefile和Patch文件,用来简化和自动化为嵌入式系统建造一个完整和可引导的Linux环境的过程,特别是在使用交叉编译来允许在单一的基于Linux的开发系统上为多个目标平台进行建造的时候。Buildroot可以自动建造所需要的交叉编译工具链,创建根文件系统,编译一个Linux内核映像,并为目标嵌入式系统生成引导装载器,它还可以进行这些独立步骤的任何组合。例如可以独立的使用已经安装好的交叉编译工具链,而只用Buildroot创建根文件系统。
之前用busybox构建根文件系统时,并不能达到完全自动化,即使配置、编译结束后,任然有一部分工作需要做,而有了buildroot这个更加强大的工具后,在经过配置、编译两个步骤后,一个可以直接烧录的根文件系统镜像就制作好了,除此之外,它还可以配置、编译内核、u-boot等超级多的第三方包。
构建过程
buildroot包下载
首先在官网下载buildroot工具包,下载链接:https://buildroot.org/
可以看到有最新的稳定版和一个最新的长期支持版,选哪个都可以:
配置
和内核一样,都是通过menuconfig就可以进行配置,非常的直观,解压并配置,所有我没贴出来的项均使用了默认配置:
tar -xf buildroot-2021.11.tar.gz
cd buildroot-2021.11
make menuconfig
Target options配置项
此配置项需要根据自己的soc架构来进行配置,我这里是s5pv210的配置:
Target Architecture (ARM (little endian)) ---> # 大小端
Target Binary Format (ELF) ---> # 目标二进制格式
Target Architecture Variant (cortex-A8) ---> # soc架构
Target ABI (EABI) ---> # 应用二进制接口,可根据使用的交叉编译工具链配置
Floating point strategy (Soft float) ---> # 浮点支持
ARM instruction set (ARM) ---> # 使用哪种指令集
Build options配置项
在这个配置项中,我将镜像下载源站全部改成了国内源,这样下载包的时候就非常快。
Mirrors and Download locations ---> # 镜像下载地址
() Primary download site
(http://sources.buildroot.net) Backup download site
(https://mirror.bjtu.edu.cn/kernel/) Kernel.org mirror
(http://mirrors.nju.edu.cn/gnu/) GNU Software mirror
(https://luarocks.cn) LuaRocks mirror
(http://mirrors.nju.edu.cn/CPAN/) CPAN mirror (Perl packages)
Toolchain配置项
这里因为我本地已经下载了交叉编译工具链(https://releases.linaro.org/components/toolchain/binaries/),所以不让buildroot下载:
Toolchain type (External toolchain) ---> # 选择使用本地交叉编译工具链还是buildroot自己下载
*** Toolchain External Options ***
Toolchain (Custom toolchain) --->
Toolchain origin (Pre-installed toolchain) --->
(/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi) Toolchain path # 指定工具链的路径,注意没有/bin/
($(ARCH)-linux-gnueabi) Toolchain prefix # 交叉编译器前缀
External toolchain gcc version (7.x) ---> # 交叉编译器版本
External toolchain kernel headers series (4.10.x) ---> # 这里在如果选得不对,在编译的时候会给出提示,到时候再修改即可;或者看帮助,在交叉编译工具链目录找linux/version.h文件可以得到
External toolchain C library (glibc/eglibc) ---> # 选择使用的C库
[*] Toolchain has SSP support?
[*] Toolchain has SSP strong support?
[*] Toolchain has RPC support?
[*] Toolchain has C++ support?
这一步在编译时遇到了一个坑,不能使用apt-get install
安装交叉编译工具链,不然会报一个重定位的错。
System configuration配置项
Root FS skeleton (default target skeleton) --->
(buildroot) System hostname
(Welcome to Buildroot) System banner
Passwords encoding (sha-256) --->
Init system (BusyBox) --->
/dev management (Dynamic using devtmpfs + mdev) ---> # 与内核事件通知相关,一般选择使用的此选项
(system/device_table.txt) Path to the permission tables
[ ] support extended attributes in device tables
[ ] Use symlinks to /usr for /bin, /sbin and /lib
[*] Enable root login with password # 是否使能登录密码
() Root password # 设置登录密码
/bin/sh (busybox' default shell) --->
[*] Run a getty (login prompt) after boot --->
在使用nfs
挂载制作好的根文件系统时,这里遇到了一个坑,我这里明明设置的没有登录密码,但进入系统后,一直重复让输入用户名和密码,而且怎么输都不对,就算是通过修改inittab
文件进入了系统,也会发现很多目录没有访问权限,后面发现是因为主机nfs
服务器的配置问题:
sudo vim /etc/exports
# 一定要增加no_root_squash选项,与root_squash对应
/srv/nfs *(rw,sync,no_subtree_check,no_root_squash)
# 重启nfs服务
sudo systemctl restart nfs-kernel-server.service
Kernel配置项
我不编译内核,所以默认关闭。
Target packages配置项
此选项可使用默认配置,根据需求裁剪。
Filesystem images配置项
[*] ext2/3/4 root filesystem # 是否生成可烧录镜像
ext2/3/4 variant (ext4) ---> # 镜像格式
编译
这一步就很简单了,直接执行make
即可,等待编译完成,查看生成的根文件系统镜像:
ls output/images/
rootfs.ext2 rootfs.ext4 rootfs.tar
至此,一个可用的根文件系统就构建完成了。