如何在 VMDK 文件中找到 MBR 扇区?

How can i find the MBR sector in a VMDK file?

我正在尝试了解 vmware bios 如何在加载 MBR 之前找到它。

在物理硬盘中很简单——MBR 位于第一个扇区。
但是.. VM 中会发生什么?

我创建了 2 个虚拟机 - 在第一个 vmdk 中(上面安装了一个基于 linux 的系统)我在偏移量 0x2A0000 处找到了 MBR。
在第二个 vmdk 文件中(安装了 Windows XP),我不止一次发现了 MBR - 但我发现的所有偏移量都不能除以 512(扇区大小),这有点奇怪(据我所知,MBR 应该从扇区的开头开始 + 扇区大小在 vmdk 中为 512 字节 => MBR 的起始偏移量 MUST 除以 512。如果正确,请纠正我我错了)。
所以我猜它们可能是备份副本.. 不用说 xp .vmdk 中的 @offset 0x2A0000 没什么意思。

那么.. vmware 的 BIOS 如何找到 MBR?这个可配置参数位于何处\它是如何计算的?

附加信息:
- 两个 VMDK 都是 1-file-hard-disk 文件(并且可以增长到 40GB)。
他们所服务的系统使用它们并且只使用它们(XP 使用 xp.vmdk 而 linux 使用 linux.vmdk,没有额外的 VMDK's)。

- @Windows VM 我在 \.\PhysicalDrive0 上使用 WinHex 使 MBR.it 看起来正常(签名等)。
- @Linux VM 我使用命令 "dd if=/dev/sda of=mbr.bin bs=512 count=1",然后查看十六进制字节以获取 MBR.I 查看它,它看起来很好(GRUB、末尾的签名等)。
从 VM 获取 MBR 后,我在每个相应的 .vmdk 文件中搜索主机中的 MBR(使用十六进制编辑器),偏移量如我上面提到的那样。

任何帮助,将不胜感激。谢谢!

看到有人在看这个问题,但仍然没有评论或回答,所以我自己做了一点研究。
得到以下结论(最终回答了我的问题):

1.When 用 VMware 创建一个 XXX GB 虚拟硬盘(.VMDK 文件)它可以是两种类型之一:平面或稀疏(它们也可以拆分为多个 .VMDK 文件,但我没有介绍我研究的那些)。
- flat = 所有硬盘 space (XXX GB) 在创建时分配一次。
磁盘上的 .VMDK 文件大小为 XXX GB。

- sparse = 硬盘文件是可消耗的(最多 XXX GB)。
.VMDK文件一开始很小,需要的时候会变大。

正如我在附加信息中的问题中所述,两个 .VMDK 都是 sparse.

2.As问题中提到,MBR位于物理硬盘第一个扇区的开头,我想知道它位于. VMDK 文件以及 VMware 如何计算它。
原来 在平面 .VMDK 文件中,它也位于第一个扇区的开头!
看着它们时,这是非常直截了当的前言……但我的并不平坦。那么,稀疏 .vmdk 中会发生什么? mbr 位于何处?

3.sparse .vmdk 文件有不同的结构(详细结构,你可以阅读 VMware's Virtual Disk Format Spec 重点看第 6 页 - struct SparseExtentHeader.
在那里找不到 MBR \ 第一个扇区的计算逻辑,但据我所知(在 5 中解释了我是如何做到的)它是这样的:

@.VMDK 偏移量 0x38 - 0x3F(8 字节长)位于 gdOffset.it 存储元数据的偏移量(****)。
元数据的前 4 个字节是要跳转到的下一个偏移量 (****)。
在那里,接下来的4个字节是MBR的偏移量(****)。
(****) 表示扇区偏移量。例如1 表示偏移量 512,2 表示 1024,依此类推。

总而言之,它看起来像这样:
假设 'data stored at offsets 0x38-0x3F (8 bytes long)' 为 [(0x38):8].

然后,
MBR 偏移量 = 512 X [(512 X [(512 X [(0x38):8]):4]):4]

4.I 使用稀疏 .VMDK 创建了 2 个新 VM(Windows xp 和 Linux),这种 MBR 计算方法也证明了它们的有效性(如您在 7 处所附图片中看到的那样) ).

5. 我是怎么得到这个公式的?
过滤时使用SysInternal's process Monitor
- 进程包含 vmware
-操作是CreateFile\ReadFile
-路径包含<.vmdk文件路径>

我得到了每一个 .vmdk 读取(并且它是偏移量)。
我查看了它读取 MBR 偏移量的位置(在 Linux 系统中我知道偏移量是 0x2A0000),以及它之前已经读取的内容。跳到偏移量,看起来他们会帮助我弄清楚那里发生了什么……他们确实做到了:)

6.我没有解释的是为什么我原问题中的xp系统中的MBR是一个奇怪的偏移量(不能被512整除)。
好吧,老实说,我没有充分的理由,但我忘了说,在检查 MBR 之前,我从这个系统中删除了原来的 MBR 并启动了 VM。它问我是否要正常启动windows,然后它出现在奇怪的偏移量中(将它复制到那里用于备份或其他东西)。这里奇怪的是我无法正常找到这个MBR抵消。我有一些进步,但没有确定的答案。
如果有人知道,请随时发表评论(:

7.Attached 图片: