一、开发环境
- 嵌入式 Linux 开发板:100ASK-6ULL-V11(即:由百问网出品的 i.MX6ULL-PRO);
- 系统:Ubuntu 18.04(已配置交叉编译工具链);
- 待移植的 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 Kernel
和Bootloaders
项中的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 条评论
怎么收藏这篇文章?