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

解压之后内容如下:
i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)_第1张图片

二、编译BusyBox

1. 配置交叉编译器

make menuconfig

进入Setting,修改Build Options中的交叉编译器前缀,如图:
i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)_第2张图片
退出并保存,修改完成。

2. 编译

make

编译完成:
i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)_第3张图片

三、使用busybox制作根文件系统

1. 安装busybox

首先新建一个安装目录 rootfs 用于安装busybox,然后使用 CONFIG_PREFIX 环境变量指定该目录进行安装:

make install CONFIG_PREFIX=/home/mculover666/imx6ull/rootfs

安装完成:
i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)_第4张图片
安装完成以后,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文件,这些就是库文件:
i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)_第5张图片
将此目录下所有的so和.a文件都拷贝到rootfs/lib目录中(-d参数表示拷贝符号链接):

cp *so* *.a ~/imx6ull/rootfs/lib/ -d

拷贝完成之后,查看rootfs/lib文件夹中的内容:
i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)_第6张图片
(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

i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)_第7张图片

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

i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)_第8张图片
复制:

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文件内容如下:

#                
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来说,用来指定启动进程的tty,一般我们将串口或者lcd设置为控制tty;
  • runbleves:对busybox来说没用
  • action:动作,用于指定process可能用到的动作

i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)_第9张图片

  • 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,imx6ull,linux)