.img
文件(磁盘映像文件)本质上是存储设备(如硬盘、USB 驱动器、光盘、软盘)或文件系统的完整扇区级副本,它包含了原始设备的所有数据,包括分区表、文件系统结构以及实际的文件内容,在 Linux 中处理 .img
文件通常涉及将其“挂载”到目录树中以访问其内容,或者使用特定工具提取其中的文件。
重要提示:
- 来源可信: 只处理你信任来源的
.img
文件,恶意映像文件可能包含有害软件。 - 备份: 在对
.img
文件进行写操作(如修改、提取后删除)之前,强烈建议先备份原始文件,误操作可能导致数据丢失。 - 权限: 挂载操作通常需要
root
权限(使用sudo
)。 - 文件类型:
.img
是一个通用扩展名,它可能代表:- 原始磁盘映像 (Raw Disk Image): 最纯粹的形式,直接复制存储设备的扇区,需要知道内部结构(分区、文件系统)才能访问。
- 文件系统映像 (Filesystem Image): 只包含一个特定文件系统(如 ext4, FAT32, NTFS)的内容,没有分区表,更容易直接挂载。
- 特定格式的压缩映像: 有时
.img
文件实际上是其他格式(如squashfs
)的压缩映像,需要特定工具处理(如unsquashfs
)。 - 其他专有格式: 某些软件(如某些路由器固件、虚拟机)使用
.img
作为其专有格式,需查阅对应文档。
第一步:确定 .img
文件类型 (关键步骤)
在尝试打开或挂载之前,了解你处理的 .img
文件具体是什么类型至关重要,使用 file
命令是首选方法:
file yourfile.img
示例输出及含义:
yourfile.img: DOS/MBR boot sector
: 表明这是一个包含 MBR 分区表的原始磁盘映像,里面通常有分区(如分区 1, 分区 2)。yourfile.img: data
: 这是一个非常通用的结果,可能意味着:- 它是原始磁盘映像但
file
未能识别出明确的引导扇区签名。 - 它是单一文件系统映像(如 ext4),但
file
没有检测到其魔数。 - 它是其他未明确识别的格式。
- 它是原始磁盘映像但
yourfile.img: Linux rev 1.0 ext4 filesystem data
: 明确表明这是一个 ext4 文件系统映像(没有分区表),可以直接挂载。yourfile.img: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 4, root entries 512, sectors 20480 (volumes <=32 MB), Media descriptor 0xf8, sectors/FAT 20, sectors/track 32, heads 64, serial number 0x1ddfa8d0, label: "BOOT ", FAT (16 bit)
: 明确表明这是一个 FAT16 文件系统映像(没有分区表),可以直接挂载。yourfile.img: Squashfs filesystem
: 表明这是一个 SquashFS 压缩文件系统映像,需要使用unsquashfs
工具解压。yourfile.img: QEMU QCOW Image (v3), ...
: 表明这是 QEMU 的 QCOW2 格式(虽然扩展名通常是.qcow2
,但有时也会用.img
),需要使用qemu-nbd
或虚拟机挂载。
第二步:处理方法 (根据文件类型选择)
A. 挂载原始磁盘映像 (包含分区表 – file
显示 DOS/MBR boot sector
或类似)
这类映像包含一个或多个分区,你需要先找到分区偏移量,然后挂载目标分区。
-
查找分区信息:
fdisk -l yourfile.img
示例输出:
Disk yourfile.img: 100 MiB, 104857600 bytes, 204800 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x000e5b07 Device Boot Start End Sectors Size Id Type yourfile.img1 * 2048 102399 100352 49M c W95 FAT32 (LBA) yourfile.img2 102400 204799 102400 50M 83 Linux
这里我们看到两个分区:
img1
(FAT32) 和img2
(Linux ext?)。 -
计算分区偏移量: 偏移量 =
Start
扇区 *Sector size
(通常是 512 字节),对于img1
:偏移量 = 2048 * 512 = 1048576 字节
-
创建挂载点:
sudo mkdir -p /mnt/img_partition
-
挂载分区 (使用
offset
参数):sudo mount -o loop,offset=1048576 yourfile.img /mnt/img_partition
-o loop
: 使用 loop 设备将文件模拟成块设备。offset=1048576
: 指定分区在映像文件中的起始位置(上一步计算得出)。yourfile.img
: 你的映像文件路径。/mnt/img_partition
: 你创建的挂载点目录。
-
访问文件: 现在你可以像访问普通目录一样浏览
/mnt/img_partition
中的内容了:ls -l /mnt/img_partition
-
卸载分区 (完成后):
sudo umount /mnt/img_partition
B. 挂载文件系统映像 (无分区表 – file
明确显示 ext4
, FAT
, NTFS
等)
这类映像直接包含一个文件系统,挂载更简单,不需要计算偏移量。
-
创建挂载点:
sudo mkdir -p /mnt/img_fs
-
挂载映像 (直接使用
loop
选项):sudo mount -o loop yourfile.img /mnt/img_fs
系统会自动处理 loop 设备。
-
访问文件: 浏览
/mnt/img_fs
目录。ls -l /mnt/img_fs
-
卸载 (完成后):
sudo umount /mnt/img_fs
C. 解压 SquashFS 映像 (file
显示 Squashfs filesystem
)
SquashFS 是高度压缩的只读文件系统,常见于 Live CD/USB 和固件中,使用 unsquashfs
解压:
-
安装工具 (如果未安装):
- Debian/Ubuntu:
sudo apt install squashfs-tools
- RHEL/CentOS/Fedora:
sudo yum install squashfs-tools
或sudo dnf install squashfs-tools
- Arch/Manjaro:
sudo pacman -S squashfs-tools
- Debian/Ubuntu:
-
解压整个映像:
unsquashfs yourfile.img
这会在当前目录下创建一个名为
squashfs-root
的目录,包含所有文件。 -
解压到指定目录:
unsquashfs -d /path/to/target/directory yourfile.img
D. 处理其他专有格式或 file
显示 data
-
尝试直接挂载为 loop: 有时
file
未能识别,但实际是单一文件系统,可以尝试方法 B:sudo mount -o loop yourfile.img /mnt/img_test
如果成功,说明它是单一文件系统映像,如果失败,会得到错误信息(如
wrong fs type, bad option, bad superblock
),表明需要更多信息。 -
使用
losetup
手动管理 loop 设备 (更灵活):# 查找下一个可用的 loop 设备 sudo losetup -f # 假设输出是 /dev/loop0 # 将映像文件关联到 loop 设备 (不指定偏移,用于探测分区) sudo losetup /dev/loop0 yourfile.img # 现在可以像对待磁盘一样用 fdisk 查看 /dev/loop0 的分区 sudo fdisk -l /dev/loop0 # 如果发现有分区,计算偏移量后,用带 offset 的 mount 挂载特定分区 (如 /dev/loop0p1) sudo mount /dev/loop0p1 /mnt/img_partition # 如果分区存在且文件系统可识别 # 或者,如果整个 loop 设备就是一个文件系统 (无分区) sudo mount /dev/loop0 /mnt/img_fs # 完成后,先卸载 sudo umount /mnt/img_partition 或 /mnt/img_fs # 然后解除 loop 关联 sudo losetup -d /dev/loop0
-
使用
kpartx
自动映射分区 (推荐用于复杂映像):# 安装 kpartx (如果未安装) # Debian/Ubuntu: sudo apt install kpartx # RHEL/CentOS/Fedora: sudo yum install kpartx 或 sudo dnf install kpartx # 映射映像文件中的分区到 loop 设备 sudo kpartx -av yourfile.img # 示例输出: add map loop0p1 (253:0): 0 100352 linear 7:0 2048 # 这会在 /dev/mapper/ 下创建设备节点 (如 loop0p1) # 挂载需要的分区 sudo mount /dev/mapper/loop0p1 /mnt/img_partition # 访问文件... # 完成后卸载 sudo umount /mnt/img_partition # 删除映射 sudo kpartx -dv yourfile.img
-
查阅来源文档: 如果映像来自特定硬件或软件(如树莓派固件、路由器固件),查阅其官方文档了解推荐的提取或挂载方法,它们可能有自定义结构或工具。
-
使用
binwalk
分析/提取 (万能备选,尤其嵌入式/固件):# 安装 binwalk # Debian/Ubuntu: sudo apt install binwalk # 其他发行版请参考官方文档 https://github.com/ReFirmLabs/binwalk # 分析映像结构 binwalk yourfile.img # 尝试递归提取所有识别出的文件系统/数据 binwalk -e yourfile.img # 提取的文件通常在 `_yourfile.img.extracted/` 目录下
binwalk
非常强大,能识别和解包大量嵌入在文件中的格式。
E. 使用图形化工具 (可选)
如果你更喜欢图形界面,一些文件管理器或归档工具可能支持挂载常见的 .img
文件(尤其是单一文件系统类型):
- GNOME Disks (
gnome-disk-utility
): 可以打开.img
文件并将其挂载。 - KDE 的 Ark: 可能支持打开某些类型的映像文件(如 SquashFS)。
- Xarchiver/File Roller: 可能支持 SquashFS 等格式。
常见问题 (FAQ)
- Q: 我挂载后只能读不能写?
- A: 默认挂载通常是只读 (
ro
) 的,尤其是对来源不明的映像,这是安全措施,如果映像文件本身支持写操作(非只读压缩格式如 SquashFS),并且你确定需要写入,可以尝试-o rw
选项:sudo mount -o loop,rw yourfile.img /mnt/img_fs
。写入操作会直接修改.img
文件本身! 操作前务必备份。
- A: 默认挂载通常是只读 (
- Q: 挂载时提示
wrong fs type, bad option, bad superblock
?- A: 最常见原因:
file
命令判断错误或文件实际损坏。- 这是一个包含分区表的映像,但你尝试直接挂载整个文件(应该挂载里面的分区)。
- 文件系统类型特殊或内核不支持(如 HFS+ 在 Linux 上需要额外驱动
hfsplus
/hfs
),尝试用fdisk -l
或kpartx
检查分区,或安装所需文件系统驱动。
- A: 最常见原因:
- Q: 如何创建
.img
文件?- A: 常用方法:
dd
命令克隆设备:sudo dd if=/dev/sdX of=backup.img bs=4M status=progress
(替换/dev/sdX
为你的设备,极其危险,操作前务必确认目标of=
正确!)- 使用
genisoimage
/mkisofs
创建 CD/DVD 映像 (.iso
,但有时也用.img
)。 - 使用虚拟机软件(如 VirtualBox, QEMU)创建虚拟磁盘。
- A: 常用方法:
- Q:
file
说它是x86 boot sector
但fdisk
看不到分区?- A: 它可能是一个没有标准分区表的引导扇区(如某些软盘映像或非常简单的引导程序),尝试直接挂载为 loop 设备(方法 B)或使用
binwalk
分析。
- A: 它可能是一个没有标准分区表的引导扇区(如某些软盘映像或非常简单的引导程序),尝试直接挂载为 loop 设备(方法 B)或使用
在 Linux 上处理 .img
文件的核心步骤是:
- 识别类型: 使用
file yourfile.img
。 - 选择方法:
- 有分区表 (
DOS/MBR boot sector
): 用fdisk -l
找分区 -> 计算偏移 ->mount -o loop,offset=...
或kpartx
->mount
。 - 单一文件系统 (
ext4
,FAT
,NTFS
): 直接mount -o loop
。 - SquashFS: 用
unsquashfs
解压。 - 未知/复杂 (
data
或专有): 尝试mount -o loop
-> 失败则用losetup
/fdisk
->mount
分区,或用kpartx
,或用binwalk
分析/提取。
- 有分区表 (
- 通过挂载点或解压目录。
- 清理: 完成后务必
umount
和/或解除 loop 映射 (losetup -d
,kpartx -d
)。
始终牢记备份和来源可信的原则,根据映像的具体类型和你的需求(只读查看、修改、提取特定文件),选择最合适的方法。
引用与资源:
mount
手册页:man mount
(终端查看)losetup
手册页:man losetup
kpartx
手册页:man kpartx
fdisk
手册页:man fdisk
file
命令手册页:man file
unsquashfs
手册页:man unsquashfs
- Binwalk 项目: https://github.com/ReFirmLabs/binwalk
- Linux 内核文档 (Loop 设备): https://docs.kernel.org/admin-guide/blockdev/loop.html (技术性较强)
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/4511.html