系统移植(十一)根文件系统(未整理)
文章目录
- 一、根文件系统中各个目录文件功能解析:
- 二、对busybox进行配置和编译
- (一)执行make help命令获取make的帮助信息
- (二)对busybox源码进行配置,配置交叉编译器
- (三)执行make menuconfig命令,通过图形化界面对busybox源码进行配置
- 1. 使用静态编译,不使用共享库
- 2. 指定跟文件系统的安装路径
- 3. 配置VI风格的命令行编译器
- 4. 配置支持所有的模块化的命令
- (四)编译busybox源码
- (五)安装根文件系统,生成对应的根文件系统
- (六)添加根文件系统中必要的文件
- 1. 创建/etc/init.d/rcS文件
- 2. 创建/etc/fstab文件
- 3. 创建/etc/profile配置文件
- 4. 创建etc/inittab文件
- (七)移植动态库文件
- 三、 将rootfs根文件系统打包生成单个的ramdisk.img镜像文件
- 1. 进入到家目录下
- 2. 使用dd命令制作一个64M大小的ramdisk单个文件
- 3. 使用mkfs.ext4对ramdisk进行格式化,格式化为ext4格式
- 4. 将ramdisk 挂载到/mnt目录
- 5. 查看自己制作的跟文件系统的大小
- 6. 使用strip命令压缩文件的体积
- 7. 将~/rootfs中的内容拷贝到/mnt目录下,相当于拷贝到ramdisk文件中
- 8. 解除挂载
- 9. 使用gzip对ramdisk进行压缩
- 10. 使用mkimage命令给ramdisk.gz文件添加64字节的数据头得到ramdisk.img镜像文件
- 11. 拷贝ramdisk.img到~/tftpboot目录下
- 12. 测试ramdisk.img镜像文件
一、根文件系统中各个目录文件功能解析:
bin: 命令文件(通过busybox工具制作)
linuxrc:根文件系统被挂载后运行的第一个程序(通过busybox工具制作)
sbin: 超级用户命令、一般用户不可用(板子本身是超级用户通过busybox工具制作)
usr: 用户文件(通过busybox工具制作)
以下几个目录使用mkdir命令手动创建
dev: 设备文件(被操作系统识别的设备才有对应的文件,即设备运行时)
etc: 配置文件(配置内核相关的一些信息)
lib: 库文件、比如C的标准库(从交叉编译工具链中复制的)
mnt: 共享目录(非必要)比如挂载SD卡等时将SD卡挂载在该目录
proc: 与进程相关的文件(当有进程运行时才会有文件)
root: 用户权限(板子本身就是以root用户运行)
sys: 系统文件(系统运行时,系统加载后才会有文件)
tmp: 临时文件(比如插入新的设备时会产生临时文件)
var: 存放下载的文件和软件 (可有可无)
home: 用户家目录
二、对busybox进行配置和编译
(一)执行make help命令获取make的帮助信息
(二)对busybox源码进行配置,配置交叉编译器
修改busybox源码目录下的Makefile文件
将以下内容:
190 ARCH ?= $(SUBARCH)
164 CROSS_COMPILE ?=
修改为:
190 ARCH ?= arm
164 CROSS_COMPILE ?= arm-linux-gnueabihf-
(三)执行make menuconfig命令,通过图形化界面对busybox源码进行配置
1. 使用静态编译,不使用共享库
Settings ---> [*] Build static binary (no shared libs)
2. 指定跟文件系统的安装路径
Settings ---> (./rootfs) Destination path for 'make install'
3. 配置VI风格的命令行编译器
Settings ---> [*] vi-style line editing commands
4. 配置支持所有的模块化的命令
Linux Module Utilities --->[ ] Simplified modutils
(四)编译busybox源码
(五)安装根文件系统,生成对应的根文件系统
(六)添加根文件系统中必要的文件
1. 创建/etc/init.d/rcS文件
如果不创建,会产生以下错误:
2. 创建/etc/fstab文件
3. 创建/etc/profile配置文件
4. 创建etc/inittab文件
拷贝ARM版本的动态库,到自己移植的根文件系统的lib路径下
(七)移植动态库文件
三、 将rootfs根文件系统打包生成单个的ramdisk.img镜像文件
1. 进入到家目录下
$ cd ~
2. 使用dd命令制作一个64M大小的ramdisk单个文件
$ sudo dd if=/dev/zero of=ramdisk bs=1M count=64
ramdisk文件最多可以存储64M大小的数据
- 注:
dd
:是一个用于转换和复制文件的命令行实用程序。它可以用来生成特定大小和内容的文件,也可以用来转换文件中的数据格式。if=/dev/zero
:if是input file的缩写,指定输入文件。
/dev/zero
是一个特殊的文件,读取它会得到无限的零值(\0,即二进制中的0)。在这个命令中,它被用作数据源,意味着dd命令将从/dev/zero读取数据。of=ramdisk
:of是output file的缩写,指定输出文件。在这个例子中,输出文件被命名为ramdisk。如果该文件不存在,dd命令会创建它;如果文件已存在,dd命令会覆盖它。bs=1M
:bs是block size的缩写,用于指定块的大小,即每次读写操作处理的数据量。在这个命令中,块大小被设置为1MB(兆字节)。这意味着dd命令每次从/dev/zero读取1MB的数据,然后写入到ramdisk文件中。count=64
:这个选项指定了要复制的块的数量。由于块大小是1MB,所以总共会写入64 * 1MB = 64MB的数据到ramdisk文件中。
3. 使用mkfs.ext4对ramdisk进行格式化,格式化为ext4格式
$ sudo mkfs.ext4 -F ramdisk
- 注:
mkfs.ext4
是用于在设备上创建 ext4 文件系统的命令行工具。它通常用于格式化硬盘分区、USB驱动器或其他存储设备。mkfs.ext4 需要一个块设备作为输入。-F
选项用于强制格式化。
4. 将ramdisk 挂载到/mnt目录
$ sudo mount -t ext4 ramdisk /mnt
5. 查看自己制作的跟文件系统的大小
$ du -h ~/rootfs // 可知rootfs达到151M,但是ramdisk只有64M
6. 使用strip命令压缩文件的体积
$ su root
$ /home/linux/toolchain/gcc-7.5.0/bin/arm-linux-gnueabihf-strip /home/linux/rootfs/lib/*
$ exit
$ du -h ~/rootfs // 压缩到49M
- 注:arm-linux-gnueabihf-strip压缩名,压缩文件的体积,压缩完成之后不影响文件的使用
压缩过后,rootfs的大小压缩为49M
7. 将~/rootfs中的内容拷贝到/mnt目录下,相当于拷贝到ramdisk文件中
$ sudo cp -raf ~/rootfs/* /mnt
- 注:
-r
或-R
:这是递归复制的选项。当复制目录时,这个选项会复制目录及其所有子目录和文件。没有这个选项,cp命令默认只复制文件,不复制目录。-a
:这是归档模式的选项,它实际上是-dR --preserve=all的简写。它尝试以尽可能保留原始文件属性(如时间戳、权限、所有权等)的方式复制文件。这对于复制目录树特别有用,因为它确保了复制后的目录树与原始目录树尽可能相同。然而,在这个命令中,-a选项与-r(或-R)一起使用时,-r是多余的,因为-a已经包含了递归复制的功能。-f
:这是强制(force)选项。它会导致cp命令覆盖目标位置上的同名文件,而不会询问用户确认。此外,如果目标目录不存在,并且没有使用-r(或-R)选项复制目录,-f选项还可以防止cp命令报错。但在这个命令中,由于使用了-r(或-R,与-a一起时),-f主要用于覆盖文件。
8. 解除挂载
$ sudo umount /mnt
9. 使用gzip对ramdisk进行压缩
$ gzip --best -c ramdisk > ramdisk.gz
10. 使用mkimage命令给ramdisk.gz文件添加64字节的数据头得到ramdisk.img镜像文件
$ mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
11. 拷贝ramdisk.img到~/tftpboot目录下
$ chmod 777 ramdisk.img
$ cp ramdisk.img ~/tftpboot
12. 测试ramdisk.img镜像文件
FSMP1A> setenv bootcmd "mmc dev 0;mmc read 0xc2000000 0x2000 0x4000;mmc read 0xc4000000 0x10000 0x200;mmc read 0xc5000000 0x21500 0x21500;bootm 0xc2000000 0xc5000000 0xc4000000"
FSMP1A> setenv bootargs root=/dev/ram console=ttySTM0,115200 initrd=0xc5000040,0x1000000 rw init=/linuxrc rootfstype=ext4
FSMP1A> saveenv
相关文章:

系统移植(十一)根文件系统(未整理)
文章目录 一、根文件系统中各个目录文件功能解析:二、对busybox进行配置和编译(一)执行make help命令获取make的帮助信息(二)对busybox源码进行配置,配置交叉编译器(三)执行make men…...
mac中docker常用命令总结
在Mac中,Docker的常用命令可以总结如下表格: 命令用途docker run运行一个新的容器实例。可以指定镜像名来启动容器,并支持多种参数来调整容器的运行方式。docker ps列出当前正在运行的容器。可以通过添加-a参数来列出所有容器(包…...

Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3(含分析过程)
Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3(含分析过程) 目录 Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3&#x…...
Linux 4: Bash
1 Bash环境 1 命令执行的顺序 1 绝对路径、相对路径 2 alias 3 内置的builtin 4 $PATH找到的第一个命令 2 bash的登录信息,保存在哪里? 保存在/etc/issue. 3 bash的环境配置文件 1 如果是login shell,读以下,有优先级:如果…...

第十四天学习笔记2024.7.25
Git安装 1.安装git 2.创建git仓库 3.创建文件并且提交文件 (git add . 将文件提交到缓存)(git commit -m 说明)(git log 查看历史) 4.分支创建与解决分支冲突问题 创建主机(git 192.1…...

花几千上万学习Java,真没必要!(三十七)
IO 流: 读取数据到内存的过程:可以包括从硬盘、网络或其他存储设备中将数据加载到内存中,以便程序能够访问和处理这些数据。 写入数据到硬盘的过程:通常是将内存中的数据保存到硬盘或其他持久性存储设备中,以便长期存…...
SSA-GRU(自适应平滑自回归门控循环单元)预测模型及其Python和MATLAB实现
SSA-GRU(自适应平滑自回归门控循环单元)预测模型是结合了SSA(Singular Spectrum Analysis,奇异谱分析)和GRU(Gated Recurrent Unit,门控循环单元)模型的一种时间序列预测方法。以下是…...

【ROS】让你的回调函数并行起来
【前言】 众所周知,ROS中的所有回调函数,都由 ros::spin() 这个家伙来统一管理和唤醒。这里说的是所有通过ROS方式创建出来的回调函数,比如ros::Subscriber、ros::Timer等等的回调函数。 【举例】 我们先来看一个示例节点: #i…...

M12电连接器的编码分类及应用领域分析
12电连接器的编码主要包括A、B、C、D、X、S、T、K、L等类型,每种编码都有其特定的应用场景和功能: A编码:适用于传感器、直流电、1G以太网。 B编码:主要用于PROFIBUS总线系统。 C编码:适用于交流电。 D编码&#x…...

基于YOLOv8的道路裂缝坑洼检测系统
基于YOLOv8的道路裂缝坑洼检测系统 (价格88) 包含 【“裂缝”,“凹坑”】 2个类 通过PYQT构建UI界面,包含图片检测,视频检测,摄像头实时检测。 (该系统可以根据数据训练出的yolov8的权重文件,运用在其他检测系…...

蓝鹏测径仪非标定制订制流程
测径仪通常属于非标定制设备,非标定制意味着这些设备不是按照标准规格批量生产的,而是根据特定的客户需求和应用场景设计和制造的。例如,某些测径仪可能需要特殊的测量范围、精度、传感器或软件来满足特定的工业检测要求。 测径仪非标定制的…...

vue基础3
1.推荐好用的第三方框架 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 1.moment.js 2.dayjs 2.收集表达数据 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Document</title><…...

LINUX -exec函数族
1、功能: *让父子进程来执行不相干的操作 *能够替换进程地址空间的代码.text段 *执行另外的程序,不需要创建额外的的地址空间 *当前程序中调用另外一个应用程序 2、执行目录下的程序: *指定执行目录下的程序 int execl(const char *path,…...

c++ 智能指针shared_ptr与make_shared
shared_ptr是C11引入的一种智能指针,它允许多个shared_ptr实例共享同一个对象,通过引用计数来管理对象的生命周期。当最后一个持有对象的shared_ptr被销毁时,它会自动删除所指向的对象。这种智能指针主要用于解决资源管理问题&…...
2024-HW最新漏洞整理及相应解决方案(二)
目录 前言: 漏洞 1.用友NC系统电采complainjudge接口的sql注入漏洞 2.用友U8 CRM产品存在SQL注入漏洞 3.WordPress LMS 插件任意文件上传漏洞 4.Oracle Fusion Middleware 安全漏洞CVE-2024-21181 5.WordPress plugin LearnPress 安全漏洞CVE-2024-6589 6.W…...
spring boot整合JPA兼容MySQL8和达梦数据库8
前言 Spring Boot是一个基于Spring框架的快速开发框架,它可以简化Spring应用的配置和部署过程。JPA(Java Persistence API)是Java持久化规范的一种实现,它提供了一种统一的方式来访问和管理数据库。MySQL和达梦数据库都是常用的关…...

规划决策算法(四)---Frenet坐标系
知乎:坐标系转换 1.Frenet 坐标系 什么是 Frenet 坐标系: 为什么使用 Frenet 坐标系: 通常情况,我们只会关注车辆当前距离左右车道线的距离,来判断是否偏离车道,是否需要打方向盘进行方向微调。而不是基于…...
大数据处理:大数据处理框架Hadoop、Spark
大数据处理是当代信息技术领域的一个重要分支,它涉及到海量数据的存储、管理和分析。为了高效地应对大数据处理的挑战,多种框架被开发出来,其中Hadoop和Spark是最为知名和广泛应用的两种。以下将详细介绍这两种框架以及它们在大数据处理中的应…...
网传的高频流量费会影响到个人用户的算法和策略T0吗?
先解答这个问题:高频的流量费这个确实是会影响你自己算法的交易的!但是,强调一个但是:有的券商是没有流量费的!小编今天就来带大家了解一下!第一:算法交易的应用场景! 算法交易的主…...

阿里云服务器 Ubuntu18.04 安装 mysql8.0并允许外部连接
参考教程: 官网教程 参考教程一 首先彻底删除mysql5.7 dpkg --list|grep mysql #查看 sudo apt-get remove mysql-common #卸载 sudo apt-get autoremove --purge mysql-server-5.7 #版本自己修改 dpkg -l|grep ^rc|awk {print$2}|sudo xargs dpkg -P #清除残留数…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践
01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...

rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...

在Zenodo下载文件 用到googlecolab googledrive
方法:Figshare/Zenodo上的数据/文件下载不下来?尝试利用Google Colab :https://zhuanlan.zhihu.com/p/1898503078782674027 参考: 通过Colab&谷歌云下载Figshare数据,超级实用!!࿰…...