虚拟磁盘格式3:VDI
找了很久都没有找到VDI公开的文档,在virtualbox论坛的帖子中找到一点说明。所以本文很多我也不理解,有很多是自己的猜测,不一定正确。
格式
采用小端存储,文件开头是头描述符,格式如下
偏移 | 意义 |
---|---|
0-30 | 值为<<< Oracle VM VirtualBox Disk Image >>> |
40-43 | 签名,值为7F 10 DA BE |
44-47 | 版本号,前两个字节为主版本号,后两个字节为二级版本号 |
48-4B | 帖子中说是Size of Header,不清楚是什么 |
4C-4F | 磁盘类型,1:动态磁盘(也就是随着文件增加逐步给磁盘分配内存) |
50-53 | 磁盘标记 |
54-153 | 磁盘描述 |
154-157 | 块偏移(似乎是一个虚拟块号映射为物理块号的表的地址) |
158-15B | 数据偏移(似乎是分区数据的开始地址) |
15C-15F | 柱面数 |
160-163 | 磁道数 |
164-167 | 每磁道扇区数 |
168-16B | 扇区大小 |
16B-16F | 保留 |
170-177 | 磁盘大小 |
178-17B | 块的大小 |
17C-17F | 块额外数据(不清楚) |
180-183 | blockinHDD(不清楚) |
184-187 | blocksAllocates(不清楚) |
188-197 | VDI的唯一编号UUID(以下偏移处字段似乎是用于快照) |
198-1A7 | 最后SNAP的唯一编号UUID |
1A8-1B7 | UUID link |
1B8-1C7 | UUID parent |
1C8- | garbage 保留(不清楚) |
示例
这是一个kali linux的vdi格式的虚拟磁盘文件,以此为例
其数据如下所示
红框处为磁盘类型,值为1,表示为动态磁盘
黑框处为块偏移,值为0X100000,跳转到此处,如下图所示,似乎是将虚拟块号映射为物理块号,比如前四个字节为逻辑0块,值为0,表示它映射到物理0块(即虚拟磁盘文件的第0块)?一些被FF FF FF FF即-1填充,表示该块未分配物理块?这都是我的猜测。
黄框处为数据偏移,值为0X200000,跳转到此处,如下图所示,可以看到这是这个磁盘的MBR记录,下图红框处,就是第一个分区的扇区偏移地址(相对于MBR),为2048扇区,如果跳转过去,可以看到第一个分区的数据。
红线处为扇区大小,为512B
粉红色为磁盘大小,值为85,899,345,920B,大约是80G
绿色为块的大小,值为1048576B=512*2048,即一个块是2048个扇区