news 2026/6/20 8:59:37

嵌入式Linux:镜像、分区与文件系统:.img 到底是什么

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式Linux:镜像、分区与文件系统:.img 到底是什么

镜像、分区与文件系统:.img到底是什么

仓库已经开源!所有教程,主线内核移植,跑新版本imx-linux/uboot都在这里,或者一起来尝试跑7.0的Linux!欢迎各位大佬观摩!喜欢的话点个⭐!

仓库地址:https://github.com/Awesome-Embedded-Learning-Studio/imx-forge

静态网页:https://awesome-embedded-learning-studio.github.io/imx-forge/

前言:它不是一个文件夹压缩包

很多人第一次接触.img时,会下意识把它当成压缩包。这也很正常。因为我们平时看到.zip.tar.gz,里面都是一堆文件;看到rootfs.tar.gz,也确实可以解开得到一个根文件系统目录。

但这里的imx6ull-aes-sd.imgimx6ull-aes-emmc.img不是这种东西。

它不是“把 boot 目录和 rootfs 目录压成一个包”。它更像是把一整张 SD 卡从第 0 字节开始复制成了一个普通文件。

换句话说:

.tar.gz 关心的是文件。 .img 关心的是整块盘的字节布局。

理解了这一点,后面很多命令就不奇怪了。sfdisk -d xxx.img能看分区表,是因为这个.img里面真的有分区表。dd能把它写进 SD 卡,是因为它本来就是按整盘布局生成的。

从整盘到文件:中间有几层

我们先用一个层级把概念摆正:

整盘设备 └── 分区表 ├── 分区 1 │ └── 文件系统 │ ├── zImage │ └── imx6ull-aes.dtb └── 分区 2 └── 文件系统 ├── /bin ├── /etc └── /lib

这几层不要混:

整盘设备是一块完整存储,例如一张 SD 卡,或者一颗 eMMC。分区表记录这块盘上有哪些分区,每个分区从哪里开始,到哪里结束。

分区是一段连续的存储范围。文件系统是在分区里面组织文件的一套格式,比如 ext4。文件才是我们平时能lscpcat的东西,比如zImage.dtb/etc/inittab

如果把这几层混了,就会出现很典型的误会:以为把u-boot-dtb.imx拷进 boot 分区,板子下次上电就会从它启动。实际上不会,因为项目里的 U-Boot 不属于 boot 分区里的普通文件。

MBR 是做什么的

MBR 可以先简单理解成一种老派但够用的分区表格式。

它放在整盘的开头,告诉系统:

第 1 个分区从哪个扇区开始,有多大 第 2 个分区从哪个扇区开始,有多大 每个分区是什么类型 哪个分区带 bootable 标记

当前镜像脚本会写一个 DOS/MBR 风格的分区表。你用下面命令看镜像:

sfdisk-dout/release-latest/images/imx6ull-aes-emmc.img

能看到类似:

label: dos unit: sectors ...img1 : start=32768, size=131072, type=83, bootable ...img2 : start=163840, size=..., type=83

这里start=32768的意思是第 1 个分区从第 32768 个扇区开始。一个扇区按 512 字节算,正好是 16 MiB。

这就是为什么.img可以被sfdisk读懂。它虽然是一个普通文件,但文件开头的内容按整盘格式写好了。

boot 分区和 rootfs 分区

当前镜像里有两个分区。

第 1 个是 boot 分区。它放启动 Linux 需要的普通文件:

zImage imx6ull-aes.dtb boot.cmd

zImage是 Linux 内核镜像。.dtb是设备树,告诉内核这块板子的硬件长什么样。boot.cmd记录脚本为这个镜像生成的启动命令。

第 2 个是 rootfs 分区。Linux 内核启动后,会把它挂载成/

/ ├── bin ├── etc ├── lib └── ...

这就是用户空间。BusyBox、init 脚本、配置文件、你后续放进去的应用,都会在 rootfs 里。

所以启动链路里有一个很自然的顺序:

U-Boot 读取 boot 分区里的 zImage 和 DTB Linux 内核启动 Linux 挂载 rootfs 分区作为根目录 进入用户空间

文件系统是什么

分区只是“一段空间”。要在这段空间里放文件,还需要文件系统。

当前脚本把 boot 分区和 rootfs 分区都做成 ext4。这样 U-Boot 可以用ext4load读取内核和设备树,Linux 也能直接挂载 rootfs。

ext4 文件系统负责回答这些问题:

这个目录里有哪些文件? 这个文件的数据块在哪里? 这个文件权限是什么? 软链接指向哪里?

也就是说,zImage能以文件形式存在,是因为 boot 分区里面有 ext4 文件系统。/etc/inittab能被cat,也是因为 rootfs 分区里面有 ext4 文件系统。

脚本用mke2fs -d生成 ext4 文件系统镜像,这样可以把一个目录直接灌进文件系统里,不需要sudo mount。后面脚本拆解章节会细讲这件事。

U-Boot raw 区域不是普通文件

现在回到最容易混的地方:U-Boot。

项目里的u-boot-dtb.imx不放在 boot 分区里作为普通文件启动。镜像脚本会把它写到整盘偏移 1 KiB 的位置:

offset 1 KiB -> u-boot-dtb.imx

这段区域在分区前面,属于 raw disk 区域。

raw 的意思可以先理解成:不经过文件系统,直接按字节或扇区写。这里没有文件名,也没有目录。你不能在 Linux 挂载 boot 分区后ls出“1 KiB 偏移处的 U-Boot”。它不在文件系统里。

这就是为什么我们要区分:

zImage / DTB:boot 分区里的普通文件 u-boot-dtb.imx:整盘 raw 区域里的启动镜像

zImage拷到 boot 分区,是文件操作。

u-boot-dtb.imx写到 1 KiB,是 raw 写盘操作。

这两件事不在同一层。

为什么 sfdisk 能看 .img

sfdisk不是只能看真实磁盘。只要一个文件的内容按“整盘布局”组织,它也能读。

所以这条命令:

sfdisk-dout/release-latest/images/imx6ull-aes-sd.img

本质上是在问:

这个文件开头有没有我认识的分区表? 如果有,每个分区从哪里开始,有多大?

它不会挂载分区,也不会读 ext4 里的文件。它只是读分区表。

如果你想看文件系统层面的信息,可以用更偏文件系统的工具,比如:

dumpe2fs-hboot.ext4 debugfs-R'ls -l /'boot.ext4

这些命令的层次就不一样了。sfdisk看整盘分区表,dumpe2fsdebugfs看 ext4 文件系统。

为什么完整镜像要写整盘

现在就能解释上一章那句话了。

完整.img里面同时包含:

整盘前面的 raw U-Boot 整盘前面的 MBR 分区表 第 1 分区的 ext4 文件系统 第 2 分区的 ext4 文件系统

所以它必须从目标设备的第 0 字节开始写。

写到整盘设备:

of=/dev/sdb

意思是把这些层级完整放回一张真实 SD 卡。

写到分区设备:

of=/dev/sdb1

意思是把整盘布局塞进第 1 个分区内部。这样外层分区表、raw U-Boot 位置都不对。

这也是为什么很多教程会反复强调:看清楚lsblk,确认目标是disk,不是part

小结

这一章把.img拆成了几层:

整盘 → 分区表 → 分区 → 文件系统 → 文件

zImage、DTB、rootfs 里的内容,都是文件系统里的普通文件。U-Boot 则写在整盘前面的 raw 区域,不属于 boot 分区。

下一章我们继续看 i.MX6ULL 的启动链路。重点解决一个问题:为什么项目脚本偏偏把u-boot-dtb.imx写到 1 KiB,而 boot 分区又从 16 MiB 开始。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/20 8:52:07

自动驾驶多任务感知的部分监督学习实战

1. 这不是“打补丁式”的算法改良,而是感知系统落地的现实切口“自动驾驶 多任务 感知 的部分监督学习:异构标注、缺失标注与可靠负样本区域”——这个标题里没有一个词是虚的,全是当前L4级自动驾驶量产落地过程中,感知团队每天在…

作者头像 李华
网站建设 2026/6/20 8:51:00

React移动端应用打包实战:从HBuilderX配置到模拟器调试全流程

1. 环境准备与项目初始化 第一次把React项目打包成APK时,我对着满屏的配置项差点崩溃。后来发现只要工具选对,整个过程比想象中简单得多。HBuilderX这个神器,能帮我们省去原生开发的复杂环境配置,特别适合前端开发者快速生成移动…

作者头像 李华
网站建设 2026/6/20 8:50:12

JetBrains IDE试用期重置终极指南:如何轻松实现30天无限续期?

JetBrains IDE试用期重置终极指南:如何轻松实现30天无限续期? 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 还在为IntelliJ IDEA、PyCharm等JetBrains IDE试用期到期而烦恼吗&#xff1f…

作者头像 李华
网站建设 2026/6/20 8:47:03

OpenClaw本地AI工作流引擎部署实战指南

1. 项目概述:这不是“小龙虾”,是OpenClaw——一个被误传名字却真实可用的本地AI工作流引擎 很多人第一次看到“小龙虾安装教程”这个标题,下意识会点进去以为是美食做法,结果发现页面里全是命令行、Docker、Python环境——这其实…

作者头像 李华
网站建设 2026/6/20 8:44:50

5个突破性技巧彻底掌握Umi-OCR离线文字识别

5个突破性技巧彻底掌握Umi-OCR离线文字识别 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。 项目地址: htt…

作者头像 李华
网站建设 2026/6/20 8:42:08

从源码到板载:手把手在ARM开发板上构建mkfs.ext4工具链

1. 为什么需要手动构建mkfs.ext4工具链 第一次在ARM开发板上折腾文件系统时,遇到个尴尬问题:用Buildroot自动编译的e2fsprogs总是报错,系统里缺了关键的mkfs.ext4工具。这就像你买了套宜家家具,发现说明书丢了——明明所有零件都…

作者头像 李华