ARM《8》_制作linux最小根文件系统

内容分享14小时前发布 陈思呈
0 0 0

0、前言:

这是一篇以问题为导向,的技术贴!目的:我使用一个arm架构的主板,其中拷入了uboot,uboot中的设置是主板上电后从我电脑的虚拟机的linux中通过tftp获取内核镜像,通过nfs加载虚拟机中的rootfs根文件目录,我现在想要自己在虚拟机中制作一个根文件目录my_rootfs,制作好之后,替换nfs下的rootfs。之后,用一个测试文件hello.c,通过arm的交叉编译器编译出可执行文件hello后,将其放入nfs路径下我制作的rootfs当中,主板上电后,通过secureCRT连接主板,然后在主板的linux系统下执行hello,打印hello word,这篇技术贴就是说明如何制作根目录系统my_rootfs,最终替换nfs下的rootfs;开发板,用的是迅为的itop4412,使用的芯片三星的exynos4412,CPU四核,每核频率1GHz,内存共2G,emmc硬盘16G。


基础概念库:

根文件系统制作相关知识:

通过虚拟机中的linux系统制作;需要安装busybos作为制作工具,busybox-1.36.1.tar.bz2;

制作根文件系统的目的:

在 Linux 中制作根文件系统(rootfs)的核心是构建一个包含内核启动所需的最小文件结构、基础工具、库文件和配置文件的目录树,最终打包成内核可识别的镜像格式(如 ext4、squashfs、initramfs 等)。常被用于自定义嵌入式系统或最小化根文件系统。如果是制作板载的最小根文件系统,需要明确根文件系统的运行架构(如 x86_64、arm 等),若与当前虚拟机架构一致(如 x86_64),可直接在虚拟机中构建;若为跨架构(如在 x86 机器上构建 arm 根文件系统),需安装交叉编译工具链(如 arm-linux-gnueabi-*)。根文件系统(root filesystem)是运行Linux系统所必须的各种工具软件、库文件、脚本、配置文件的一种特殊的文件目录结构集合。Linux内核启动后要挂载一个文件系统才能运行。

使用工具介绍:

BusyBox 是一个轻量级的开源工具箱,该项目是由Bruce Perens in 在1996创建的,官网地址是:http://www.busybox.net/,BusyBox 是在 GNU GPL 许可协议下发行的开源软件,享有“嵌入式Linux的瑞士军刀”美誉;Busybox是一个UNIX系统工具集,它将很多普通的UNIX工具集成到一个很小的可执行文件中,为普通用户提供大多数常用的命令;Busybox使用方式:
make menuconfig (重新配置)make clean (建议清掉旧对象)make (重新编译)make install (重新生成根文件系统骨架)
总结:BusyBox 的使用逻辑就是“源码 → 配置 → 编译 → 安装”四步曲;一旦要换交叉编译器、改功能、换安装目录、换编译模式(静态/动态),就必须重新按照上面的步骤再次操作;


具体问题解决:

案例、制作板载根文件目录系统

我要制作一个arm板的根文件系统;

0、工具和前期准备

下载busybox(http://www.busybox.net/)解压下载的buxybox压缩包;(tar -jxvf busybox-1.36.1.tar.bz2)
ARM《8》_制作linux最小根文件系统进入解压后的busybox目录,通过make menuconfig配置busybox,
设置交叉编译工具链;

ARM《8》_制作linux最小根文件系统
导航路径:Settings → Cross Compiler prefix
操作:按回车,输入你的 ARM 交叉编译器前缀(例如 arm-linux-gnueabihf-,末尾的 – 不能少),按回车确认。【按住ctrl+delete可以删除输错的部分】,默认用宿主机 gcc,编出来的二进制是 x86_64,放到 ARM 板子上绝对跑不起来。
作用:让 BusyBox 的 Makefile 在编译每一行都自动把 gcc / ld / strip 等命令换成 交叉工具链对应的可执行文件。

ARM《8》_制作linux最小根文件系统
启用静态编译(推荐)
导航路径:Settings → Build static binary (no shared libs)
操作:按空格键勾选(选项前出现 *),静态编译后无需处理库依赖。
作用:给 gcc 加上 -static 选项,把所有用到的 C 库函数都链接进 BusyBox 自身里,最终生成一个 不依赖任何共享库 的单个可执行文件。

ARM《8》_制作linux最小根文件系统
设置安装路径:修改为上层目录下的my_rootfs;
作用:让 make install 把 BusyBox 生成的所有文件(bin、sbin、usr、linuxrc …)直接装到“你准备好的根文件系统目录”里(上面设定的是my_rootfs),而不是默认的 ./_install。这样 my_rootfs 立刻就是一份可启动的最小根目录,后续只需补库、补脚本即可,不必再手动复制或合并。

在解压后的busybox目录编译:make,在 busybox-1.36.1目录下会生成一个busybox可执行文件。

运行:file busybox 确认编译生成的是 ARM 平台的(显示为ELF 32-bit LSB executable, ARM)。
ARM《8》_制作linux最小根文件系统

执行:make install ,执行后会在 busybox源码的上一级目录的my_rootfs目录下生成几个目录,如bin,usr等,这些目录中包含了busybox生成的工具。
ARM《8》_制作linux最小根文件系统

1、开始制作根文件系统

进入busybox install后的安装目录并创建所需目录:cd my_rootfs。
ARM《8》_制作linux最小根文件系统

进入make install 安装好的目录my_rootfs后,创建所需目录 :cd my_rootfs mkdir dev etc mnt proc var tmp sys root lib。

将工具链中的库拷贝到my_rootfs/lib 目录下:sudo cp -Parf /opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/arm-linux-gnueabihf/lib/* ./
ARM《8》_制作linux最小根文件系统

删除静态库和共享库(动态库)文件中的符号表以减小体积,在 lib 目录下,先通过du -mh ./ 查看未删减前lib的大小,通过:rm .a 删除掉静态库,通过arm-linux-gnueabihf-strip ./ 裁剪掉调试信息 ;
ARM《8》_制作linux最小根文件系统

制作系统启动文件,回到my_rootfs根目录,在my_rootfs目录下执行:cp -arf ~/nfs/rootfs/etc ./ 【拷入成熟的参考配置,将linux内核能成功挂载的rootfs目录下的etc文件夹拷贝到新制作的rootfs目录下面。】

ARM《8》_制作linux最小根文件系统

备份原来的根文件系统:mv ~/nfs/rootfs ~/nfs/rootfs.ok.old将我们的根文件系统拷贝过去:sudo cp -arf my_rootfs ~/nfs/rootfs
ARM《8》_制作linux最小根文件系统

2、测试

写一个arm_hello.c(用于打印输出:brush test hello!),用arm交叉编译工具编译得到可执行文件arm_hello;【编译命令:arm-linux-gnueabihf-gcc arm_hello.c -o arm_hello】

将可执行文件放到rootfs下,启动开发板(通过secureCRT通过串口连接),进入开发板linux中挂载的根文件系统目录中,执行./arm_hello,测试是否可以执行;
ARM《8》_制作linux最小根文件系统

从上面的结果看,能看到有两个可执行程序,一个是arm_hello,一个是arm_static_hello,执行arm_hello时会报错not found,这是因为arm_hello是arm-linux-gnueabihf-gcc arm_hello.c -o arm_hello编译的,arm_static_hello是arm-linux-gnueabihf-gcc arm_hello.c -o arm_static_hello -static编译的;

总结arm-linux-gnueabihf-gcc arm_hello.c -o与arm-linux-gnueabihf-gcc arm_hello.c -o arm_static_hello -static的区别:

带 -static 选项:采用 静态链接,编译器会将程序运行所需的所有库函数(如 printf 等标准库函数)直接打包到生成的可执行文件中。不带 -static 选项:默认采用 动态链接,程序运行时需要依赖目标系统中的动态链接库(如 libc.so 等)。静态链接生成的 hello 文件体积较大(通常几 MB),因为包含了完整的库代码。动态链接生成的 hello 文件体积较小(通常几十 KB),仅包含程序自身代码和动态库引用。静态链接的程序:不依赖目标系统中的动态库,在 最小根文件系统(如你用 BusyBox 制作的系统)中可以直接运行,兼容性更好。动态链接的程序:必须在目标系统中存在对应的动态库(如 libc.so、ld-linux.so 等),否则会提示 “找不到库文件” 错误。

© 版权声明

相关文章

暂无评论

none
暂无评论...