Busybox构建的根文件系统只有一些常用的命令和文件。
Buildroot不仅集成了 busybox,而且还集成了各种常见的第三方库和软件。
Buildroot 版本:buildroot-2019.02.6.tar.gz
虚拟机:#44~20.04.1-Ubuntu
交叉编译器:arm-linux-gnueabihf-gcc (Linaro GCC 4.9-2017.01) 4.9.4
Linux 内核:linux-4.15
官网地址为:Buildroot - Making Embedded Linux Easy,网页打开后如下图所示:
点击DOWNLOAD进入下载界面,如下图所示:
对于每个版本的源码都有两种压缩格式可下载,选择其一下载即可。此次我才用以前已经下载好的源码进行构建:2019.02.6版本
使用如下命令进行解压:
tar -vxjf buildroot-2019.02.6.tar.bz2
解压完成后文件如下图所示:
使用命令,打开图形化界面
make menuconfig
输入make menuconfig命令配置,如果出现如下错误:
- make[2]: *** [Makefile:253:/home/zyc/linux/tools/buildroot-2019.02.6/output/build/buildroot-config/dochecklxdialog] 错误 1
- make[1]: *** [Makefile:926:/home/zyc/linux/tools/buildroot-2019.02.6/output/build/buildroot-config/mconf] 错误 2
- make: *** [Makefile:84:_all] 错误 2
错误的原因:由于是新安装的ubuntu虚拟机,没有安装配置界面相关的库。
解决方法:sudo apt-get install libncurses-dev
- Target options
- -> Target Architecture = ARM (little endian) //目标架构,ARM小端模式
- -> Target Binary Format = ELF //二进制文件格式ELF
- -> Target Architecture Variant = cortex-A7 //I.MX6ULL是cortex-A7架构
- -> Target ABI = EABIhf //应用程序二进制结构为EABIhf
- -> Floating point strategy = NEON/VFPv4 //浮点运算策略
- -> ARM instruction set = ARM //arm 汇编指令集,选择为 ARM 指令集
此配置项用于配置交叉编译工具链,也就是交叉编译器。
- Toolchain
- -> Toolchain type = External toolchain
- -> Toolchain = Custom toolchain //用户自己的交叉编译器
- -> Toolchain origin = Pre-installed toolchain //预装的编译器
- -> Toolchain path =/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf
- -> Toolchain prefix = $(ARCH)-linux-gnueabihf //前缀
- -> External toolchain gcc version = 4.9.x
- -> External toolchain kernel headers series = 4.1.x
- -> External toolchain C library = glibc/eglibc
- -> [*] Toolchain has SSP support? (NEW) //选中
- -> [*] Toolchain has RPC support? (NEW) //选中
- -> [*] Toolchain has C++ support? //选中
- -> [*] Enable MMU support (NEW) //选中
此选项用于设置一些系统配置,比如开发板名字、欢迎语、用户名、密码等。需要配置的
项目和其对应的内容如下:
- System configuration
- -> System hostname = buildroot //平台名字,自行设置
- -> System banner = Welcome to buildroot //欢迎语
- -> Init system = BusyBox //使用 busybox
- -> /dev management = Dynamic using devtmpfs + mdev //使用 mdev
- -> [*] Enable root login with password (NEW) //使能登录密码
- -> Root password = 123456 //登录密码为 123456
此选项配置我们最终制作的根文件系统为什么格式的,配置如下:
- -> Filesystem images
- -> [*] ext2/3/4 root filesystem //如果是 EMMC 或 SD 卡的话就用 ext3/ext4
- -> ext2/3/4 variant = ext4 //选择 ext4 格式
- -> Kernel
- -> [ ] Linux Kernel //不要选择编译 Linux Kernel 选项!
- -> Bootloaders
- -> [ ] U-Boot //不要选择编译 U-Boot 选项!
通过一下命令开始编译buildroot源码
sudo make
输入 sudu make 命令配置,如果出现如下错误:
- You must install 'python' on your build machine
- make: *** [support/dependencies/dependencies.mk:27:dependencies] 错误 1
解决方法:sudo apt-get install python
- configure: error: you should not run configure as root (set FORCE_UNSAFE_CONFIGURE=1 in environment to bypass this check)
- See `config.log' for more details
- make: *** [package/pkg-generic.mk:231:/home/zyc/linux/tools/buildroot-2019.02.6/output/build/host-tar-1.29/.stamp_configured] 错误 1
解决方法:修改顶层Makefile,加入环境变量
export FORCE_UNSAFE_CONFIGURE=1
编译结束后如下所示,rootfs.tar就是打包好的根文件系统。
在nfs目录下创建buildrootfs文件夹,并将rootfs.tar拷贝并解压,最后删除rootfs.tar,如下图所示:
buildroot 根文件系统测试
启动 uboot,修改 bootargs 环境变量,设置 nfsroot 目录为 Ubuntu 中的buildrootfs 目录,命令如下:
bootargs=console=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.107:/home/zyc/linux/nfs/buildrootfs rw ip=192.168.1.99:192.168.1.107:192.168.1.1:255.255.255.0::eth0:off
log信息提示/lib/modules不存在,因此需要手动创建。
buildroot 构建的根文件系统启动以后会输出我们前面设置的欢迎语“Welcome to Buildroot”。然后需要输入用户名和密码,用户名是“root”,密码就是我们前面配置 buildroot 的时候设置“123456”。
可以看出的 buildroot 构建的根文件系统运行基本没有问题,剩下的就是根据自己的需求使能第三方软件。
buildroot构建根文件系统是基于busybox的,因此也需要对busybox进行相应的配置。其中busybox的压缩包是buildroot自动下载的,如图所示:
所有解压缩的源码位于/output/build/busybox-1.29.3目录中:
下面开始进行busybox的配置,在buildroot目录下输入以下命令,打开图形化配置界面:
sudo make busybox-menuconfig
① 选项“Build static binary (no shared libs)”用来决定是静态编译 busybox 还是动态编译,静
态编译的话就不需要库文件,但是编译出来的库会很大。此处不选中静态编译。
- Location:
- -> Settings
- -> Build static binary (no shared libs)
② 继续配置以下配置项
- Location:
- -> Settings
- -> vi-style line editing commands
③ 继续配置如下路径配置项:
- Location:
- -> Linux Module Utilities
- -> Simplified modutils
④ 继续配置
- Location:
- -> Linux System Utilities
- -> mdev (16 kb) //确保下面的全部选中,默认都是选中的
⑤ 最后就是使能 busybox 的 unicode 编码以支持中文,配置路径如下:
- Location:
- -> Settings
- -> Support Unicode //选中
- -> Check $LC_ALL, $LC_CTYPE and $LANG environment variables //选中
打开文件 /libbb/printable_string.c,找到函数 printable_string,缩减后的函数内容如下:
接着打开文件 /libbb/unicode.c,找到如下内容:
配置完后需要重新编译busybox,命令如下:
sudo make busybox
最后编译buildroot,对busybox进行打包:
sudo make
最后我们使用新的 rootfs.tar,解压到nfs目录下,启动 Linux 系统。
我们使用构建的根文件系统启动以后会发现,输入命令的时候命令行前面一直都是“#”,如果我们进入到某个目录的话前面并不会显示当前目录路径。
首先了解PS1 用于设置命令提示符格式,格式如下:
PS1 = ‘命令列表’
命令列表中可选的参数如下:
- \! 显示该命令的历史记录编号。
- \# 显示当前命令的命令编号。
- \$ 显示$符作为提示符,如果用户是 root 的话,则显示#号。
- \\ 显示反斜杠。
- \d 显示当前日期。
- \h 显示主机名。
- \n 打印新行。
- \nnn 显示 nnn 的八进制值。
- \s 显示当前运行的 shell 的名字。
- \t 显示当前时间。
- \u 显示当前用户的用户名。
- \W 显示当前工作目录的名字。
- \w 显示当前工作目录的路径
随后修改一下文件/etc/profile:
添加内容如下:
- PS1='[\u@\h]:\w$:'
- export PS1
/etc/profile 文件修改完成以后重启开发板,这个时候我们就如到某个目录的时候命令行就
会有提示,如图所示:
命令提示符显示正常了,完整的显示除了用户名、主机名和当前路径。至此, buildroot 构建根文件系统就已经全部完成了。第三方软件使能可以根据自己的实际需求。