系统移植(十一)根文件系统(未整理)
文章目录
- 一、根文件系统中各个目录文件功能解析:
- 二、对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 #清除残留数…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
Linux入门(十五)安装java安装tomcat安装dotnet安装mysql
安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了,系统很多命…...
Android Framework预装traceroute执行文件到system/bin下
文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数(使用 ICMP Echo 请求)-T 参数(使用 TCP SYN 包) 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11,在/s…...
更新 Docker 容器中的某一个文件
🔄 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法,适用于不同场景。 ✅ 方法一:使用 docker cp 拷贝文件到容器中(最简单) 🧰 命令格式: docker cp <…...
