BusyBox是一个继承了大量Linux命令核工具的软件,像常用的ls、cp、mv、ifconfig等命令。一般下载BusyBox的源码,然后配置Busybox,选择自己想要的功能,最后编译即可。
BusyBox在官方可以直接下载:https://www.busybox.net/。目前最新是1.35.0,这里我使用1.29.0版本。
axel https://www.busybox.net/downloads/busybox-1.29.0.tar.bz2
下载之后解压:
tar -jxf busybox-1.29.0.tar.bz2
make menuconfig
进入Setting,修改Build Options中的交叉编译器前缀,如图:
退出并保存,修改完成。
make
首先新建一个安装目录 rootfs 用于安装busybox,然后使用 CONFIG_PREFIX 环境变量指定该目录进行安装:
make install CONFIG_PREFIX=/home/mculover666/imx6ull/rootfs
安装完成:
安装完成以后,busybox的所有工具和文件就会被安装到目录rootfs中:
除了bin、sbin、usr之外,还有一个linuxrc文件夹。Linux内核init进程最后会查找用户空间的init程序,找到以后就会运行这个用户空间的init程序,从而切换到用户态,而linuxrc就是可以作为用户空间的init程序。
/lib
文件夹(1)复制libc/lib目录下的库文件
Linux中的应用程序一般都是需要动态库的,所以我们需要向根文件系统中添加动态库。
在rootfs中创建一个名为lib的文件夹:
mkdir lib
lib库文件从交叉编译器中获取,进入交叉编译器的如下目录:
<编译器安装路径>/gcc-linaro-4.9.4-2017.01-rc1-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib
此目录下有很多的.so文件和.a文件,这些就是库文件:
将此目录下所有的so和.a文件都拷贝到rootfs/lib目录中(-d
参数表示拷贝符号链接):
cp *so* *.a ~/imx6ull/rootfs/lib/ -d
拷贝完成之后,查看rootfs/lib文件夹中的内容:
(2)修复软链接库
这里需要注意,库文件ld-linux-armhf-so.3
是一个软链接,会链接到库ld-2.19-2014.08-1-git.so
上:
所以这里需要重新复制,在rootfs中删除该文件:
rm ~/imx6ull/rootfs/lib/ld-linux-armhf.so.3
然后重新进入到之前编译器的lib目录,重新拷贝该文件,命令如下:
cp ld-linux-armhf.so.3 ~/imx6ull/rootfs/lib/
拷贝完成以后再去rootfs下查看:
此时它就是一个实实在在的库了。
(3)复制lib目录下的库
进入如下目录:
<编译器安装路径>/gcc-linaro-4.9.4-2017.01-rc1-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
该目录下也有很多的库文件,将其拷贝到rootfs/lib中:
cp *so* *.a ~/imx6ull/rootfs/lib/ -d
在rootfs/usr下创建一个lib目录,将如下目录中的库文件都拷贝过去:
<编译器安装路径>/gcc-linaro-4.9.4-2017.01-rc1-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
cp *so* *.a ~/imx6ull/rootfs/usr/lib/ -d
至此,rootfs的库文件就全部添加好了,查看库的大小:
两个库合起来有124MB,还是挺大的。
在根文件系统中创建其它文件夹,如dev、proc、mnt、sys、tmp、root等。
rcS是个shell脚本,Linux内核启动以后需要启动一些服务,而rcS就是规定启动哪些文件的脚本文件。
在rootfs中创建/etc/init.d/rcS文件,内容如下:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
① 设置 PATH 环境变量,保存可执行文件的目录
② 设置 LD_LIBRARY_PATH 环境变量,保存库文件所在的目录
③ 使用 export 导出 PATH 和 LD_LIBRARY_PATH环境变量
④ 使用mount命令来挂载所有的文件系统,这些文件系统由文件 /etc/fstab 来指定,后续创建。
⑤ 创建 /dev/pts目录,将devpts挂载到/dev/pts目录中
⑥ 使用mdev来管理热插拔设备,通过这两行,linux内核就可以在/dev目录下自动创建设备节点
这里是最简单的rcS文件,复杂的rcS可以借助buildroot完成。
创建之后添加可执行权限:
sudo chmod +x rcS
网络开机
在rootfs中创建/etc/fstab文件,fstab在linux开机后自动配置哪些需要自动挂载的分区,格式如下:
<file system> <mount point> <type> <options> <dump> <pass>
综上,fstab文件内容如下:
#
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
init程序会读取/etc/inittab这个文件,inittab由若干条指令组成,每条指令的格式如下:
<id>:<runlevels>:<action>:<process>
用来指定启动进程的tty,一般我们将串口或者lcd设置为控制tty;创建/etc/inittab文件,内容如下:
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
① 系统启动以后运行 /etc/init.d/rcS
这个脚本文件;
② 将console作为控制台终端,也就是ttymxc0;
③ 重启的时候运行/sbin/init;
④ 按下ctrl+alt+del组合键就运行/sbin/reboot;
⑤ 关机的时候执行 /bin/umount,卸载文件系统;
⑥ 关机的时候执行/sbin/swapoff,关闭交换分区。
至此,文件系统制作完成。