100ASK-IMX6ULL开发板使用busybox构建根文件系统
1. 为什么使用busybox?
现在可以用于构建根文件系统的软件有很多,比如buildroot,yocto,而且这些软件构建的根文件系统软件更全,为什么要使用busybox呢,因为比较简单,对于我这种初学者来说,从简单开始学习才是最好的,可以了解原理,原理清楚了,再使用其他软件来构建就简单多了。
2. 编译busybox构建根文件系统
2.1 构建环境:
- gcc: 100ask_imx6ull-sdk\ToolChain\gcc-linaro-6.2.1-2016.11-x86_64_arm-linux- gnueabihf
- linux: linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
- 主机系统: ubuntu18.04
gcc可以在百问网提供的bsp包找到,busybox使用的版本是nxp官方的busybox-1.29.0.tar.bz2, 点击下载busybox-1.29.0.tar.bz2。
2.2 配置编译busybox
- 解压busybox-1.29.0.tar.bz2:
tar -vxjf busybox-1.29.0.tar.bz2
- 修改Makefile,添加编译器,打开busybox的根目录中的Makefile,将164行修改为:
CROSS_COMPILE ?= /home/book/share/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
将路径修改为自己的交叉编译工具的绝对路径,将190行修改为:
ARCH ?= arm
- 配置busybox,busybox有三种配置选项:
- defconfig,默认配置
- allyesconfig,全选配置,使能busybox中的所有功能
- allnoconfig,最小配置
使用默认配置,执行:
make defconfig
然后打开图形配置界面,执行:
make menuconfig
分别配置下面的路径:
Location:
-> Settings
-> Build static binary (no shared libs) //取消选中,动态编译,不然编译出来的根文件系统很大
Location:
-> Settings
-> vi-style line editing commands //选中
Location:
-> Linux Module Utilities
-> Simplified modutils //取消选中
Location:
-> Linux System Utilities
-> mdev (16 kb) //确保下面的全部选中,默认都是选中的
- 配置完busybox就可以编译了,执行:
make install CONFIG_PREFIX=/home/book/nfs_rootfs/blogrootfs
CONFIG_PREFIX指定输出路径,指向nfs服务器的路径即可。编译完成后可以查看rootfs路径下的文件:
- 向根文件系统添加lib库
在rootfs下创建lib文件夹,在usr下创建lib文件夹。
- 进入交叉编译器存放的目录,将arm-linuxgnueabihf/libc/lib下的*so*和*.a拷贝到rootfs/lib下:
cp *so* *.a ~/nfs_rootfs/blogrootfs/lib/ -d
后面的“-d”表示拷贝符号链接。在rootfs中lib执行ls ld-linux-armhf.so.3 -l,可以看到ld-linux-armhf.so.3是一个软链接,所以需要重新复制一下。先删除rootfs/lib下的ld-linux-armhf.so.3,然后进入arm-linuxgnueabihf/libc/lib执行:
cp ld-linux-armhf.so.3 ~/nfs_rootfs/blogrootfs/lib/
再次查看rootfs/lib下的ld-linux-armhf.so.3,已经不是软链接了。
- 进入交叉编译器存放的目录,将arm-linuxgnueabihf/lib下的*so*和*.a拷贝到rootfs/lib下:
cp *so* *.a ~/nfs_rootfs/blogrootfs/lib/ -d
- 进入交叉编译器存放的目录,将arm-linuxgnueabihf/libc/usr/lib下的*so*和*.a拷贝到rootfs/usr/lib下:
cp *so* *.a ~/nfs_rootfs/blogrootfs/usr/lib/ -d
可能会有警告,不用管。
- 创建其它文件夹
在rootfs根目录下创建文件夹:dev、 proc、 mnt、 sys、 tmp、root,创建完后如下图示:
- 测试根文件系统
测试根文件系统一般都使用NFS,在内核启动时指定使用的nfs服务器以及路径,在uboot启动后,设置bootargs为:
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rootwait rw nfsroot=192.168.101.5:/home/book/nfs_rootfs/rootfs ip=192.168.101.6:192.168.101.5:192.168.101.1:255.255.255.0::eth0:off'
/* root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gwip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>*/
设置好后保存环境变量,然后使用tftp加载内核和设备树并启动:
tftp 80800000 zImage
tftp 83000000 imx6ull-100ask-emmc.dtb
bootz 80800000 - 83000000
启动完成后如下图:
可以执行基本的命令了,但是提示没有/etc/init.d/rcS文件,所以需要完善一下文件系统。
3. 完善根文件系统
3.1 创建/etc/init.d/rcS文件
linux启动后需要运行一些服务,而 /etc/init.d/rcS文件就是规定启动哪些服务,创建该文件并添加如下内容:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=