Linux驱动开发笔记(十九)文件系统的构建

文章目录

  • 前言
  • 一、文件系统
    • 1.1 Linux系统的组成
    • 1.2 什么是文件系统
  • 二、根文件系统的制作工具
  • 三、busybox
    • 3.1 什么是busybox
    • 3.2 制作流程
  • 四、buildroot
    • 4.1 什么是Buildroot
    • 4.2 制作流程


前言

  上节我们在mdev实验进行配置时,利用了busybox,这里着重对这部分进行学习。


一、文件系统

1.1 Linux系统的组成

  一个完整的嵌入式Linux系统包括uboot,kernel,根文件系统三个部分。其启动顺序为:系统上电时,先执行uboot,由其引导kernel,根最后挂载根文件系统。

1.2 什么是文件系统

  文件系统可直观的理解为Windows上的文件资源管理器,Linux启动后一定要挂载一个文件系统,这样程序才能被执行。文件系统可大可小,通过构造文件系统可衍生QT,ubuntu,android等系统。Linux还有一个重要思想:一切皆文件,像串口,led,按键等这些硬件设备,都可以归结为像文件一样的操作,如read,write,open,close。
  根文件系统也是文件系统的一个,是挂载在根目录,有特定目录构成的文件系统,如下图所示。
在这里插入图片描述

  • /bin:包含基本用户命令的二进制可执行文件,例如:ls, cp, mv, rm 等。
  • /boot:存放启动加载程序及其配置文件以及Linux内核映像文件。
  • /dev:包含设备文件,每个文件代表系统中的一个设备,例如:硬盘、终端、打印机等。
  • /etc:系统的配置文件和脚本存放目录,包括启动脚本、网络配置文件、用户密码文件等。
  • /home:用户的主目录,每个用户都有一个单独的目录,存放用户的个人文件和配置。
  • /lib:存放系统和应用程序所需的共享库文件以及内核模块。
  • /media:自动挂载的可移动媒体设备(如CD-ROM、USB驱动器)目录。
  • /mnt:临时挂载文件系统的挂载点,用于手动挂载文件系统。
  • /opt:可选的应用程序包存放目录,通常用于安装第三方软件。
  • /proc:一个虚拟文件系统,提供系统进程和内核信息。
  • /root:超级用户(root)的主目录。
  • /run:存放应用程序和服务启动时创建的临时文件。
  • /sbin:包含系统管理的二进制可执行文件,通常只有超级用户可以运行,例如:ifconfig, reboot, shutdown 等。
  • /sys:一个虚拟文件系统,提供设备和内核模块信息。
  • /tmp:存放临时文件,系统重启后该目录下的文件通常会被删除。
  • /usr:用户二进制文件和只读数据的目录,包含子目录:
    • /usr/bin:用户命令的二进制可执行文件。
    • /usr/lib:库文件。
    • /usr/sbin:超级用户的系统管理命令。
    • /usr/share:共享数据文件。
    • /usr/local:本地自定义安装的软件和文件。
  • /var:可变数据文件目录,例如日志文件、邮件、缓存等。

二、根文件系统的制作工具

  制作根文件系统(Root Filesystem,RootFS)是构建嵌入式系统或定制操作系统的重要步骤。根文件系统包含系统启动所需的所有文件和目录,包括内核模块、系统库、应用程序和配置文件。在Linux开发中,最常用的制作工具为以下5种:

工具名称优点缺点
busybox体积小,支持常用命令,定制小系统功能不全,无包管理工具
buildroot结构简单,容易理解,可产生完整镜像无包管理工具
yocto支持的框架较多,可产生完整镜像配置复杂,不利用新手
Ubuntu结构简单,有包管理工具,支持ROS 1x等机器人操作系统构建文件系统较大
Debian结构简单,有包管理工具,支持可视化界面构建文件系统较大

三、busybox

3.1 什么是busybox

  BusyBox 是一个用于嵌入式系统的通用工具包,它将许多常见的Linux实用程序组合成一个小巧的可执行文件。BusyBox 提供了许多与大型 GNU Core Utilities 相同的功能,但它们经过优化以尽量减少可执行文件和所需内存的大小。

  • 主要特性
    • 集成度高:
      BusyBox 将众多 UNIX 工具整合为一个单一的可执行文件,这使得它非常适合资源受限的嵌入式系统。
      它支持包括 ls, cp, mv, rm, cat, echo, grep, awk 等在内的多种命令。
    • 可配置性强:
      可以通过配置选项选择需要的功能,从而裁剪出适合特定需求的 BusyBox 二进制文件。
      支持静态编译和动态编译,适应不同的系统需求。
    • 小巧高效:
      由于其小巧的体积和高效的设计,BusyBox 非常适合用于嵌入式系统,如路由器、嵌入式 Linux 设备等。
    • 广泛的指令集支持:
      支持多种处理器架构,包括 ARM、x86、MIPS、PowerPC 等,适应不同的硬件平台。
  • 常见用法
    • 系统初始化:
      BusyBox 常被用作系统启动过程中初始化脚本的核心工具,通过提供基础命令来挂载文件系统、启动服务等。
    • 救援系统:
      在系统崩溃或故障时,BusyBox 可以作为紧急救援系统使用,提供基本的系统修复工具。
    • 嵌入式系统:
      由于其小巧和高效,BusyBox 广泛用于各种嵌入式 Linux 系统,如路由器、智能家居设备、工业控制系统等。

3.2 制作流程

  1. 下载BusyBox
wget https://busybox.net/downloads/busybox-1.33.1.tar.bz2
tar xvjf busybox-1.33.1.tar.bz2
cd busybox-1.33.1
  1. 配置交叉编译工具和相关设置
//打开图形界面
make defconfig
make menuconfig//输入交叉编译工具位置,大致是这样的格式,和你具体的位置有关
.../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-

  打开图形界面后,在设置里找到Cross compiler prefix ,设置交叉编译工具地址
图形界面

  1. 创建根文件系统目录
mkdir -p rootfs/{bin,sbin,etc,usr,lib,var,dev,proc,sys,tmp}
  1. 安装BusyBox
make CONFIG_PREFIX=./rootfs install
  1. 完善固件库文件
//进入生成的rootfs目录下的lib目录
cd lib
//将交叉编译文件里面的lib复制过来
cp .../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib* . -rffd
  1. 创建启动脚本
mkdir -p rootfs/etc/init.d
sudo sh -c 'echo "#!/bin/sh\nmount -t proc none /proc\nmount -t sysfs none /sys\nexec /bin/sh" > rootfs/etc/init.d/rcS'
sudo chmod +x rootfs/etc/init.d/rcS

注:init.d/rcS 文件是系统启动时执行的初始化脚本,通常会在这里编写需要的启动项和初始化步骤。你可以在这个文件中添加任何需要在系统启动时执行的命令,例如挂载文件系统、启动服务、设置网络等。

  1. 配置启动文件
sudo sh -c 'echo "::sysinit:/etc/init.d/rcS" > rootfs/etc/inittab'
  1. 打包根文件系统
  • 方案一:压缩包形式
cd rootfs
sudo tar -czf ../rootfs.tar.gz .

将 rootfs.tar.gz 解压到目标文件系统中,并在启动时挂载。

  • 方案二:镜像形式
dd if=/dev/zero of=rootfs.img bs=1M count=64  # 创建一个空的 64MB 文件
mkfs.ext4 rootfs.img                          # 格式化为 ext4 文件系统
mkdir -p /mnt/rootfs
sudo mount -o loop rootfs.img /mnt/rootfs     # 挂载
sudo cp -r rootfs/* /mnt/rootfs               # 复制文件系统内容
sudo umount /mnt/rootfs                       # 卸载

将 rootfs.img烧录到设备中,并在启动时挂载。

四、buildroot

4.1 什么是Buildroot

  Buildroot 是一个用于构建嵌入式 Linux 系统的开源项目。它通过提供简便的配置接口和自动化工具,能够从源码生成一个完整的嵌入式 Linux 系统,包括引导加载程序、Linux 内核和根文件系统。由于 Buildroot 提供了自动化的配置和生成过程,所以在使用 Buildroot 构建嵌入式 Linux 系统时,通常不需要手动编写启动项或者创建目录文件。

4.2 制作流程

  1. 获取 Buildroot
git clone https://git.busybox.net/buildroot
cd buildroot
  1. 配置 Buildroot
    同样使用 make menuconfig 命令配置 Buildroot。该命令会打开一个基于菜单的配置界面:
    在配置界面中,可以配置以下内容:
    • 目标架构(Target Architecture)
    • 目标架构变种(Target Architecture Variant)
    • 工具链(Toolchain)
    • 包管理器(Target Packages)
    • 系统配置(System Configuration)
  2. 构建系统
    配置完成后,使用 make 命令开始构建整个系统:
    Buildroot 会根据配置下载、解压、编译并安装所有所需的软件包。这一过程可能需要一些时间,取决于所选择的软件包和系统的性能。
  3. 生成的输出
    构建完成后,生成的输出文件位于 output/images 目录中,包含以下文件:
    • 引导加载程序(如 U-Boot)
    • Linux 内核镜像(如 zImage 或 uImage)
    • 根文件系统映像(如 rootfs.ext2、rootfs.tar.gz 等)
  4. 烧录到设备

免责声明:本实验基于网络上的公开资料若有侵权请联系作者删除。

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

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

相关文章

活动预告|想更了解流式数据湖?亚马逊云科技数据开源软件-流式数据湖 Tech Talk来啦!

活动介绍 本次活动旨在探索在亚马逊云科技上构建和使用开源数据软件产品的一些最佳实践,特别关注流式数据湖的构建。活动将在线上举行,汇聚来自 AutoMQ Apache paimon和亚马逊云科技的顶尖专家,分享他们在这一领域的最新进展和实际经验。参与…

旗晟巡检机器人的应用场景有哪些?

巡检机器人作为现代科技的杰出成果,已广泛应用于各个关键场景。从危险的工业现场到至关重要的基础设施,它们的身影无处不在。它们以精准、高效、不知疲倦的特性,担当起保障生产、守护安全的重任,为行业发展注入新的活力。那么&…

2024华为数通HCIP-datacom最新题库(变题更新⑥)

请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了,如果你准备去考试,还是用的之前的题库,切记暂缓。 1、…

【Elasticsearch7】3-基本操作

目录 RESTful 数据格式 HTTP操作 索引操作 倒排索引 创建索引 查看所有索引 查看单个索引 删除索引 文档操作 创建文档 查看文档 ​编辑 全量修改 ​编辑局部修改 删除文档 条件删除文档 高级查询 条件查询 URL带参查询 请求体带参查询 带请求体方式的查…

使用GPT3.5,LangChain,FAISS和python构建一个本地知识库

引言 介绍本地知识库的概念和用途 在现代信息时代,我们面临着海量的数据和信息,如何有效地管理和利用这些信息成为一项重要的任务。本地知识库是一种基于本地存储的知识管理系统,旨在帮助用户收集、组织和检索大量的知识和信息。它允许用户…

java8新特性

目录 一. lambda 1. 为什么要有lambda 2.功能接口 3. 使用lambda的条件 二. Stream流 1. 获取流 1.1 将集合转为流 1.2 将数组转为流 1.3 将相同数据类型的数据转为流 1.4 将文件里的内容转为流 2. 中间操作 3. 终端操作 一. lambda lambda:本质上就是将函数当做参…

Python | Leetcode Python题解之第240题搜索二维矩阵II

题目&#xff1a; 题解&#xff1a; class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:m, n len(matrix), len(matrix[0])x, y 0, n - 1while x < m and y > 0:if matrix[x][y] target:return Trueif matrix[x][y] > tar…

印尼语翻译通:AI驱动的智能翻译与语言学习助手

在这个多元文化交织的世界中&#xff0c;语言是连接我们的桥梁。印尼语翻译通&#xff0c;一款专为打破语言障碍而生的智能翻译软件&#xff0c;让您与印尼语的世界轻松接轨。无论是商务出差、学术研究&#xff0c;还是探索印尼丰富的文化遗产&#xff0c;印尼语翻译通都是您的…

基于luckysheet实现在线电子表格和Excel在线预览

概述 本文基于luckysheet实现在线的电子表格&#xff0c;并基于luckyexcel实现excel文件的导入和在线预览。 效果 实现 1. luckysheet介绍 Luckysheet &#xff0c;一款纯前端类似excel的在线表格&#xff0c;功能强大、配置简单、完全开源。 官方文档在线Demo 2. 实现 …

抖音seo短视频矩阵源码系统开发搭建----开源+二次开发

抖音seo短视频矩阵源码系统开发搭建 是一项技术密集型工作&#xff0c;需要对大数据处理、人工智能等领域有深入了解。该系统开发过程中需要用到多种编程语言&#xff0c;如Java、Python等。同时&#xff0c;需要使用一些框架和技术&#xff0c;如Hadoop、Spark、PyTorch等&am…

小程序-设置环境变量

在实际开发中&#xff0c;不同的开发环境&#xff0c;调用的接口地址是不一样的 例如&#xff1a;开发环境需要调用开发版的接口地址&#xff0c;生产环境需要正式版的接口地址 这时候&#xff0c;我们就可以使用小程序提供了 wx.getAccountInfoSync() 接口&#xff0c;用来获取…

iterator(迭代器模式)

引入 在想显示数组当中所有元素时&#xff0c;我们往往会使用下面的for循环语句来遍历数组 #include <iostream> #include <vector>int main() {std::vector<int> v({ 1, 2, 3 });for (int i 0; i < v.size(); i){std::cout << v[i] << &q…

甄选范文“论软件维护方法及其应用”软考高级论文,系统架构设计师论文

论文真题 软件维护是指在软件交付使用后,直至软件被淘汰的整个时间范围内,为了改正错误或满足 新的需求而修改软件的活动。在软件系统运行过程中,软件需要维护的原因是多种多样的, 根据维护的原因不同,可以将软件维护分为改正性维护、适应性维护、完善性维护和预防性 维护…

持续集成02--Linux环境更新/安装Java新版本

前言 在持续集成/持续部署&#xff08;CI/CD&#xff09;的旅程中&#xff0c;确保开发环境的一致性至关重要。本篇“持续集成02--Linux环境更新/安装Java新版本”将聚焦于如何在Linux环境下高效地更新或安装Java新版本。Java作为广泛应用的编程语言&#xff0c;其版本的更新对…

昇思25天学习打卡营第六天|应用实践/计算机视觉/Vision Transformer图像分类

心得 运行模型似乎有点靠天意&#xff1f;每次跑模型之前先来个焚香沐浴&#xff1f;总之今天是机器视觉的最后一课了&#xff0c;尽管课程里强调模型跑得慢&#xff0c;可是我的这次运行&#xff0c;居然很快的就看到结果了。 如果一直看我这个系列文章的小伙伴&#xff0c;…

《ElementUI/Plus 基础知识》el-tree 之修改可拖拽节点的高亮背景和线

前言 收到需求&#xff0c;PM 觉得可拖拽节点的高亮背景和线样式不明显&#xff01;CSS 样式得改&#xff01; 注意&#xff1a;下述方式适用于ElementUI el-tree 和 ElementPlus el-tree&#xff01; 修改 拖拽被叠加节点的背景色和文字 关键类名 is-drop-inner .el-tree…

汽车零部件制造企业MES系统主要功能介绍

随着汽车工业的不断发展&#xff0c;汽车零部件制造企业面临着越来越高的生产效率、质量控制和成本管理要求。MES系统作为一种综合信息系统&#xff0c;能够帮助企业实现从订单接收到产品交付的全流程数字化管理&#xff0c;优化资源配置&#xff0c;提高生产效率&#xff0c;确…

Java中消耗掉换行符

scanner.nextLine(); // 消耗掉换行符 这行代码的作用是读取并丢弃输入流中的换行符。这是因为在使用 Scanner 对象读取用户输入时&#xff0c;有时候会在输入流中留下未处理的换行符&#xff0c;这可能会导致后续的输入读取出现问题。 具体来说&#xff0c;当你使用 Scanner …

vue2学习笔记7 - Vue中的MVVM模型

MVVM Model-View-viewModel是一种软件架构模式&#xff0c;用于将用户界面&#xff08;View&#xff09;与业务逻辑&#xff08;Model&#xff09;分离&#xff0c;并通过ViewModel进行连接和协调。MVVM模式的目标是实现视图与模型的解耦&#xff0c;提高代码的可读性、可维护…

django报错(一):python manage.py makemigrations,显示“No changes detected”

执行python manage.py makemigrations命令无任何文件生成&#xff0c;结果显示“No changes detected”。 解决方案一&#xff1a; 1、执行命令&#xff1a;python manage.py makemigrations –empty appname 2、删除其中的0001_initial.py文件&#xff08;因为这个文件内容是…