调整分区大小后更正VirtualBox原始磁盘VMDK文件

时间:2015-04-28 19:01:39

标签: virtualbox raw-disk

我在第二个硬盘的第二个分区上安装了Windows 8.1(在Ubuntu中为/ dev / sdb2),使用命令

创建

VBoxManage internalcommands createrawvmdk -filename sdb2.vmdk -rawdisk /dev/sdb -partitions 2

一切正常 - Windows安装可以从VirtualBox运行,甚至可以从GRUB启动。上次在Windows中安装某些软件时(PC直接启动到Windows),我发现系统分区(/ dev / sdb2)上没有足够的空间,并将其放大15 GB,这是硬盘上的备用

这些更改当然使得Windows安装在VirtualBox中无法使用 - 它无法启动提供一些修复选项。我意识到需要做的第一件事是扩大VMDK文件中的分区,所以我备份了旧的sdb2.vmdk和sdb2-pt.vmdk文件,并使用与以前相同的命令重新创建它们。

然而,这并没有改变,因为sdb2-pt.vmdk似乎存储了引导记录(在我的情况下是MBR,目前使用GRUB)以及Windows正常工作所需的一些东西。我的下一次尝试是将旧的sdb2-pt.vmdk替换为旧的sdb2-pt.vmdk(使用Windows引导程序和旧的分区表) - 这也没有用。

如何使用新的分区大小更新VMDK文件,以便再次从VirtualBox启动放大的Windows 8.1安装?

2 个答案:

答案 0 :(得分:3)

我终于找到了解决方案。由于VBoxManage internalcommands createrawvmdk -filename sdb2.vmdk -rawdisk /dev/sdb -partitions 2命令基于当前磁盘结构生成两个有效文件,因此唯一需要进行的更改是从旧的sdb2-pt.vmdk文件中恢复Windows引导加载程序直截了当的过程。如果您只想学习恢复步骤,可以跳过以下理论部分。

有关VMDK文件格式的一些背景信息

VMWare磁盘格式(VMDK)由两个文件组成 - 原始问题中的描述符文件(sdb2.vmdk)和范围文件(sdb2-pt.vmdk)。它们的内部结构在VMWare的specification中得到了很好的定义。我将总结最重要的部分:

描述符文件(sdb2.vmdk)包含一个注释为# Extent description的部分,它看起来像这样:

# Extent description
RW 63 FLAT "sdb2-pt.vmdk" 0
RW 41943040 ZERO 
RW 83886080 FLAT "/dev/sdb" 58722304
RW 2 FLAT "sdb2-pt.vmdk" 63
RW 1191843568 ZERO 

一个范围描述(上面一行)具有以下结构:

Access  Size in sectors  Type of extent  Filename  (Offset)

offset参数(仅为FLAT类型范围指定)指定文件Filename内给定范围的偏移量(以扇区为单位)。请注意,文件sdb2-pt.vmdk由两个范围组成,前63个扇区长,第二个扇区长2个。

FLAT范围文件sdb2-pt.vmdk是一个原始数据二进制文件,与您将获得的文件相同,例如在类Unix系统上使用dd命令。由于在我的情况下扇区大小为512 bytes(我不知道这是否是一般规则),sdb2-pt.vmdk文件(基于上面范围描述中描述的新磁盘分区)是{ {1}}很长。

现在到第二个范围(只有2个扇区的范围)。这是在扩展Windows分区(描述表中的第三个范围)后在我的新分区表中出现的填充范围。由于我之前的分区表不包含任何此类填充,因此旧(63+2)*512 bytes文件仅包含前63个扇区的长度,因此比sdb2-pt.vmdk命令生成的新扇区小1 024个字节。这显然使旧的范围文件和新的文件不兼容。

恢复过程

请注意,以下步骤仅适用于旧的MBR磁盘结构!

您肯定希望保留新的分区结构,并将分区表中所做的任何更改传播到VMDK文件。继续执行以下步骤:

  • 备份旧的描述文件(VBoxManage internalcommands createrawvmdk -filename sdb2.vmdk -rawdisk /dev/sdb -partitions 2)和范围文件(sdb2.vmdk)。在以下步骤中,您只需要第二个,但您永远不知道还会发生什么。
  • 生成发出命令的新描述符和范围文件:

    sdb2-pt.vmdk

  • 现在,新描述文件(VBoxManage internalcommands createrawvmdk -filename sdb2.vmdk -rawdisk /dev/sdb -partitions 2)中的第一个范围条目应如下所示:

    sdb2.vmdk

    知道您要保留新分区表(包含后面的所有内容)并且只恢复存储在备份范围文件(旧RW ## FLAT "sdb2-pt.vmdk" 0)中的Windows引导加载程序,您必须复制第一个sdb2-pt.vmdk(引导加载程序)从旧范围文件到新范围文件。这可以使用十六进制编辑器(将所有值从地址0x0复制到0x1B8独占)或使用以下命令在类Unix系统上完成:

    440 bytes

  • 中提琴。

答案 1 :(得分:1)

在github上有一个工具可以自动执行(并且使用相同选项重新运行将更新其vmdk和辅助文件,因此您可以稍后更改分区)https://github.com/vasi/vmdk-raw-parts