i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)
Posted Mculover666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)相关的知识,希望对你有一定的参考价值。
一. 下载BusyBox
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
解压之后内容如下:
二、编译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文件夹。Linux内核init进程最后会查找用户空间的init程序,找到以后就会运行这个用户空间的init程序,从而切换到用户态,而linuxrc就是可以作为用户空间的init程序。
2. 添加lib库
2.1. 完善/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
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文件
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
网络开机
2. 创建/etc/fstab文件
在rootfs中创建/etc/fstab文件,fstab在linux开机后自动配置哪些需要自动挂载的分区,格式如下:
<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文件
init程序会读取/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,关闭交换分区。
至此,文件系统制作完成。
以上是关于i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)的主要内容,如果未能解决你的问题,请参考以下文章
i.MX6ULL系统移植 | 移植NXP官方 linux 5.4 内核
i.MX6ULL系统移植 | 使用 NXP MfgTool 烧写系统到eMMC
i.MX6ULL系统移植 | 移植 linux 原生5.4.32内核
i.MX6ULL系统移植 | 移植NXP官方 linux 5.4 内核