一、开发环境

  1. 嵌入式 Linux 开发板:100ASK-6ULL-V11(即:由百问网出品的 i.MX6ULL-PRO);
  2. 系统:Ubuntu 18.04(已配置交叉编译工具链);
  3. 待移植的 Linux 内核:由 NXP 官方维护的 imx_5.4.47_2.2.0

二、下载 Buildroot 源码

可以使用以下命令:

wget https://buildroot.org/downloads/buildroot-2023.02.3.tar.gz
tar -xvf buildroot-2023.02.3.tar.gz
cd buildroot-2023.02.3

三、使用 Buildroot 构建根文件系统

1. 配置 Buildroot

直接使用图形化界面配置即可,总体流程较为简单。

执行命令make menuconfig打开图形化配置界面:

配置Target options

Target Architecture (ARM (little endian))  --->  // CPU 为小端模式
Target Architecture Variant (cortex-A7)  --->
Target ABI (EABIhf)  --->
Floating point strategy (NEON/VFPv4)  --->  // 查阅 i.MX6ULL 芯片手册
ARM instruction set (ARM)  --->
Target Binary Format (ELF)  --->

配置Toolchain

Toolchain type (External toolchain)  --->
    *** Toolchain External Options ***
    Toolchain (Custom toolchain)  --->
    Toolchain origin (Pre-installed toolchain)  --->
(/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot) Toolchain
($(ARCH)-buildroot-linux-gnueabihf) Toolchain prefix
    External toolchain gcc version (7.x)  --->
    External toolchain kernel headers series (4.9.x)  --->
    External toolchain C library (glibc)  --->
[*] Toolchain has SSP support? (NEW)
[*]   Toolchain has SSP strong support? (NEW)
[*] Toolchain has RPC support? (NEW)
[*] Toolchain has C++ support?
[ ] Toolchain has D support? (NEW)
[ ] Toolchain has Fortran support? (NEW)
[ ] Toolchain has OpenMP support? (NEW)
[ ] Copy gdb server to the Target (NEW)
    *** Host GDB Options ***
[ ] Build cross gdb for the host
    *** Toolchain Generic Options ***
[ ] Copy gconv libraries
()  Extra toolchain libraries to be copied to target
()  Target Optimizations
()  Target linker options

在设置Toolchain prefix时,需要删除原有的内容,此时应该使用Ctrl+退格键,直接使用退格键是无效的。

配置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  --->
[*] remount root filesystem read-write during boot
()  Network interface to configure through DHCP
(/bin:/sbin:/usr/bin:/usr/sbin) Set the system's default PATH
[*] Purge unwanted locales
(C en_US) Locales to keep
()  Generate locale data

其中[*] Run a getty (login prompt) after boot项需要单独设置终端和波特率:

--- Run a getty (login prompt) after boot                                                      │ │
(console) TTY port                                                                             │ │
      Baudrate (115200)  --->                                                                  │ │
(vt100) TERM environment variable                                                              │ │
()    other options to pass to getty 

配置 Filesystem images

由于后续是通过由 NXP 官方提供的工具 Mfgtool 来将根文件系统烧写到开发板上的 eMMC 或 SD 卡中,因此我们无需通过 Buildroot 对根文件系统进行打包,这里简单配置一下文件系统的格式即可,修改ext2/3/4 root filesystem项:

[*] ext2/3/4 root filesystem
      ext2/3/4 variant (ext4)  --->

禁止编译 U-Boot 和 Linux 内核

由于 Buildroot 自动下载的 U-Boot 和 Linux 内核源码来自于官方仓库,里面会缺少很多适配 i.MX6ULL 开发板的驱动文件,因此我们选择自行编译 U-Boot 和 Linux 内核,具体步骤可参考“i.MX6ULL 开发板系统移植与根文件系统构建”系列文章:U-Boot 的移植Linux 内核的移植

我们确保Kernel项中的Linux KernelBootloaders项中的U-Boot未被选中即可。

2. 编译 Buildroot

sudo make

在编译过程中需要下载较多文件,如果遇到下载失败的情况,可以根据对应网址手动下载文件至./dl目录后重新尝试编译。

3. 通过 NFS 挂载根文件系统

mkdir ~/nfs_rootfs/buildrootfs/
cp output/images/rootfs.tar ~/nfs_rootfs/buildrootfs/
cd ~/nfs_rootfs/buildrootfs/
tar -xvf rootfs.tar 
rm -rf rootfs.tar

这样的话,我们构建的根文件系统就在目录~/nfs_rootfs/buildrootfs/里啦:

之后启动U-Boot,根据实际情况设置环境变量bootargs

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=10.10.10.30:/home/book/nfs_rootfs/buildrootfs,v3,tcp rw ip=10.10.10.31:10.10.10.30:10.10.10.10:255.255.0.0::eth0:off'
saveenv

通过 TFTP 下载 Linux 内核和设备树:

tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-angus.dtb
bootz 80800000 - 83000000

就可以成功启动啦!

完工!

可以发现,此时的终端不会显示当前用户名、主机名、路径等信息,且命令开头是#而不是常用的$,我们可以通过配置PS1环境变量来解决,关于PS1环境变量的详细配置可以参考 linux shell中环境变量$PS1详解。修改文件/etc/profile为:

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] 正点原子【第三期】手把手教你学Linux之系统移植和根文件系统构建篇

[2] 使用buildroot2022.02.06制作根文件系统

最后修改:2023 年 07 月 29 日
如果觉得我的文章对你有用,请随意赞赏