Linux——rootfs根文件系统构建

根文件系统也叫做rootfs

FATFS这类的文件系统属于Linux内核的一部分,属于软件代码,所以ROOTFS不等于FATFS。

Linux的根文件系统实际上是一个文件夹或者叫目录,这个目录下会有许多子目录,这些目录中存放许多Linux运行所必须的文件,比如库、常用的软件和命令、设备文件、配置文件等等

例如我们装一个Windows系统,C盘中回存放系统正常运行所需要的文件,这个C盘就相当于我们的根文件系统。

常用目录

/bin 目录

 此目录下存放系统需要的可执行文件,一般都是一些命令,比如ls、mv等命令

 /dev 目录

此目录的文件都是和设备有关的,例如/dev/ttymxc0就表示IMX6ULL的串口0

/etc 目录

此目录下存放着各种配置文件

/lib 目录

此目录下存放着 Linux 所必须的库文件。这些 库文件是共享库,命令和用户编写的应用程序要使用这些库文件

/mnt 目录

临时挂载目录,一般是空目录,可以在此目录下创建空的子目录

/proc 目录

此目录一般是空的,当 Linux 系统启动以后会将此目录作为 proc 文件系统的挂载点,proc 是个虚拟文件系统,没有实际的存储设备。proc 里面的文件都是临时存在的,一般用来存储系统运行信息文件。

/usr 目录

usr 不是 user 的缩写,而是 Unix Software Resource 的缩写,也就是 Unix 操作系统 软件资源目录

/var 目录

此目录存放一些可以改变的数据

/sbin 目录

此目录也是存放一些可执行文件,不过只有管理员才能使用

/sys 目录

 此目录是系统启动后sysfs文件系统的挂载点,sysfs是一个类似proc文件系统的特殊文件系统

 /opt目录

可选的文件、软件存放区,由用户选择将哪些文件或软件放到此目录中

BusyBox构建根文件系统

构建根文件系统busybox,还有很多成熟的根文件系统构建方式,buildroot,yocto。

构建的根文件调试我们通过nfs网络挂载,也就是根文件系统存放到ubuntu下,开发板启动以后通过nfs服务使用ubuntu下的根文件系统。

将busybox压缩包通过ftp传输到ubuntu下

1、解压缩后修改Makefile添加交叉编译器

CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-g     nueabihf/arm-linux-gnueabihf-
ARCH ?= arm

2、busybox支持中文字符

修改busybox源码,取消busybox对中文显示的限制,打开文件 busybox1.29.0/libbb/printable_string.c,找到函数 printable_string

屏蔽掉

 修改

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

修改

makemenuconfig进入图形配置界面

不选

 选择动态编译(静态编译不需要库文件,但是编译出来的库会很大,并且DNS会出问题,无法解析域名,动态编译要求根文件系统中有库文件,但是编译出来的busybox会小很多)

 选中

取消勾选

 确保括号中全部选中

选中

 保存退出

编译busybox

将编译结果放到指定路径 

make install CONFIG_PREFIX=/home/zzs/linux/bfs/rootfs

向根文件系统添加lib库

Linux中的应用程序一般都是需要动态库的,所以我们需要先在根文件系统中添加动态库

拷贝库文件

库文件就是交叉编译器的库文件,lib库文件从交叉编译器中获取

 进入如下路径对应的目录:

/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib

将此目录下所有的*so*和.a 文件都拷贝到 rootfs/lib 目录中,拷贝命令如下:

cp *so* *.a /home/zzs/linux/nfs/rootfs/lib/ -d

“-d”表示拷贝符号链接

现在有一个问题就是ld-linux-armhf.so.3不能作为符号链接,否则在根文件系统中执行程序无法执行,所有我们要将ld-linux-armhf.so.3由快捷方式变为本尊,方法是将ld-linux-armhf.so.3删掉,然后重新复制一份,不复制软链接

rm ld-linux-armhf.so.3
cp ld-linux-armhf.so.3 /home/zzs/linux/nfs/rootfs/lib/

拷贝完成之后再到rootfs/lib目录下查看ld-linux-armhf.so.3文件详情信息,此文件已经不是一个软链接,变成一个实实在在的库文件

-l 表示显示长目录,包括文件权限,上一次的编译时间,文件大小等信息

进入如下目录,将目录下所有的*so*和*.a库文件,我们将其也拷贝到rootfs/lib目录中,命令如下:

/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
cp *so* *.a /home/zzs/linux/nfs/rootfs/lib/ -d

在rootfs的usr目录下创建lib文件夹

mkdir lib

拷贝下面目录下的so和.a库文件到rootfs/usr/lib目录下,命令如下:

/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
cp *so* *.a /home/zzs/linux/nfs/rootfs/usr/lib/ -d

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

根文件系统初步测试

uboot命令行中设置bootargs

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.130:/home/zzs/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.101:192.168.1.130:192.168.1.1:255.255.255.0::eth0:off'
saveenv //保存环境变量 

设置完成之后用boot命令启动Linux内核

用ls命令可以看出进入了根文件系统

但可以明显看出还存在一些问题,提示有错误,是因为缺少一些文件导致的,下面我们继续来完善我们的根文件系统:

完善根文件系统

在rootfs中创建/etc/init.d/rcS文件,然后在里面输入以下内容:

编写完成保存之后给予它可执行权限

chmod 777 rcS

错误解决:

创建/etc/fstab文件

在rootfs的etc目录下创建fstab文件,内容如下:

#<file system>   <mount point>    <type>      <options>   <dump>  <pass> 
proc              /proc            proc        defaults    0        0 
tmpfs             /tmp             tmpfs       defaults    0        0 
sysfs             /sys             sysfs       defaults    0        0 

重新启动Linux内核

创建/etc/initab文件

#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

根文件系统其他功能测试

软件运行测试

在ubuntu下编写一个简单的测试代码:

利用交叉编译器编译

arm-linux-gnueabihf-gcc hello.c -o hello 

将编译结果拷贝到rootfs/drivers中

cp hello /home/zzs/linux/nfs/rootfs/drivers

开发板重新启动Linux内核,进入drivers目录,运行我们的hello程序

cd drivers
./hello

终止运行的方法:

1、按ctrl+c

2、后台执行程序加&,使用“kill -9 pid(进程ID)”终止运行

后台运行

./hello &

利用ps可以看PID

终止后台运行的hello

kill -9 77

开机自启动设置

进入根文件系统的时候会运行/etc/init.d/rcS这个shell脚本,因此我们可以在这个脚本里面添加自启动相关内容。

 无法解析出域名IP问题

设置域名服务器地址

在根文件系统中创建/etc/resolv.conf文件,然后编写下面的内容:

 域名解析成功

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

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

相关文章

go语言的成神之路-标准库篇-os标准库

一、权限 在操作系统&#xff08;OS&#xff09;中&#xff0c;标准库的权限管理是非常重要的&#xff0c;它确保了不同用户和进程能够安全地访问系统资源。以下是一些常见的权限概念和说明&#xff1a; 1.用户权限 用户ID&#xff08;UID&#xff09;&#xff1a;每个用户在…

【OpenCV】直方图

理论 可以将直方图视为图形或曲线图&#xff0c;从而使您对图像的强度分布有一个整体的了解。它是在X轴上具有像素值(不总是从0到255的范围)&#xff0c;在Y轴上具有图像中相应像素数的图。 这只是理解图像的另一种方式。通过查看图像的直方图&#xff0c;您可以直观地了解该…

【PlantUML系列】用例图(三)

目录 一、组成部分 二、典型案例 一、组成部分 参与者&#xff08;Actors&#xff09;&#xff1a;使用关键字 actor 后跟参与者的名称。用例&#xff08;Use Cases&#xff09;&#xff1a;使用关键字 usecase 后跟用例的名称和编号&#xff08;可选&#xff09;。系统边界…

Transformer部分知识点解释

传统Transformer 经典QKV算法 Transformer架构的优势与问题 万能模型&#xff0c;直接套用&#xff0c;代码实现简单&#xff0c;现成例子一大片并行的&#xff0c;比LSTM快&#xff0c;全局信息丰富&#xff0c;注意力机制效果好长序列中attention需要每一个点跟其他点计算(…

聚类及Python下实现 K-means 算法

聚类 聚类是无监督学习中的一种重要方法&#xff0c;旨在将数据集中相似的数据对象划分到同一个簇中&#xff0c;使得不同簇之间的数据对象差异尽可能大。在大数据环境下&#xff0c;聚类可以帮助挖掘数据中的隐藏结构和模式&#xff0c;应用场景十分广泛&#xff0c;比如在客…

LabVIEW调用Thorlabs的动态库进行开发

Thorlabs 产品在科研与生产领域中的应用广泛&#xff0c;当需要基于LabVIEW 进行二次开发时&#xff0c;可按照以下方法操作&#xff0c;以充分发挥设备性能并满足特定的项目需求。 创建 Kinesis LabVIEW 项目文件和文件夹 更详细的说明参见附件 在 LabVIEW 的启动界面中选择…

三、Zookeeper

Zookeeper 三、Zookeeper3.1什么是zookeeper?3.2为什么需要zookeeper3.3Zookeeper基本运行流程3.4Zookeeper数据模型3.5Zookeeper主要角色3.6Zookeeper工作原理3.7Zookeeper节点数据操作流程三、Zookeeper 3.1什么是zookeeper? ZooKeeper是一个分布式的,开放源码的分布式应…

实现盘盈单自动化处理:吉客云与金蝶云星空数据对接

盘盈单103v2对接其他入库&#xff1a;吉客云数据集成到金蝶云星空 在企业信息化管理中&#xff0c;数据的高效流转和准确性至关重要。本文将分享一个实际案例&#xff0c;展示如何通过轻易云数据集成平台&#xff0c;将吉客云的数据无缝对接到金蝶云星空&#xff0c;实现盘盈单…

vue:构造结构,塞入数据:结构不变,数据改变

1. 引入vue 2. 创建页面容器&#xff0c;让vue去管理这个容器 3. 双向绑定 4. 单向绑定 5. 操作容器&#xff08;数据模型&#xff09;里的数据 5. 单向绑定的简写 6. v-if和v-else 6. v-if和v-show的区别&#xff1a; v-if要重新渲染界面&#xff0c;v-show只需要改一下元素属…

CountDownLatch阻塞后countDown未执行会如何?

背景 某项目封装了 Kafka 消费者 API&#xff0c;根据传递的消费者线程数&#xff0c;创建 N 个消费者线程同时消费对应 topic 的数据&#xff0c;并在线程启动后收集到全局列表中&#xff0c;方便在程序调用 stop 流程时逐个停止。 主控类在创建 Kafka 消费线程时使用了 Cou…

NLP与LLM的工程化实践与学习思考 - 说说知识图谱

NLP与LLM的工程化实践与学习思考[24年半年工作总结] - 说说知识图谱 0 真的就是先说说1 为什么知识图谱什么是知识图谱&#xff1f;基于图的数据结构&#xff1f;基于数据结构的图&#xff1f;知识图谱的技术要点两个技术维度&#xff1a;知识、图七个技术要点&#xff1a;表示…

【CVE-2024-5660】ARM CPU漏洞:硬件页面聚合(HPA)安全通告

安全之安全(security)博客目录导读 目录 一、概述 二、修改历史 三、什么是硬件页面聚合&#xff1f; 四、修复解决 一、概述 在一些基于arm的cpu中发现了一个问题&#xff0c;该问题可能允许修改的、不受信任的客户机操作系统&#xff08;guest OS&#xff09;危及某些H…

项目中使用AntV L7地图(五)添加飞线

项目中使用AntV L7地图&#xff0c;添加 飞线 文档地址&#xff1a;https://l7.antv.antgroup.com/zh/examples/line/animate/#trip_animate 一、初始化地图 使用的地图文件为四川地图JSON&#xff0c;下载地址:https://datav.aliyun.com/portal/school/atlas/area_selector#&…

《九重紫》逐集分析鉴赏—序言、概览、框架分析

主标题&#xff1a;《九重紫》一起追剧吧副标题&#xff1a;《九重紫》逐集分析鉴赏—序言、概览、框架分析《永夜星河》后&#xff0c;以为要浅尝剧荒&#xff0c;一部《九重紫》突出重围。 看了宣传片感觉不是很差&#xff0c;看了部分剪辑感觉还可以&#xff0c;看了一两集感…

生成式AI概览与详解

1. 生成式AI概览&#xff1a;什么是大模型&#xff0c;大模型应用场景&#xff08;文生文&#xff0c;多模态&#xff09; 生成式AI&#xff08;Generative AI&#xff09;是指通过机器学习模型生成新的数据或内容的人工智能技术。生成式AI可以生成文本、图像、音频、视频等多种…

0001.简易酒店管理系统后台

一.系统架构 springmvcjsplayuimysql 二.功能特性 简单易学习&#xff0c;虽然版本比较老但是部署方便&#xff0c;tomcat环境即可启用&#xff1b;代码简洁&#xff0c;前后端代码提供可统一学习&#xff1b;祝愿您能成尽快为一位合格的程序员&#xff0c;愿世界没有BUG; …

STM32软件IIC驱动TCA9548A多路测量AHT10

STM32软件IIC驱动TCA9548多路测量AHT10 TCA9548AAHT10代码逻辑代码展示现象总结 TCA9548A TCA9548A 有八个可通过 I2C 总线控制的双向转换开关&#xff0c;SCL/SDA 上行对扩展到八个下行对&#xff0c;或者通道&#xff0c;适用于系统中存在I2C目标地址冲突的情况。8路双向转换…

信奥赛CSP-J复赛集训(dfs专题)(15):洛谷P8838:[传智杯 #3 决赛] 面试

信奥赛CSP-J复赛集训(dfs专题-刷题题单及题解)(15):洛谷P8838:[传智杯 #3 决赛] 面试 题目背景 disangan233 和 disangan333 去面试了,面试官给了一个问题,热心的你能帮帮他们吗? 题目描述 现在有 n n n 个服务器,服务器

ARM学习(36)静态扫描规则学习以及工具使用

笔者来学习了解一下静态扫描以及其规则&#xff0c;并且亲身是实践一下对arm 架构的代码进行扫描。 1、静态扫描认识 静态扫描&#xff1a;对代码源文件按照一定的规则进行扫描&#xff0c;来发现一些潜在的问题或者风险&#xff0c;因为不涉及代码运行&#xff0c;所以其一般…

Python机器学习笔记(五、决策树集成)

集成&#xff08;ensemble&#xff09;是合并多个机器学习模型来构建更强大模型的方法。这里主要学习两种集成模型&#xff1a;一是随机森林&#xff08;random forest&#xff09;&#xff1b;二是梯度提升决策树&#xff08;gradient boosted decision tree&#xff09;。 1…