锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)

时间:2022-11-17 08:00:00 直流电流传感器tfy

一. 下载BusyBox

BusyBox它继承了很多Linux命令核工具的软件,如常用软件ls、cp、mv、ifconfig等待命令。一般下载BusyBox然后配置源代码Busybox,选择你想要的功能,最后编译。

BusyBox可直接在官方下载:https://www.busybox.net/。目前最新是1.35.我在这里用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文件内容如下:

#     
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可能用到的动作

  • 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,关闭交换分区。

至此,文件系统制作完成。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章