busybox制作根文件系统1

使用Busybox构建根文件系统

**环境:**Ubuntu 20.04

​ 野火imx6ull pro开发板

根文件系统里都有什么内容

在构建根文件系统之前,先来看一下根文件系统里面大概都有些什么内容,以Ubuntu为例,根文件系统的目录名字为/,可以直接cd进去,进入后输入ls命令查看根目录下的内容,结果如图所示:

接下来看一下常用的子目录。

/bin目录
看到“bin”应该能想到bin文件,bin文件就是可执行文件。所以此目录下存放着系统需要的可执行文件,一般都是一些命令,比如ls、mv等命令。此目录下的命令所有的客户都可以使用。/dev目录
dev是device的缩写,所以此目录下的文件都是和设备有关的,此目录下的文件都是设备文件。在Linux下一切皆文件,即使是硬件设备,也是以文件的形式存在的。/etc目录
此目录下存放着各种配置文件,可以进入Ubuntu的/etc目录看一下,里面的配置文件非常多!但是在嵌入式Linux下此目录会很简洁。/lib目录
lib是library的简称,也就是库的意思,此目录下存放着Linux所必须的库文件。这些库文件是共享库,命令和用户编写的应用程序要使用这些库文件。/mnt目录
临时挂载目录,一般是空目录,可以在此目录下创建空的子目录,比如/mnt/sd、/mnt/usb这样就可以将SD卡或者U盘挂载到/mnt/sd或者/mnt/usb目录中。/proc目录
此目录一般是空的,当Linux系统启动以后会将此目录作为proc文件系统的挂载点,proc是个虚拟文件系统,没有实际的存储设备。proc里面的文件都是临时存在的, 一般用来存储系统运行信息文件。/usr目录
要注意,usr是Unix Software Resource的缩写,也就是Unix操作系统软件资源目录。Linux一般被成为类Unix操作系统,苹果的MacOS也是类Unix操作系统。既然是软件资源目录,因此/usr目录下也存放着很多软件,一般系统安装完成以后此目录占用的空间最多。/var目录
此目录存放一些可以改变的数据。/sbin目录
此目录也用于存放一些可执行文件,但是此目录下的文件或者说命令只有管理员才能使用,主要用户系统管理。/sys目录
系统启动以后此目录作为sysfs文件系统的挂载点,sysfs是一个类似于proc文件系统的特殊文件系统,sysfs也是基于ram的文件系统,也就是说它也没有实际的存储设备。此目录是系统设备管理的重要目录,此目录通过一定的组织结构向用户提供详细的内核数据结构信息。/opt
可选的文件、软件存放区,由用户选择将哪些文件或软件放到此目录中。

构建根文件系统就是研究如何创建上面这些目录以及子目录中的文件。

BusyBox简介

由前面了解到,根文件系统里面就是一堆的可执行文件和其他文件组成的,那么其实需要一种工具,负责“收集”这些文件,然后将其打包,给开发者可以直接拿来用。BusyBox就是实现了这样的功能。 BusyBox是一个集成了大量的Linux命令和工具的软件,像ls、mv、ifconfig等命令BusyBox都会提供。 BusyBox就是一个大的工具箱,这个工具箱里面集成了Linux的许多工具和命令。

Busybox的下载

BusyBox可以在其官网下载到,官网地址:https://busybox.net/BusuBox

进入官网,在官网左侧的Get BusyBox栏有一行Download Source,点击Download Source即可打开BusyBox的下载页,如下图所示:

image-20231020123305891

根据自己来选择合适的版本,这里我选择下载busybox-1.32.0.tar.bz2这个压缩包即可,BusyBox准备好以后就可以构建根文件系统了。

image-20231020123523182

编译BusyBox

一般在Linux驱动开发的时候都是通过nfs服务挂载根文件系统的,当产品最终上市开卖的时候才会将根文件系统烧写到EMMC或者NAND中。所以要在 之前设置的nfs服务器目录中创建一个名为rootfs的子目录使用如下命令创建名为rootfs的子目录:

cd ~

~目录下创建busybox_dir文件夹,准备放Busybox的源码

mkdir busybox_dir

busybox-1.32.0.tar.bz2放到busybox_dir。然后使用如下命令将其解压:

tar -vxjf busybox-1.32.0.tar.bz2

解压后如图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改busybox配置文件支持中文

打开文件busybox-1.32.0/libbb/printable_string.c,找到函数printable_string2,缩减后的函数内容如下:

待修改处1:

image-20231026172010972

修改后如下图所示:

image-20231026172128755

待修改处2:找到下图位置

image-20231026173605127

修改后如下图所示:

image-20231026173712084

接着打开文件busybox-1.32.0/libbb/unicode.c

待修改处1:找到下图位置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改后如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

待修改处2:找到下图位置

image-20231026174444012

修改后如下图所示:

image-20231026174623843

使用图形化界面配置busybox

修改makefile文件,有两处要修改:

1:修改为交叉编译器,根据自己情况来,在164行

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2:修改平台为arm,在193行

image-20231102102352167

配置busybox
和之前编译Uboot、Linux kernel一样,要先对busybox进行默认的配置,有以下几种配置选项:

defconfig 		缺省配置,也就是默认配置选项。
allyesconfig 	全选配置,也就是选中busybox的所有功能。
allnoconfig		最小配置
defconfig  		默认配置

输入如下命令,使用默认配置defconfig文件来配置一下busybox:

sudo make defconfig

image-20231026202313740

执行上述命令配置成功后会生成.config文件

image-20231026201902274

busybox也支持图形化配置,通过图形化配置可以进一步选择自己想要的功能,输入如下命令打开图形化配置界面:

make menuconfig
sudo make ARCH=arm CROSS_COMPILE=/home/cwz/toolchain/gcc-linaro-4.9-2015.05-1-rc1-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi- menuconfig

打开后如下图所示:

image-20231026204320794

配置1

配置路径如下:

Location:
-> Settings-> Build static binary (no shared libs)

选项“Build static binary (no shared libs)”用来决定是静态编译是动态编译,静态编译的话就不需要库文件,但是编译出来的根文件系统会很大。动态编译要求根文件系统中有库文件,但是编译出来的 busybox会小很多。这不能采用静态编译!因为采用静态编译的话DNS会出问题!无法进行域名解析,配置如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

配置2

配置路径如下:

Location:
-> Settings-> vi-style line editing commands

结果如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

配置3

配置路径如下:

Location:
-> Linux Module Utilities-> Simplified modutils

结果如下图所示:

image-20231026205449172

配置4

配置路径如下:

Location:
-> Linux System Utilities-> mdev (17 kb)

确保全部选中,默认都是选中的如下图所示:

image-20231026205935666

配置5

使能busybox的unicode编码以支持中文

配置路径如下:

Location:
-> Settings-> Support Unicode -> Check $LC_ALL, $LC_CTYPE and $LANG environment variables

选中结果如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

保存配置文件

使用图形化修改过Busybox的配置以后最好保存一下配置文件,后期可以直接加载这个配置文件,也可以避免make clean删除掉以前的配置,在配置主界面上,如下图所示:

image-20231026211218515

进入后,命名要生成的文件。

image-20231026211936460

将会在本目录下生成config_busybox文件

image-20231026211735630

编译文件

CONFIG_PREFIX变量指定将编译好的文件放到/home/workdir/rootfs目录下(这里也是我自己设置的NFS服务的共享目录,根据自己的设置)。输入如下命令:

sudo make install CONFIG_PREFIX=/home/workdir/rootfs

输入上述命令,编译完成以后如下图所示:

image-20231026224152019

编译生成的文件在/home/workdir/rootfs如下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到,/home/workdir/rootfs目录下有binsbinusr这三个目录,以及linuxrc这个文件。前面说过Linux内核init进程最后会查找用户空间的 init程序,找到以后就会运行这个用户空间的init程序,从而切换到用户态。如果bootargs设置init=/linuxrc,那么linuxrc就是可以作为用户空间的 init程序,所以用户态空间的init程序busybox来生成的。

添加库文件

busybox的工作就完成了,但是此时的根文件系统还不能使用,还需要一些其他的文件,还需要继续完善rootfs。

向根文件系统添加lib库
向rootfs的/lib目录添加库文件
Linux中的应用程序一般都是需要动态库的,当然也可以编译成静态的,但是静态的可执行文件会很大。如果编译为动态的话就需要动态库,所以需要向根文件系统中添加动态库。在/home/workdir/rootfs中创建一个名为lib的文件夹,命令如下:

mkdir lib

lib文件夹创建好了,库文件从哪里来呢?lib库文件从交叉编译器中获取,这里我所使用到的交叉编译器是gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf。交叉编译器里面有很多的库文件,可以直接把所有的库文件都放到根文件系统中。进入如下路径(下面的路径根据自己的交叉编译器来设置)对应的目录:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image-20231102104707908

进入到库所在的目录

cd /home/cwz/toolchain/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib

此目录下有很多的*so*(*是通配符)文件,这些就是库文件。

将此目录下所有的*so*文件都拷贝到/home/workdir/rootfs/lib目录中,进入到库所在的目录使用下面命令将库文件拷贝:

cp *so* *.a /home/workdir/rootfs/lib/ -d

后面的-d表示拷贝符号链接。

这里有个比较特殊的库文件ld-linux-armhf.so.3,此库文件也是个符号链接,相当于Windows下的快捷方式。会链接到库ld-2.25.so上,输入命令下面命:

ls ld-linux-armhf.so.3 -l

image-20231102144359112

但是ld-linux-armhf.so.3不能作为符号链接,否则的话在根文件系统中执行程序无法执行!所以需要将ld-linux-armhf.so.3的实体拷贝过去,方法很简单,那就是重新复制ld-linux-armhf.so.3,只是不复制软链接即可,先将/home/workdir/rootfs/lib/中的ld-linux-armhf.so.3文件删除掉,命令如下:

rm ld-linux-armhf.so.3

然后重新进入到/home/cwz/toolchain/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib目录中

cd /home/cwz/toolchain/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib

重新拷贝ld-linux-armhf.so.3,命令如下:

cp ld-linux-armhf.so.3 /home/workdir/rootfs/lib/

拷贝完成以后再到/home/workdir/rootfs/lib/目录下查看ld-linux-armhf.so.3文件详细信息,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从上图可以看出,此时ld-linux-armhf.so.3已经不是软连接了,而是实实在在的一个库文件。

继续进入如下目录中:

cd /home/cwz/toolchain/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib

image-20231102104933874

此目录下也有很多的的*so*.a库文件,将其也拷贝到/home/workdir/rootfs/lib/目录中,命令如下:

cp *so* *.a /home/workdir/rootfs/lib/ -d

image-20231102105033102

目录的库文件就拷贝完成了。

/home/workdir/rootfs/usr目录下创建一个名为lib的目录

image-20231027092739321

进入到/home/cwz/toolchain/gcc-linaro-4.9-2015.05-1-rc1-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/usr/lib目录中,

cd /home/cwz/toolchain/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib

将此目录下的库文件拷贝到/home/workdir/rootfs/usr/lib目录下下。

cp *so* *.a /home/workdir/rootfs/usr/lib/ -d

image-20231102105523070

至此,根文件系统的库文件就全部添加好了。

创建其他文件夹

在根文件系统中创建其他文件夹,如dev、proc、mnt、sys、tmp、etc和root等,

mkdir dev proc mnt sys tmp etc root 

创建完成以后如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目前看起来已经完成了,接下来就可以测试一下根文件系统了。

参考:

-1700623668096)]

目前看起来已经完成了,接下来就可以测试一下根文件系统了。

参考:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

581. 最短无序连续子数组

581. 最短无序连续子数组 题目: 给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组,并输出它的长度。 示例&…

数字化非遗之光:十八数藏的文化保护之道

在当今数字化的时代,文化传承正经历着一场前所未有的转变,而十八数藏以其独特的方式成为数字化非遗的典范。这个项目不仅仅是数字技术的应用,更是一种文化的使命,一道保护非物质文化遗产的光芒。 十八数藏以数字化的手段保护非遗&…

五金零件经营小程序商城的效果如何

五金零件无论批发还是零售都有很高的需求度,传统消费者往往是线下门店寻找购买,但如今更多的客户选择线上消费,而商家们也选择线上开店拓展更广的客源及生意增长。 除了第三方平台进驻外,私域开店对商家来说也是一种方式。微信场…

如何用惯性动作捕捉系统,快速创建数字人三维动画?

在动画制作领域,惯性动作捕捉技术已经逐渐成为一种重要的制作手段。通过动捕设备能够将动捕演员真实的动作转化为数字数据,然后在动画中再现这些动作。为了创造出逼真、流畅的数字人动画,惯性动作捕捉系统成为了一大工具。 根据采集方式的不…

Vulnhub 解决虚拟机网络问题

前言: 有的时候,我们从vulnhub官网下载ovf文件导入到虚拟机后,使用扫描器扫描存活的时候发现扫不到靶机的IP,这是因为虚拟机的网卡配置有问题。我们需要进安全模式修改一些配置。 1. 在虚拟机开机的时候按一下上下键,让…

Wagtail-基于Python Django的内容管理系统CMS如何实现公网访问

Wagtail-基于Python Django的内容管理系统CMS实现公网访问 文章目录 Wagtail-基于Python Django的内容管理系统CMS实现公网访问前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个…

代码随想录二刷 | 链表 |链表相交

代码随想录二刷 | 链表 |链表相交 题目描述解题思路 & 代码实现 题目描述 160.链表相交 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 题目数据 保…

万界星空科技QMS质量管理系统功能

QMS质量管理系统结合质量决策、综合质量管理、过程质量控制三个层次要素,帮助企业实现产品全寿命周期质量数据的及时、灵活、准确和全面采集。 通过质量管理软件能够实现质量数据科学处理和应用,包括数据的系统化组织、结构化存贮、便捷式查询、定制化统…

什么是搜索相关性?AI如何驱动搜索相关性?

训练数据驱动机器学习,机器学习促进丰富的人机交互体验。在快速迭代的互联网时代,我们不断被各种广告铺盖,甚至经常细思极恐,“天呐,小红书怎么知道我面膜没了。”这都是算法和机器学习的鬼斧神工洞察着用户的搜索意图…

低代码:数字化转型趋势下的快速开发方式

目录 一、前言 二、低代码是什么? 三、低代码如何提高生产力 开发工具JNPF介绍 产品分析 1可视化应用开发 2流程管理 3整个平台源码合作 四、小结 一、前言 通常,开发一个大型的企业级系统,公司往往需要大量的人力做支持后盾,如需…

时态图根据时间轴动态播放热力图

效果图如下&#xff1a; <!DOCTYPE html> <html><head><title>时态图</title><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><!-- 引入样式 --&g…

【高级网络程序设计】Week3-2 Servlet

一、 What are servlets? 1. 定义 &#xff08;1&#xff09;Servlets are Java’s answer to CGI&#xff1a; programs that run on a web server acting as middle layer between HTTP request and databases or other applications.Used for client requests that cann…

人工智能和AR/VR:AI在AR和VR中扮演什么角色?行业应用有哪些?

增强现实技术和虚拟现实技术&#xff08;AR/VR&#xff09;发展前景广阔&#xff0c;备受各大企业关注。事实上&#xff0c;近四分之三的行业领导者表示&#xff0c;他们预计这些沉浸式技术将于未来五年内成为主流。高盛公司报告称&#xff0c;到2025年&#xff0c;AR/VR行业值…

Golang版本处理Skywalking Trace上报数据

Tips: 中间记录了解决问题的过程&#xff0c;如不感兴趣可直接跳至结尾 首先去es里查询skywalking trace的元数据 可以拿到一串base64加密后的data_binary(直接解密不能用&#xff0c;会有乱码&#xff0c;可参考https://github.com/apache/skywalking/issues/7423) 对data_b…

图解系列--密钥,随机数,应用技术

密钥 1.生成密钥 1.1.用随机数生成密钥 密码学用途的伪随机数生成器必须是专门针对密码学用途而设计的。 1.2.用口令生成密钥 一般都是将口令输入单向散列函数&#xff0c;然后将得到的散列值作为密钥使用。 在使用口令生成密钥时&#xff0c;为了防止字典攻击&#xff0c;需要…

笔记本只使用Linux是什么体验?

笔记本只使用Linux是什么体验&#xff1f; 之后安了Windows双系统之后也不怎么想再进Windows了。 开发环境就不用说了&#xff0c;Linux下配各种开发环境都方便的多&#xff0c;当然你要用 vs 那还是乖乖回 Windows 吧。 最近很多小伙伴找我&#xff0c;说想要一些Linux的资…

详解Java的static关键字

文章目录 &#x1f384;静态方法&#x1f33a;静态方法和非静态方法对比&#x1f6f8;静态方法实例&#x1f6f8;非静态方法实例 &#x1f339;static关键字⭐static变量⭐static代码块 &#x1f384;静态方法 不依赖于对象实例&#xff1a;静态方法不需要依赖于任何对象实例&…

java的继承特性和方法重写

java的继承特性和方法重写 Java的继承特性是一种面向对象编程的重要概念&#xff0c;它允许我们基于已有的类创建新的类&#xff0c;并且保留了已有的类的一些特性。这是通过使用"继承"这个关键词来实现的&#xff0c;新创建的类称为子类&#xff08;subclass&#…

Spark---核心介绍

一、Spark核心 1、RDD 1&#xff09;、概念&#xff1a; RDD&#xff08;Resilient Distributed Datest&#xff09;&#xff0c;弹性分布式数据集。 2&#xff09;、RDD的五大特性&#xff1a; 1、RDD是由一系列的partition组成的 2、函数是作用在每一个partition(split…

Linux 磁盘/分区/修复 命令

目录 1. lsblk&#xff08;list block devices&#xff09; 2. fdisk&#xff08;fragment disk&#xff09; 3. gdisk 4. mkfs&#xff08;make filesystem&#xff09; 5. df&#xff08;display file-system disk space usage&#xff09; 6. du 7. fsck&#xff08;file-sy…