17. Buildroot根文件系统的构建

17.1. 什么是Buildroot?

Buildroot是Linux平台上一个开源的嵌入式Linux系统自动构建框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件。

17.2. 安装一些依赖文件

1
sudo apt-get install zlib1g-dev unzip gcc g++ aptitude lib32stdc++6-4.8-dbg make build-essential libncurses5 libncurses5-dev u-boot-tools traceroute -y

17.3. 安装交叉编译工具链

可以到官网下载 https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/ 也可以使用我们提供的工具包 交叉编译器下载 找一个自己熟悉的位置放置,我放在 /home/lhf 文件夹下 解压 tar -vxf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar

未找到图片arm1

进入工具链文件夹 gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf 获取路径 pwd 我的路径为 /home/lhf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf 该路径需要记录一下,等会设置工具链的时候需要使用

1
2
3
cd gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
pwd
/home/lhf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf

17.4. Buildroot构建

我们可以到官网地址下:https://buildroot.org/ 打开后如图

选择DOWNLOAD

未找到图片1

我们选择长期支持版本(LTS),两个压缩格式,选择其中一个即可

未找到图片2

也可使用我们提供的源码包 Buildroot下载 构建根文件系统

1
2
3
tar -vxf buildroot-2021.02.3.tar.gz
cd buildroot-2021.02.3
make menuconfig

17.4.1. 配置Target options

1
2
3
4
5
6
7
Target options
        -> Target Architecture = ARM (little endian)
        -> Target Binary Format = ELF
        -> Target Architecture Variant = cortex-A7
        -> Target ABI = EABIhf
        -> Floating point strategy = NEON/VFPv4
        -> ARM instruction set = ARM
未找到图片

17.4.2. 配置Toolchain

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Toolchain
   -> Toolchain type = External toolchain
   -> Toolchain = Custom toolchain //选择用户的交叉编译器
   -> Toolchain origin = Pre-installed toolchain
   -> Toolchain path =/home/lhf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf //这里填入我们上面获得的交叉编译器路径
   -> Toolchain prefix = arm-linux-gnueabihf //前缀
   -> External toolchain gcc version = 7.x
   -> External toolchain kernel headers series = 4.10.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) //选中
未找到图片toolchain

17.4.3. 配置System configuration

1
2
3
4
5
6
7
System configuration
   -> System hostname = Embedfire_imx6ull //平台名字
   -> System banner = Welcome to embedfire i.mx6ull //欢迎语
   -> Init system = BusyBox //使用 busybox
   -> /dev management = Dynamic using devtmpfs + mdev //使用 mdev
   -> [*] Enable root login with password (NEW) //使能登录密码
   -> Root password = root //登录密码为 root
未找到图片system

17.4.4. 配置Filesystem images

这个选项是配置将编译生成什么格式的根文件系统,可以做如下配置

1
2
3
4
-> Filesystem images
   -> [*] ext2/3/4 root filesystem //如果是 EMMC 或 SD 卡的话就用 ext3/ext4
      -> ext2/3/4 variant = ext4 //选择 ext4 格式
-> [*] ubi image containing an ubifs root filesystem //如果使用 NAND 的话就用 ubifs

对于本教程,我们需要配置也可以。我们是使用nfs挂载网络根文件系统

未找到图片

17.4.5. 关闭kernel和uboot的编译

Buildroot不仅能构建根文件系统,还可以编译kernel和uboot,但是这些源码是从官网下载的,很可能是没包含各芯片厂商的驱动文件。所以我们关闭kernel和uboot编译即可,kernel和uboot的教程可参考

《kernel编译》

《uboot编译》

1
2
-> Kernel
-> [ ] Linux Kernel //取消 Linux Kernel 选项!
未找到图片
1
2
-> Bootloaders
-> [ ] U-Boot //取消 U-Boot 选项!
未找到图片

17.4.6. 编译Buildroot

执行 sudo make

1
sudo make

需要注意的是buildroot下载的源码网速会比较慢,我们可以自己手动下载再放到buildroot源码目录下的 dl 文件夹中

编译完成后文件在 ./output/images 文件夹中 rootfs.tar 为本教程需要的文件

未找到图片

17.5. 搭建NFS网络系统

先更新一下apt包 sudo apt-get update

1
sudo apt-get update

安装 NFS服务器端 sudo apt-get install nfs-kernel-server

1
sudo apt-get install nfs-kernel-server

创建NFS共享目录 mkidr ~/nfs

1
mkidr ~/nfs

编辑指定目录 sudo vim /etc/exports

1
sudo vim /etc/exports

添加入下代码 /home/你的用户名/nfs *(rw,sync,no_root_squash)

1
/home/你的用户名/nfs *(rw,sync,no_root_squash)
未找到图片exoirts

给目录添加权限 sudo chmod -R 777 ~/nfs && sudo chown root:root ~/nfs/ -R

1
sudo chmod -R 777 ~/nfs && sudo chown root:root ~/nfs/ -R

启动 NFS 服务 /etc/init.d/nfs-kernel-server restart

1
/etc/init.d/nfs-kernel-server restart
未找到图片

如图就是启动成功了

我们把刚得到的rootfs.tar 解压到nfs目录下

1
2
cp /home/lhf/buildroot-2021.02.3/output/images/rootfs.tar /home/lhf/nfs
tar -vxf /home/lhf/nfs/rootfs.tar -C /home/lhf/nfs

先看一下我们NFS主机的地址 ifconfig 我这里地址为 192.168.0.139

未找到图片zhujiip

再看一下网关地址 traceroute baidu.com 第一条地址一般为网关地址,我这里为 192.168.0.1

未找到图片ipway

我们在局域网中找一个没有用到的地址,我这里为 192.168.0.142 要根据你们的网段来更改 **192.168.0**的部分

未找到图片errip

没有ping通,很大概率没有设备在使用这个地址 192.168.0.142

17.6. 设置Uboot环境参数

上电快速按回车进入Uboot

1
2
3
4
5
6
setenv gatewayip '192.168.0.1'
setenv netmask '255.255.255.0'
setenv ipaddr '192.168.0.142'
setenv serverip '192.168.0.139'
setenv args_mmc_old 'setenv bootargs console=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.0.139:/home/lhf/nfs rw ip=192.168.0.142:192.168.0.139:192.168.0.254:255.255.255.0::eth0:off'
saveenv

我们试一下开发板能否ping通到主机 ping 192.168.0.139

未找到图片pingzhuji

发现可以ping的通,我们试试能否自动挂载上我们的根文件系统用命令 reset 重启

未找到图片loding

这样就成功挂载上我们的根文件系统了。账号密码都为 root

我们发现我们的命令行在任何目录下都是 # 修改 **/etc/profile**文件来让其显示具体路径

1
vi /etc/profile

做如图修改

未找到图片lujingxiugai
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
PS1='\u@\h:\w$:'
export PS1
export EDITOR='/bin/vi'
# Source configuration files from /etc/profile.d
for i in /etc/profile.d/*.sh ; do
      if [ -r "$i" ]; then
               . $i
      fi
done
unset i

然后重启即可

1
reboot

如图

未找到图片lujky