itop-3568 开发板文件系统构建学习笔记(2)Busybox 制作最小文件系统

《【北京迅为】itop-3568 开发板文件系统构建手册v1.0.pdf》学习笔记

Busybox 下载

BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Linux 系统的自带的shell。

——百度百科

Busybox 的官网下载地址为:https://busybox.net/downloads/。该工具是一个开源程序,迅为教程中使用的版本是 busybox-1.33.1,所以我也选择下载这个版本。

在这里插入图片描述

设置支持中文

较新版本的 busybox 在使用 ls 命令时无法显示中文,因为 busybox1.17.0 以后的版本对中文的支持做了限制,如果想让 busybox 支持中文,需要进行以下修改:

  1. 修改 libbb/printable_string.c

在这里插入图片描述

  1. 修改 libb/unicode.c

在这里插入图片描述

  1. 修改配置文件

打开终端,进入 busybox 源码根目录,输入 make menuconfig 打开配置界面,开启下图两个配置项(Settings --> Library Tuning --> Support Unicode,在 Settings 的较后部分)

在这里插入图片描述

配置 busybox

打开终端,进入 busybox 源码根目录,输入 make menuconfig 打开配置界面。首先设置交叉编译器(Settings–>Build Options–>Cross Compiler prefix):

在这里插入图片描述

交叉编译器名要根据自己开发环境来填写,下面是我的环境变量中的交叉编译器:

在这里插入图片描述
busybox 默认安装到 ./_install 目录,如果需要更改,可以修改配置菜单的 Setting–>Installation Options 下的相关选项:

在这里插入图片描述

编译安装 busybox

配置完 busybox 后,在 busybox 根目录执行 makemake install 来编译和安装 busybox。

安装完成后,进入安装目录,可以看到四个目录(bin、linuxrc、sbin 和 usr)

完善根文件系统

  1. 创建必要的文件夹

添加一些必要的目录( dev、lib、mnt、lib、mnt、proc、sys、tmp、var、etc/init.d):

在这里插入图片描述

  1. 拷贝动态库

由于 busybox 编译时默认不使用静态库,且安装后的最小系统的 lib/ 目录为空,所以要想让 bin/ 和 sbin/ 内的二进制(命令)文件运行,必须拷贝交叉编译器的动态库文件到最小系统的 lib/ 目录内。

在这里插入图片描述

拷贝时需要保留库文件间的链接关系。

在这里插入图片描述

  1. 创建 etc/fstab 文件

fstab 包含了存储设备及文件系统的信息,fstab 可以自动挂载各种文件系统的硬盘、分区和可移动设备等。

这里我直接将 Ubuntu 的 /etc/fstab 拷贝到最小系统中(然后手动修改):

在这里插入图片描述

在这里插入图片描述
设置权限(不知道是不是必须的步骤)

在这里插入图片描述

  1. 创建 etc/passwd 文件

passwd 文件用来存放用户的信息。同样的,我把 Ubuntu 的 passwd 文件拷贝到最小根文件系统中(然后手动修改):

在这里插入图片描述
在这里插入图片描述

该文件每行的格式为:<name>:<password><uid>:<gid>:<comment>:<home>:<shell>

  1. 创建 etc/inittab 文件

将 busybox 源码根目录下的 example 文件夹内的 inittab 文件拷贝到最小根文件系统中:

在这里插入图片描述
保留以下五行内容:

在这里插入图片描述

sysinit:为 init 提供初始化命令行的路径
askfirst:每当相应进程终止便会重新启动(它会让 init 在控制台提示用户按下 Enter 继续)
restart:init 重启时,执行相应相应进程(这里执行 init 本身)
shutdown:系统关机时,执行相应进程

  1. 创建 etc/init.d/rcS 文件

上面的 inttable 文件里 ::sysinit:/etc/init.d/rcS 表明在系统启动时,会执行 /etc/init.d/rcS 脚本,在最小根文件系统的 etc/init.d 目录下创建 rcS 文件:

在这里插入图片描述

rcS 的内容如下:

在这里插入图片描述

  1. 创建 /etc/profile 文件

profile 文件用来设置我们的环境变量,在最小根文件系统的 etc/ 目录下创建 profile 文件:

在这里插入图片描述

profile 文件内容如下:

在这里插入图片描述

制作文件系统镜像

通过上面的步骤,根文件系统制作完成,现在需要将根文件系统打包成镜像,烧录到开发板中。

创建一个空文件夹 rootfs,使用 du 命令查看我的最小根文件系统大小(约 64M),然后用 dd 命令生成一个 80M 大小的 .ext4 文件(按理来说,70M 就够了,但我实测却报错了,所以直接取 80M),最后使用 mkfs.ext4 将 rootfs.ext4 格式化。(-L 参数后面跟着的是文件系统的标头名称):

在这里插入图片描述

将 rootfs.ext4 挂载到空目录 rootfs,然后将之前修改过的最小根文件系统的所有文件拷贝到 rootfs 里(注意保留文件间的链接关系)。

在这里插入图片描述

拷贝完成后,将 rootfs.ext4 取消挂载,并重命名为 rootfs.img,至此,根文件系统镜像制作完成。

在这里插入图片描述

最后,使用瑞芯微开发工具将 rootfs.img 文件拷贝到开发板。

测试根文件系统

下面是我制作的 busybox 根文件系统,可以看到,该文件系统既可以输入中文,也可以显示中文:

在这里插入图片描述

接下来测试一下库文件,下面是一个简单的 C 程序,现测试其能否运行我刚才制作的最小文件系统中。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    
    
	// argc:命令行中参数的个数
	// argv:命令行的参数

	int i = 0;
	printf("参数个数为 %d\n", argc);
	for(i = 0; i < argc; i++)
	{
    
    
		printf("第%d个参数为 %s.\n", i + 1, argv[i]);
	}
	return 0;
}

运行结果如下,C 程序成功运行:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43772810/article/details/129080320
今日推荐