我的机器上有一个 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 是扇区数(在第一步中使用)