无法将虚拟硬盘的内容复制到我的物理磁盘

无法将虚拟硬盘的内容复制到我的物理磁盘

我的机器上有一个 vmware ubuntu 映像,我想用它覆盖我当前的分区。

当我跑步时:

sudo qemu-img convert my-image.vmdk -O raw /dev/sda1 

我最终得到以下错误:

qemu-img:/dev/sda1:转换原始数据时出错:设备上没有剩余空间

有没有什么方法可以覆盖我现有的 HD 分区而不会出现上述错误?

答案1

VMDK 文件基本上是硬盘驱动器的映像,采用 VMWare 虚拟解决方案和现在的 VirtualBox 可以识别的格式。

VMWare ESX 虚拟硬盘的名称格式为“somefilename-flat.vmdk”,基本上是普通硬盘的直接逐字节表示。因此,下面的解决方案 2 可用于读取和安装此类磁盘。

但是对于 VMDK 文件,我认为您使用 qemu 的思维方式是正确的,但我相信您需要更进一步,如解决方案 1 所示。

解决方案 1

创建 vmdk 的原始映像版本,并使用 kpartx 显示 vmdk 中的分区

qemu-img convert -O raw somefilename.vmdk rawimagefilename.raw
sudo apt-get install kpartx
sudo kpartx -av rawimagefilename.raw

这将在 vmdk 中为每个分区生成循环映射(/dev/mapper/loopXpY),例如

loop0p1 : 0 15952482 /dev/loop0 63
loop0p2 : 0 819315 /dev/loop0 15952545
loop0p5 : 0 819252 loop0p1 63

接下来在 /media 中创建一个文件夹,我们将在其中挂载所示的循环映射所表示的分区之一

sudo mkdir /media/partitionimage

将最终需要恢复的分区挂载在/dev/sda1

sudo mount /dev/mapper/loop0p2 /media/partitionimage -o loop,ro

您现在应该能够使用 nautilus 浏览分区 /media/partitionimage

使用 tar 备份循环分区:

cd /media/partitionimage
sudo tar cvpzf /home/somewhere/backup.tgz

您确实应该从实时 CD 启动以确保 /dev/sda1 未被使用。

你可以使用类似以下命令恢复备份

sudo mount /dev/sda1 /media/backup
sudo tar xvpfz /home/somewhere/backup.tgz -C /media/backup/

解决方案 2

由于 xxx-flat.vmdk 实际上只是一个伪装的硬盘,您可以按如下方式挂载并检查其内容:

sudo losetup /dev/loop0 <full path to the xxx-flat.vmdk file>
sudo losetup -o 32256 /dev/loop1 /dev/loop0
sudo mkdir /media/diskimage
sudo mount /dev/loop1 /media/diskimage
fdisk -l /dev/loop0

其中 32256 是通过乘以扇区大小(通常为 63 [参见这里请参阅[了解更多详情])和 VMDK 扇区大小(假设为 512 字节)

如果 fdisk 成功完成,那么您可以继续。您应该能够使用 Nautilus 浏览您的 vmdk 文件并浏览到 /media/diskimage。

将 vmdk 的内容复制到硬盘

首次从活动磁盘启动

然后将 VMDK 的内容直接复制到您的分区

sudo dd if=<path to vmdk file> of=/dev/sda1 bs=512 skip=63

其中 bs 是每个扇区的字节数(在第一步中找到),而 skip 是扇区数(在第一步中使用)

来源

相关内容