当前位置: 首页 > news >正文

系统移植(十一)根文件系统(未整理)

文章目录

  • 一、根文件系统中各个目录文件功能解析:
  • 二、对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
http://www.lryc.cn/news/411256.html

相关文章:

  • mac中docker常用命令总结
  • Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3(含分析过程)
  • Linux 4: Bash
  • 第十四天学习笔记2024.7.25
  • 花几千上万学习Java,真没必要!(三十七)
  • SSA-GRU(自适应平滑自回归门控循环单元)预测模型及其Python和MATLAB实现
  • 【ROS】让你的回调函数并行起来
  • M12电连接器的编码分类及应用领域分析
  • 基于YOLOv8的道路裂缝坑洼检测系统
  • 蓝鹏测径仪非标定制订制流程
  • vue基础3
  • LINUX -exec函数族
  • c++ 智能指针shared_ptr与make_shared
  • 2024-HW最新漏洞整理及相应解决方案(二)
  • spring boot整合JPA兼容MySQL8和达梦数据库8
  • 规划决策算法(四)---Frenet坐标系
  • 大数据处理:大数据处理框架Hadoop、Spark
  • 网传的高频流量费会影响到个人用户的算法和策略T0吗?
  • 阿里云服务器 Ubuntu18.04 安装 mysql8.0并允许外部连接
  • (Arxiv-2023)MobileDiffusion:移动设备上即时文本到图像生成
  • 【七】Hadoop3.3.4基于ubuntu24的分布式集群安装
  • 【Rust光年纪】深入了解Rust语言的关键库:功能特点与使用场景分析
  • 矩估计与最大似然估计的通俗理解
  • 性能调优本质:如何精准定位瓶颈并实现系统极致优化
  • Git的命令
  • WPF中使用定时器更新元素-DispatcherTimer
  • 计算机网络 - 理解HTTP与HTTPS协议的关键区别与安全性
  • 【Spring Framework】使用XML配置文件配置Bean的实例化方式
  • 模拟电子技术-实验四 二极管电路仿真
  • Git 子仓(Git Submodule)学习