一. 下载BusyBox
BusyBox它继承了很多Linux命令核工具的软件,如常用软件ls、cp、mv、ifconfig等待命令。一般下载BusyBox然后配置源代码Busybox,选择你想要的功能,最后编译。
BusyBox可直接在官方下载:https://www.busybox.net/。。
axel https://www.busybox.net/downloads/busybox-1.29.0.tar.bz2
下载之后解压:
tar -jxf busybox-1.29.0.tar.bz2
解压后内容如下:
二、编译BusyBox
1. 交叉编译器配置
make menuconfig
进入Setting,修改Build Options如图所示: 退出并保存,修改完成。
2. 编译
make
编译完成:
三、使用busybox制作根文件系统
1. 安装busybox
首先,新建一个安装目录 rootfs 用于安装busybox,然后使用 CONFIG_PREFIX 安装环境变量指定目录:
make install CONFIG_PREFIX=/home/mculover666/imx6ull/rootfs
安装完成: 安装完成后,busybox所有的工具和文件都将安装在目录中rootfs中:
除了bin、sbin、usr另外,还有一个linuxrc文件夹。。
2. 添加lib库
2.1. 完善/lib
文件夹
(1)复制libc/lib库文件在目录中
。
在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
3. 添加usr/lib库
在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
4. 查看库大小
至此,rootfs的库文件就全部添加好了,查看库的大小: 两个库合起来有124MB,还是挺大的。
5. 添加其它文件夹
在根文件系统中创建其它文件夹,如dev、proc、mnt、sys、tmp、root等。
四、完善根文件系统
1. 创建/etc/init.d/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
网络开机
2. 创建/etc/fstab文件
在rootfs中创建/etc/fstab文件,,格式如下:
<file system> <mount point> <type> <options> <dump> <pass>
- file system:要挂载的特殊的设备,也可以是块设备,比如/dev/sda等;
- mount point:挂载点;
- type:文件系统类型,比如ext2、ext3、proc、romfs、tmpfs;
- options:挂载选项,一般使用defaults,包含了rw、suid、dev、exec、auto、nouser、async;
- dump:1表示允许备份,0表示不备份
- pass:磁盘检查设置,0表示不检查(只有根目录需要设置为1,其它都不用)
综上,fstab文件内容如下:
#<file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
3. 创建/etc/inittab文件
,inittab由若干条指令组成,每条指令的格式如下:
<id>:<runlevels>:<action>:<process>
- id:每个指令的标识符,不能重复。对于busybox的init来说,
<id>
用来指定启动进程的tty,一般我们将串口或者lcd设置为控制tty; - runbleves:对busybox来说没用
- action:动作,用于指定process可能用到的动作
- process:具体的动作,比如程序、脚本、命令等。
创建/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,关闭交换分区。
至此,文件系统制作完成。