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)]

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

参考:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

提升效率必备:电脑文件批量重命名的实用技巧大放送

在日常工作中,电脑文件的重命名是一项常见的操作。当要处理大量的文件,并且要按照一定的规则或逻辑进行重命名时,手动一个一个重命名显然是非常低效的。掌握批量重命名的技巧可提高工作效率。现在一起来看云炫文件管理器如何批量重命名电脑上…

5个步骤,让你的全志H616核桃派玩回当年火爆全球NES游戏

1.准备好你的nes游戏: nes游戏链接:链接:百度网盘 请输入提取码 提取码:k6sh 2.安装nes游戏模拟器: sudo apt-get install nestopia3.打开安装好的nes游戏模拟器: 终端打开: nestopia桌面系…

[Python人工智能] 四十.命名实体识别 (1)基于BiLSTM-CRF的威胁情报实体识别万字详解

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章普及VS Code配置Keras深度学习环境,并对比常用的深度学习框架,最后普及手写数字识别案例。这篇文章将讲解如何实现威胁情报实体识别,利用BiLSTM-CRF算法实现对ATT&CK相关的技战术实体…

80%测试员被骗,关于jmeter 的一个弥天大谎!

jmeter是目前大家都喜欢用的一款性能测试工具,因为它小巧、简单易上手,所以很多人都愿意用它来做接口测试或者性能测试,因此,在目前企业中,使用各个jmeter的版本都有,其中以jmeter3.x、4.x的应该居多。 但是…

23. 深度学习 - 多维向量自动求导

Hi, 你好。我是茶桁。 前面几节课中,我们从最初的理解神经网络,到讲解函数,多层神经网络,拓朴排序以及自动求导。 可以说,最难的部分已经过去了,这节课到了我们来收尾的阶段,没错,生…

基于springboot实现班级综合测评管理系统项目【项目源码+论文说明】

基于springboot实现班级综合测评管理系统演示 摘要 随着互联网技术的高速发展,人们生活的各方面都受到互联网技术的影响。现在人们可以通过互联网技术就能实现不出家门就可以通过网络进行系统管理,交易等,而且过程简单、快捷。同样的&#x…

【Django-DRF】多年md笔记第5篇:Django-DRF的Request、Response和视图详解

本文从分析现在流行的前后端分离Web应用模式说起,然后介绍如何设计REST API,通过使用Django来实现一个REST API为例,明确后端开发REST API要做的最核心工作,然后介绍Django REST framework能帮助我们简化开发REST API的工作。 Dj…

ARCGIS网络分析

一、实验名称: 网络分析 二、实验目的: 通过本实验练习,掌握空间数据网络分析的基本方法。 三、实验内容和要求: 实验内容: 利用ARCGIS软件网络分析工具及相关空间数据,查找距离“名人故居”、“博物…

Python-大数据分析之常用库

Python-大数据分析之常用库 1. 数据采集与第三方数据接入 1-1. Beautiful Soup ​ Beautiful Soup 是一个用于解析HTML和XML文档的库,非常适用于网页爬虫和数据抓取。可以提取所需信息,无需手动分析网页源代码,简化了从网页中提取数据的过…

扒一扒Bean注入到Spring的那些姿势

这篇文章我准备来扒一扒Bean注入到Spring的那些姿势。 其实关于Bean注入Spring容器的方式网上也有很多相关文章,但是很多文章可能会存在以下常见的问题 注入方式总结的不全 没有分析可以使用这些注入方式背后的原因 没有这些注入方式在源码中的应用示例 ... 所…

Mysql 递归查询子类Id的所有父类Id

文章目录 问题描述先看结果表结构展示实现递归查询集合查询结果修复数据 问题描述 最近开发过程中遇到一个问题,每次添加代理关系都要去递归查询一下它在不在这个代理关系树上.很麻烦也很浪费资源.想着把代理关系的父类全部存起来 先看结果 表结构展示 表名(t_agent_user_rela…

Linux安装Mysql详细教程(两种安装方法)

Linux之Mysql安装配置 第一种:Linux离线安装Mysql(提前手动下载好tar.gz包)第二种:通过yum安装配置Mysql(服务器有网络) 第一种:tar.gz包安装 1、 查看是否已经安装 Mysql rpm -qa | grep m…

这13个不经意却很不卫生的行为,很多人都没意识到

这13个不经意却很不卫生的行为,很多人都没意识到 北京崇文中方中医医院名医馆 2023-11-11 17:01 发表于北京 我们在生活中不经意间做出的一些动作,或者日常养成的一些行为习惯,正在悄悄伤害着我们的身体健康。可惜的是很多人都不知道这一点…

如何去阅读源码,我总结了18条心法

那么到底该如何去阅读源码呢?这里我总结了18条心法,助你修炼神功 学好JDK 身为一个Javaer,不论要不要阅读开源项目源码,都要学好JDK相关的技术。 所有的Java类开源项目,本质上其实就是利用JDK已有的类库和关键字实现…

VUE excel表格导出

js代码 //下载模板 downloadExl() { // 标题 const tHeader [‘xxx’,xxx,xx名称,电枪xx,协议xx,snxx]; // key const filterVal [agentName, stationName, equName, channelNumber, manufacturer, sn, ]; // 值 const datas [ { agentName: 你好, stationName: 我们, e…

【实战教程】改进YOLOv5与Seg网络结合:实时车道线精准识别系统(含源码及部署步骤)

1.研究的背景 随着自动驾驶技术的不断发展,车道线的实时分割成为了自动驾驶系统中的重要任务之一。车道线的准确分割可以为自动驾驶系统提供重要的环境感知信息,帮助车辆进行准确的路径规划和决策。因此,开发一种高效准确的车道线实时分割系…

Threejs_11 补间动画的实现

啥是补间动画呢?其实就是我们在threejs中移动一个物体的时候,不让他是瞬时移动,让他跟css动画的transition一样,有个过度效果,就是补间动画。补间动画如何设置呢? 补间动画实现 1.引入补间动画库 在我们…

爬取春秋航空航班信息

一、使用fiddler爬取小程序春秋航空航班信息 使用Fiddler爬取春秋航空微信小程序(手机上由于网络问题,无法进入,使用电脑版) 搜索航班信息 搜索记录 使用Fiddler查找url(没有得到有效url) 继续查找,发现航班信息列…

前端实现表格生成序号001、002、003自增

我们最终想要实现的效果如图&#xff0c;从后端获取数据之后&#xff0c;不使用data中的id&#xff0c;而是使用自己生成的按照顺序自增的序号id。 script <template><el-table :data"sticker" border style"width: 100%" id"stickerList&q…

uniapp 富文本以及移动端富文本的展示问题

富文本展示有几种方式: 1.<view v-html"content"></view> 2. uniapp自带组件 rich-text rich-text | uni-app官网 <rich-text :nodes"content"></rich-text> 3.uView组件 u-parse Parse 富文本解析器 | uView 2.0 - 全面兼…