buildroot 构建 imx6ull 根文件系统

前言&准备

buildroot 是一个构建嵌入式系统的一站式软件,可以实现包括 uboot ,
kernel 和交叉编译链等部件的构建工作,它的特点是只构建必要的部分,
所以由它构建的根文件系统可以很小。此处仅记录根文件系统的构建。
buildroot 下载地址:
https://buildroot.org/download.html
解压即可。当然,buildroot 也还会依赖其他的软件,比如
make gcc g++ bc wget patch gzip bzip2 perl tar cpio python unzip file
等等,这些软件可以在运行过程中缺什么装什么。

配置软件

进入软件根目录,执行 make menuconfig ,可以看到有很多选项。
0. Target options
显然这里要配置目标平台,此处 imx6ull 选择
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) —>
buildroot 构建 imx6ull 根文件系统_第1张图片

  1. Build options : 不用动

  2. Toolchain
    此处我选用已经安装好了的交叉编译链,C 库用 glibc;
    我安装的交叉编译链为 arm-linux-gnueabihf-gcc ,
    gcc 所在路径为 /opt/linaro-hf/bin , 则配置为如下
    buildroot 构建 imx6ull 根文件系统_第2张图片
    其中提到的 gcc 版本号和头文件版本号,如果不知道可以先保持默认值,
    因为后面编译的时候会有相关提示。再勾选上 C++ 和 MMU 支持。
    buildroot 构建 imx6ull 根文件系统_第3张图片

  3. System configuration
    配置系统,有系统登录密码,系统初始化方式,脚本解释器选择等,
    这里我配置了 systemV ,eudev 和 bash:
    buildroot 构建 imx6ull 根文件系统_第4张图片
    个中区别可能要各位自行去研究,比如脚本解释器用 /bin/sh 和
    /bin/bash 的区别什么的。在此也可以重新设置密码,默认路径等。

  4. Kernel
    很遗憾,我并不想在 buildroot 里花时间去编内核和uboot,这里我不选

  5. Target packages
    选软件包,这里面内容丰富,主要是定制根文件系统的软件包,比如必选的 busybox ,
    busybox 里面已经囊括了基本的操作命令,当然它是简化版的,
    喜欢全功能的软件可能要在这里一个个打开。
    此处我想要全功能的 lsusb (要先在 System configuration 开 udev 支持),则选择
    Hardware handling —> usbutils
    我要全功能的 top/ps 等查看命令,则选择
    System tools —> procps-ng
    我启用了 bash ,则还要选择 bash completion ,否则命令行会有奇怪的问题
    Shell and utilities —> bash completion
    等等,此处我还打开了 Networking applications 的 openssh,net-tools 和 lrzsz ;
    System tools 的 tar 。这里面支持的软件包很多,根据各自所需一一选择便是。
    此处仅选以上几个搭建基本系统,实际上保持默认的选项生成的根文件系统也可以正常跑起来。

  6. Filesystem images
    系统打包相关,我没动过

  7. Bootloaders
    上面说了,不想在此处编,忽略

  8. Host utilities
    我也没动过

  9. Legacy config options
    暂时不用动

编译

选好软件包以后保存退出,执行 make 命令,接下来就是漫长的下载和编译。
编译刚开始没多久,如果报错说交叉编译链 gcc 版本不对,会告诉你说找到了哪个版本的 gcc,
据此,重新 make menuconfig -> Toolchain 改成对应的版本就行了,头文件版本也是同理。

其中如果涉及到 ncurses 库的编译安装,可能会报错说找不到部分文件,比如说找不到

/usr/bin/install: cannot stat ‘/mnt/e/tools/buildroot/buildroot-2019.02.4/output/host/arm-buildroot-linux-gnueabihf/sysroot/usr/share/terminfo/a/ansi’: No such file or directory

然而直接在当前目录下 find ./ -name ansi ,其实可以看到是有这个文件的,
只是路径不对,那笨一点,建个路径,然后把文件复制过去便是了:

mkdir ./output/host/arm-buildroot-linux-gnueabihf/sysroot/usr/share/terminfo/a/
cp ./output/host/arm-buildroot-linux-gnueabihf/sysroot/usr/share/terminfo/61/* ./output/host/arm-buildroot-linux-gnueabihf/sysroot/usr/share/terminfo/a/ -a

关于 ncurses 类似的错误有很多,耐心点一个个考过去就行,最后肯定可以通过的。

如果选择了 net-tools 软件包,可能会提示错误

Failure writing database /mnt/e/tools/buildroot/buildroot/output/target//etc/udev/hwdb.bin: Permission denied

查找一下发现文件存在,貌似是没写权限,给它一个权限即可:

sudo chmod 777 /mnt/e/tools/buildroot/buildroot/output/target//etc/udev/hwdb.bin

在编译结束后会进行系统打包,这个时候,由于我用的是 win10 下的 linux 子系统(wsl)编译,
而 wsl 目前仅仅支持SYSV的信号量,消息队列还没有被实现(fakeroot需要SYSV的消息队列) ,
所以到最后 fakeroot 会报错。但依旧有解决办法,可以先在本机安装 fakeroot :

apt-get install fakeroot

然后可以在 /usr/bin 中得到相关软件,把 fakeroot-tcp 拷贝覆盖 buildroot 下面的 fakeroot :

cp /usr/bin/fakeroot-tcp ./output/host/usr/bin/fakeroot

再进行 make ,顺利通过。编译完成后系统压缩包在 ./output/images 下。

根文件系统再加工

buildroot 也有添加软件包的方式,但此处记录的是假如你已经有了进行过交叉编译的软件,
怎么把它拷过来,交给 buildroot 统一打包,或者修改根文件的一些默认配置参数。
当然,你也可以在 arm 板上对配置好了的系统进行根文件打包。
首先根据编译完成时的打包信息去推断,主要是看结束前最后两端,
可以看出打包之前 buildroot 会先在 ./output/build/buildroot-fs 创建几个脚本:
./output/build/buildroot-fs/full_devices_table.txt
./output/build/buildroot-fs/tar/fakeroot

而在打印信息最后也可以看出,打包是用 fakeroot 运行
./output/build/buildroot-fs/tar/fakeroot 脚本生成压缩文件包,
打包的路径为 ./output/build/buildroot-fs/tar/target/

而打开 full_devices_table.txt 可以发现,里面记录了一些文件的读写属性,
因为ssh , mysql 等软件会对部分配置文件的读写属性很敏感,所以打包时要格外注意。
知道了以上几点就好办了,先把刚打包好的 rootfs.tar 解压至
./output/build/buildroot-fs/tar/target/
当然,target 这个文件夹很有可能会被 buildroot 删除,要是没有可以先自行创建

mkdir ./output/build/buildroot-fs/tar/target/
tar xvf ./output/images/rootfs.tar -C ./output/build/buildroot-fs/tar/target/

然后可以去编辑或添加 target/ 下面的文件,比如修改 target/etc/network/interfaces 去设置默认 IP ,
修改 target/etc/profile 设置系统的一些属性等。
此处记录我添加 ssh 的配置。上述创建好的文件系统在第一次上电时,ssh 会创建几个密钥文件,我不想每次
烧写系统后都要创建,则可以先把已创建好的密钥文件从板子上拷贝出来,主要是在 /etc/ssh 下面的:
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_dsa_key.pub
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub
/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ecdsa_key.pub
/etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_ed25519_key.pub

然后把它放到 ./output/build/buildroot-fs/tar/target/etc/ssh/ 下面。
这几个文件对读写属性很敏感,修改添加 ./output/build/buildroot-fs/full_devices_table.txt

/etc/ssh/ssh_host_dsa_key				f	600	0	0	-	-	-	-	-
/etc/ssh/ssh_host_dsa_key.pub			f	600	0	0	-	-	-	-	-
/etc/ssh/ssh_host_rsa_key				f	600	0	0	-	-	-	-	-
/etc/ssh/ssh_host_rsa_key.pub			f	600	0	0	-	-	-	-	-
/etc/ssh/ssh_host_ecdsa_key				f	600	0	0	-	-	-	-	-
/etc/ssh/ssh_host_ecdsa_key.pub			f	600	0	0	-	-	-	-	-
/etc/ssh/ssh_host_ed25519_key				f	600	0	0	-	-	-	-	-
/etc/ssh/ssh_host_ed25519_key.pub			f	600	0	0	-	-	-	-	-

最后,运行 fakeroot 打包
fakeroot-tcp ./output/build/buildroot-fs/tar/fakeroot

则可以在 ./output/images 下得到更新了的根文件系统压缩包。下载烧写即可,添加其他软件方法类似。
注:此处我用的是 win10 的 linux 子系统进行的编译,linux 子系统不支持 fakeroot 所以才用的 fakeroot-tcp 。

你可能感兴趣的:(buildroot 构建 imx6ull 根文件系统)