LV05-03-根文件系统-03-buildroot-02-构建根文件系统
本文主要是使用buildroot构建根文件系统的相关笔记。若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows版本 | windows11 |
Ubuntu版本 | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
终端软件 | MobaXterm(Professional Edition v23.0 Build 5042 (license)) |
Linux开发板 | 正点原子 i.MX6ULL Linux 阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
Win32DiskImager | Win32DiskImager v1.0 |
点击查看本文参考资料
分类 | 网址 | 说明 |
官方网站 | https://www.arm.com/ | ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档 |
https://www.nxp.com.cn/ | NXP官方网站 | |
https://www.nxpic.org.cn/ | NXP 官方社区 | |
https://u-boot.readthedocs.io/en/latest/ | u-boot官网 | |
https://www.kernel.org/ | linux内核官网 |
点击查看相关文件下载
分类 | 网址 | 说明 |
NXP | https://github.com/nxp-imx | NXP imx开发资源GitHub组织,里边会有u-boot和linux内核的仓库 |
https://elixir.bootlin.com/linux/latest/source | 在线阅读linux kernel源码 | |
nxp-imx/linux-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga | NXP linux内核仓库tags中的rel_imx_4.1.15_2.1.0_ga | |
nxp-imx/uboot-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga | NXP u-boot仓库tags中的rel_imx_4.1.15_2.1.0_ga | |
I.MX6ULL | i.MX 6ULL Applications Processors for Industrial Products | I.MX6ULL 芯片手册(datasheet,可以在线查看) |
i.MX 6ULL Applications ProcessorReference Manual | I.MX6ULL 参考手册(下载后才能查看,需要登录NXP官网) |
一、构建根文件系统
1. 打开配置界面
buildroot 和 uboot、 Linux kernel 一样也支持图形化配置,输入如下命令即可打开图形化配置界:
1 | make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig |
然后就会打开图形配置界面,如下所示:
2. 配置buildboot
2.1 配置 Target options
首先配置 Target options 选项,需要配置的项目和其对应的内容如下(“=”号后面是配置项要选择的内容 ):
1 | Target options |
如下图所示:
2.2 配置 Toolchain
此配置项用于配置交叉编译工具链,也就是交叉编译器,这里设置为我们自己所使用的交叉编译器即可。 buildroot 其实是可以自动下载交叉编译器的,但是都是从国外服务器下载的,鉴于国内的网络环境,强烈建议设置成自己所使用的交叉编译器。需要配置的项目和其对应的内容如下:
1 | Toolchain |
Toolchain 下几个比较重要的选项需要说明一下,如下所示:
Toolchain:设置为 Custom toolchain,表示使用用户自己的交叉编译器。
Toolchain origin:设置为 Pre-installed toolchain,表示使用预装的交叉编译器。
Toolchain path:设置自己安装的交叉编译器绝对路径! buildroot 要用到。
Toolchain prefix:设置交叉编译器前缀,要根据自己实际所使用的交叉编译器来设置,比如我们使用的是 arm-linux-gnueabihf-gcc,因此前缀就是$(ARCH)-linux-gnueabihf,其中 ARCH我们前面已经设置为了 arm。
2.3 配置 System configuration
此选项用于设置一些系统配置,比如开发板名字、欢迎语、用户名、密码等。需要配置的项目和其对应的内容如下:
1 | System configuration |
在 System configuration 选项中可以配置平台名字,登录密码等信息。
2.4 配置 Filesystem images
此选项配置我们最终制作的根文件系统为什么格式的,配置如下:
1 | Filesystem images |
对于 I.MX6U 来说此选项不用配置,因为我们是通过 Mfgtool 工具将根文件系统烧写到开发板上的 EMMC/SD 卡中,烧写的时候需要自己对根文件系统进行打包。
2.5 禁止编译 Linux 内核和 uboot
buildroot 不仅仅能构建根文件系统,也可以编译 linux 内核和 uboot。当配置 buildroot,使能 linux 内核和 uboot 以后 buildroot 就会自动下载最新的 linux 内核和 uboot 源码并编译。但是我们一般都不会使用 buildroot 下载的 linux 内核和 uboot,因为 buildroot 下载的 linux 和 uboot官方源码,里面会缺少很多驱动文件,而且最新的 linux 内核和 uboot 会对编译器版本号有要求,可能导致编译失败。因此我们需要配置 buildroot,关闭 linux 内核和 uboot 的编译,只使用buildroot 来构建根文件系统, 首先是禁止 Linux 内核的编译, 配置如下:
1 | Kernel |
2.6 配置 Target packages
此选项用于配置要选择的第三方库或软件、比如 alsa-utils、 ffmpeg、 iperf 等工具,但是现在我们先不选择第三方库,防止编译不下去!先编译一下最基本的根文件系统,如果没有问题的话再重新配置选择第三方库和软件。否则一口吃太多会容易撑着的,编译出问题的时候都不知道怎么找问题。
3. 编译 buildroot
配置完成以后就可以编译 buildroot 了,编译完成以后 buildroot 就会生成编译出来的根文件系统压缩包,我们可以直接使用。输入如下命令开始编译:
1 | sudo make # 注意,一定要加 sudo,而且不能通过-jx 来指定多核编译!!! |
buildroot 编译的时候会先从网上下载所需的软件源码,有些软件源码可能下载不下来,这个时候就需要我们自行处理,这个后边再说。
buildroot 编译过程会很耗时,可能需要几个小时,这个时候耐心等待!buildroot 因为要从网上下载源码,因此可能存在有些源码无法下载或下载很慢的情况。
3.1 下载出错怎么办?
如下所示:
比如说这个,就会下载失败,出现下载失败或者下载很慢怎么办?我们可以根据下载链接,自己科学上网一下,下载好放到buildroot源码目录的dl目录下,dl 文件夹专用用于存放下载下来的源码。 就比如上边的这个,我们可以点击这个链接:
1 | http://sources.buildroot.net/e2fsprogs/e2fsprogs-1.46.5.tar.xz |
直接下载好压缩包,将它放到dl目录下:
然后我们再重新执行make命令就可以了。
3.2 kernel headers报错
我的解决办法就是修改配置:
1 | Toolchain |
修改这里的External toolchain kernel headers series版本,改成了4.0.x。
3.3 根文件系统测试
编译结束后,会在buildroot源码目录的output目录中生成根文件系统:
可以看出,编译出来了多种格式的 rootfs,比如 ext2、 ext4、 ubi 等。其中rootfs.tar 就是打包好的根文件系统,我们就使用 rootfs.tar 进行测试。在 nfs 目录下新建一个名为 buildrootfs 的文件夹 ,然后将rootfs.tar 拷贝到 buildrootfs 目录下并解压,命令如下:
1 | mkdir -p ~/4nfs/buildroot |
然后修改uboot的bootargs参数:
1 | => setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.10.101:/home/hk/4nfs/buildroot,proto=tcp rw ip=192.168.10.102:192.168.10.101:192.168.10.1:255.255.255.0::eth0:off init=/linuxrc' |
然后重启就可以啦,要是制作没问题的话,是可以挂载成功的。首先要进入到/lib/modules 目录,但是默认没有,因此需要我们自行创建此目录。 buildroot 构建的根文件系统启动以后会输出我们前面设置的欢迎语“Welcome to alphai.mx6ull”。然后需要输入用户名和密码,用户名是“root”,密码就是我们前面配置 buildroot 的时候设置的 “123456” 。输入用户名和密码以后就可以进入系统中:
可以看出的 buildroot 构建的根文件系统运行基本没有问题,但是这个根文件系统是最简单的,我们并没有在 buildroot 里面配置任何第三方的库和软件,接下来我们就配置 buildroot,使能一些常见的第三方软件。
二、buildroot下的busybox
1. busybox 配置
buildroot 在构建根文件系统的时候也是要用到 busybox 的,既然用到了 busybox 那么就涉及到 busybox 的配置。 buildroot 会自动下载 busybox 压缩包, buildroot 下载的源码压缩包都存放在/dl 目录下,在 dl 目录下就有一个叫做“busybox”的文件夹,此目录下保存着 busybox 压缩包 :
可以看出, buildroot 下载的 busybox 版本为 1.36.1。要想编译 busybox,必须对图中的压缩包进行解压缩, buildroot 将所有解压缩后的软件保存在buildroot源码目录的 output/build 中,我们可以在找到 output/build/busybox-1.36.1 这个文件夹,此文件夹就是解压后的 busybox 源码,文件内容如下:
如果想要修改 busybox 源码的话就直接在图中找到相应的文件,然后修改即可。我们现在是要配置 buildroot 下的 busybox,因此肯定要打开 busybox 的配置界面,在 buildroot下打开 busybox 的配置界面输入如下命令:
1 | cd ~/5ALPHA/buildroot-2023.05.1/ |
然后就会打开busybox的配置界面:
想要怎么配置直接参考前边的busybox构建根文件系统的笔记即可。
2. 中文支持
用buildroot编译出来的根文件系统也是不支持中文的,但是由于它其实使用的是busybox,所以我们可以直接根据前边的busybox构建根文件系统的笔记来修改busybox的源码,使其支持中文吗,这里就不再赘述了。
3. 编译busybox
配置好以后就可以重新编译 buildroot 下的 busybox,进入到 buildroot 源码目录下,输入如下命令查看当前 buildroot 所有配置了的目标软件包,也就是 packages:
1 | sudo make show-targets |
图中列出了当前 buildroot 中所有使能了的 packages 包,其中就包括 busybox,如果我们想单独编译并安装 busybox 的话执行下面命令即可:
1 | sudo make busybox |
上述命令就会重新编译 busybox。编译完成以后重新编译 buildroot,主要是对其进行打包,输入如下命令:
1 | sudo make |
重新编译完成以后查看一下 output/images 目录下 rootfs.tar 的创建时间是否为刚刚编译的,如果不是的话就删除掉 rootfs.tar,然后重新执行“sudo make”重新编译一下即可。最后我们使用新的 rootfs.tar 启动 Linux 系统。
三、终端配置
buildroot构建的根文件系统中的命令提示符前边也是不会显示当前路径的,我们可以跟前边一样,修改一下PS1变量,我们打开buildroot构建出来的根文件系统的 etc/profilse文件,找到如下代码:
1 | if [ "$PS1" ]; then |
我们把它修改成如下的样子:
1 | PS1='[\u@\h]:\w$:' |
然后我们再重启开发板就会看到命令提示符前边有显示路径啦: