如何挂载用 /bin/dd 创建的`img` 硬盘驱动器?

fox*_*fox 20 mount dd

我曾经dd备份过一个80GB 的驱动器

dd if=/dev/sdb of=~/sdb.img
Run Code Online (Sandbox Code Playgroud)

现在我需要访问该驱动器上的一些文件,但我不想将“.img”复制回驱动器。

mount ~/sdb.img /mnt/sdb也不起作用。它返回:

mount: you must specify the filesystem type
Run Code Online (Sandbox Code Playgroud)

我试图找到文件系统类型 file -s

fox@shoebox $ file -s sdb.img
sdb.img: x86 boot sector; partition 1: ID=0x12, starthead 1, startsector 63, 10233342 sectors; partition 2: ID=0xc, active, starthead 0, startsector 10233405, 72517410 sectors; partition 3: ID=0xc, starthead 0, startsector 82750815, 73545570 sectors, code offset 0xc0
Run Code Online (Sandbox Code Playgroud)

是否可以安装sdb.img,或者我必须使用它dd来恢复驱动器?

Ste*_*fan 27

当您使用dd/dev/sdb,而不是/dev/sdb1或者/dev/sdb2,复制所有分区从所述驱动到一个文件中。

您必须分别挂载每个分区。


要从文件挂载分区,您必须首先找出分区所在的文件位置。

使用您的输出,file -s sdb.img我们startsectors为每个分区找到:

sdb.img:x86 引导扇区;分区1:ID = 0×12,starthead 1,startsector 63,10233342个部门; 分区2:ID =位于0xC,活性,starthead 0,startsector 10233405,72517410个部门; 隔壁3:ID =位于0xC,starthead 0,startsector 82750815,73545570个扇区,码偏移将0xC0

分区     起始扇区
1 63
2 10233405
3 82750815

要挂载单个分区,该分区X起始扇区在哪里,请运行:

mount ~/sdb.img /mnt/sdb -o offset=$((X*512))
Run Code Online (Sandbox Code Playgroud)

所以要挂载第二个分区,你必须运行:

mount ~/sdb.img /mnt/sdb2 -o offset=$((10233405*512))
Run Code Online (Sandbox Code Playgroud)

旁注:/mnt/sdb2在运行之前确保它存在。

玩得开心!


更新:在答案中,我假设您图像的扇区大小为512,请参阅有关如何计算的问题


esc*_*crl 10

接受的答案中的Linux 挂载命令将隐式创建一个循环设备。假设完整的磁盘映像有一个正确的分区表(您的内核能够理解),您可能更喜欢losetup(8)直接使用以节省计算偏移量的麻烦。也不需要像kpartx其他答案中建议的那样额外的工具。它将做与以下基本相同的事情:

losetup -Prf sdb.img将第一个自由循环设备 ( -f)关联为只读 ( -r) 与图像文件sdb.img。该-P选项强制内核扫描此循环设备的分区表,并为每个分区创建循环设备。

所以你可能会得到类似的东西:

$ lsblk
NAME      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0       7:0    0 167.7G  1 loop
??loop0p1 259:0    0   500M  1 loop
??loop0p2 259:1    0 167.2G  1 loop
...
Run Code Online (Sandbox Code Playgroud)

您现在可以在所需的挂载点挂载每个分区,当然是只读的。

$ mount -r /dev/loop0p1 /tmp/backup_sdb1
Run Code Online (Sandbox Code Playgroud)

保持所有内容只读是可选的,但对于备份图像来说可能是一件好事。

更新: -P选项是在 2012 年与 util-linux-2.21 一起添加的。所以在编写接受的答案时它不可用。另请注意这一点,其他答案特定于 linux。OpenBSD 和 NetBSD 的 vnode 磁盘vnconfig(8)mdconfig(8).