尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

文件系统挂载

文件系统挂载
📅 发布时间:2026/6/30 23:54:57

在Linux工程项目进行测试时,要储存重要的过程文件,而文件又有可能过大时,可以将文件存在某些闲置分区中,例如某些容量比较大的备份分区。

要注意的是,本次工程实践的硬盘设备是NAND Flash闪存设备。

查看分区

运行cat /prop/mtd,输出当前系统挂载的分区资源,各列的含义依次为:

MTD 设备的编号标识符,数字从 0 开始递增,表示系统的物理闪存分区序号。
分区大小(单位:字节),通常以十六进制表示。
擦除块大小(单位:字节),即闪存的最小可擦除单元。

分区的名称标签,用于标识该 MTD 分区的用途(如引导程序、内核、文件系统等)。

从中挑选合适的分区进行擦除,文件系统初始化以及重新挂载。

擦除分区

挑选合适的分区后,需要先将分区中原先的内容擦除,可以运行:


flash_erase [选项] <设备节点> <起始块偏移> <擦除块数量>

例如:flash_erase /dev/mtdblock0 5 12
从第5块开始连续擦除12个块。


如果没有集成flash管理工具,也可以尝试使用内核级操作:

# 通过 MTD 字符设备直接操作
dd if=/dev/zero of=/dev/mtdblock0 bs=4096 count=12 skip=5

dd指令是非常强大的数据操作指令:

  1. 块级操作:dd操作的是数据块(Blocks),而非文件系统理解的单个文件。它能直接读取和写入磁介质扇区或文件内容,因此可以用于处理原始设备(如/dev/sda)和普通文件。

  2. 精确控制:它对数据传输的来源(if)、去向(of)、块大小(bs)、块数量(count) 等都提供了非常精细的控制。

  3. 文件名即一切:它不关心文件的内容(格式、类型),它只负责忠实地拷贝字节。


dd if=<输入文件> of=<输出文件> [选项]

  • if=:输入文件(input file)。这是数据读取的来源。可以是普通文件(如file.iso)、物理磁盘设备(如/dev/sda)、分区(如/dev/sda1),甚至是标准输入(stdin),用if=/dev/stdin或直接省略if(但提供输入源)。

  • of=:输出文件(output file)。这是数据写入的目标。同样可以是普通文件、设备、分区或标准输出(stdout),用of=/dev/stdout或省略of(但提供输出目标)。

  • 选项(大小写敏感):控制数据传输方式,常见的包括:

关键选项详解:

  1. bs=BYTES:块大小(blocksize)。定义一次读取和写入操作的字节数。使用较大的块(如bs=4M)通常性能更好,但使用较小的块(如bs=512)可用于特定的精确操作。

  2. count=BLOCKS:要复制的块数量。仅拷贝指定数量的bs大小的块。如果不指定count和skip,dd会一直读到输入文件的结束。

  3. skip=BLOCKS:在输入文件中跳过的块数量。在开始读取数据之前,先跳过if文件开头的skip个bs大小的区域。常用于恢复备份中的特定分区。

  4. seek=BLOCKS:在输出文件中跳过的块数量。在开始写入数据之前,先跳过of文件开头的seek个bs大小的区域,从这里开始写入。用于将数据写入到目标设备的特定位置。

  5. status=LEVEL:状态报告级别。控制传输进度信息:

    • status=progress (GNU dd 特有):定期显示当前速度和传输完成的字节数。

    • status=none:完全不输出状态信息。

    • 默认为status=noxfer:只显示统计摘要(拷贝了多少字节、共用时间等)。

  6. conv=CONVS:转换选项(conversions)。这是一个强大的功能,可以指定逗号分隔的参数列表:

    • notrunc:不要截断输出文件。仅修改目标文件的部分内容时,保持目标文件中未被修改区域内容的完整(即使目标文件原本比你写入的数据量更大)。这在使用dd修改磁盘分区上的单个文件内容时非常重要。

    • sparse:尝试检测输入块中的大量零字节并将其在输出文件中写成“稀疏文件”(占用磁盘块较少)。节省空间。

    • noerror:读取错误后继续处理(而非终止)。错误会被报告,读取失败的块将被输出填充为全零(假设未进行其他转换)。

    • sync:用 NUL 字节填充每个输入块至ibs大小(如果使用了非同obs的选项)。这会影响bs,ibs,obs。常与noerror连用。

  7. ibs=BYTES,obs=BYTES:输入块大小(input blocksize),输出块大小(output blocksize)。允许输入和输出块大小不同(bs同时设置二者)。当使用了conv=sync时,输入块将被填充或截断至ibs。


初始化文件系统

由于存储设备是NADN Flash,该分区又是作为日志保存分区,有较高频率读写的需求,因此需要把分区初始化为UBI(Unsorted Block Images) 分区进行块管理,可以使用如下指令:


ubiformat /dev/<device> [options]

-y强制执行操作(跳过确认提示)
-s <size>指定擦除块大小(单位:字节)
-O <size>设置子页面大小(针对 NAND 闪存优化)
-e <count>保留指定数量的擦除块作为备用区
-f <image>从外部文件加载 UBI 镜像

例如ubiformat /dev/mtd49

值得注意的是,每一次进行ubiformat,系统会擦除该分区,对于NAND设备而言,基于寿命的考虑,为了不产生更多的坏块,应该避免频繁做这样的操作。


然后把UBI设备挂载到内核,到此系统会在/dev/下创建相应的ubi设备,之后即可通过/dev/ubi*对该设备进行操作,运行如下指令:


ubiattach -m <MTD设备号> -d <UBI设备号> [其他选项]

-m <MTD设备号>:指定要附加的 MTD 设备编号(如 /dev/mtdX 中的 X)。
-d <UBI设备号>:指定分配给 UBI 设备的编号(如 0 对应 /dev/ubi0)。
-p <MTD分区路径>:直接指定 MTD 分区路径(如 /dev/mtd1),替代 -m。
-O <vid_hdr_offset>:指定 VID 头偏移量(适用于非标准闪存布局)。
-b <max-beb-per1024>: 预留一定数量的块给未来可能损坏的块。

例如ubiattach -m /dev/mtd49 -d 15 -b 2


Attach成功之后,可以使用ubinfo查看ubi分区的信息:


ubinfo <device_num>

例如:
~ # ubinfo -d 15
ubi15
Volumes count: 0
Logical eraseblock size: 253952 bytes, 248.0 KiB
Total amount of logical eraseblocks: 80 (20316160 bytes, 19.3 MiB)
Amount of available logical eraseblocks: 68 (17268736 bytes, 16.4 MiB)
Maximum count of volumes 128
Count of bad physical eraseblocks: 0
Count of reserved physical eraseblocks: 8
Current maximum erase counter value: 0
Minimum input/output unit size: 4096 bytes
Character device major/minor: 490:0

其中需要关注实际可用的空间大小:Amount of available logical eraseblocks。


挂载分区到文件夹

在UBI分区初始化之后,还需要把分区划分成卷才可以挂载到文件夹上,这是因为UBI分区并不是一个逻辑分区,本质上UBI分区一个eraseblock的池子,划分卷可用如下指令:


ubimkvol [选项] <UBI设备节点>

  1. -n, --vol_id=ID
    • 指定要创建的卷的 ID 号。这是一个整数 (如-n 0)。
  2. -s, --vol_size=SIZE | max
    • 指定卷的大小。可以使用字节单位后缀(如2048KiB,512MiB)。
    • 使用-s max(强烈推荐的方式)表示使用 UBI 设备上所有剩余的可用空间来创建该卷。
  3. -N, --vol_name=NAME
    • 为卷设置一个可读的名称(字符串)。该名称在 UBI 卷操作和格式化时非常有用,可以帮助识别。(非常重要:这对于后续格式化和挂载很有用!)
  4. -t, --vol_type=dynamic|static
    • 指定卷的类型:
      • dynamic: 这是最常见和最推荐的类型。用于可变大小数据(如文件系统)。
      • static: 仅供存放固定大小的原始数据块(如 bootloader 镜像)。使用较少。

例如ubimkvol /dev/ubi15 -N factory -s 16Mib,这里将之前创建的UBI分区划分为一个卷0,大小为之前使用的ubinfo中所示可用空间。


然后就可以进行文件夹的挂载了,这里可以使用mount指令,如:
mount -t ubifs /dev/ubi15_0 /tmp/log
当然,前提是文件夹存在,可以先用mkdir创建文件夹:
mkdir /tmp/log

相关新闻

  • 【MySQL】列的增删查改
  • STM32 SPI控制器
  • VMware虚拟机安装Ubuntu完整指南:从零搭建安全可控的开发环境

最新新闻

  • 基于PI外环-FCS-MPC内环的永磁同步电机双环调速系统仿真分析(Simulink仿真实现)
  • Tensor 是什么?PyTorch 里最重要的对象讲清楚
  • 把 quicklink 的预加载思想搬到 API 层:我设计了一套‘懒请求调度器’,首屏并发从 9 降到了 2
  • Java线程池使用指南
  • C++继承与多态解析
  • 别再搞混了!JVM的Minor GC、Major GC、Full GC 到底有啥区别?

日新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号