我在第二个硬盘的第二个分区上安装了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安装?
答案 0 :(得分:3)
我终于找到了解决方案。由于VBoxManage internalcommands createrawvmdk -filename sdb2.vmdk -rawdisk /dev/sdb -partitions 2
命令基于当前磁盘结构生成两个有效文件,因此唯一需要进行的更改是从旧的sdb2-pt.vmdk
文件中恢复Windows引导加载程序直截了当的过程。如果您只想学习恢复步骤,可以跳过以下理论部分。
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