Image 如何为virtualbox或vmplayer将平面原始磁盘映像转换为vmdk?

Image 如何为virtualbox或vmplayer将平面原始磁盘映像转换为vmdk?,image,vmware,virtual-machine,virtualization,qemu,Image,Vmware,Virtual Machine,Virtualization,Qemu,我有一些旧Linux文件系统的平面文件格式的旧映像。它们可以由使用,但我需要使用它们。Virtual Box无法使用此格式的图像,因此我需要将这些图像从平面文件转换为.vmdk文件格式。有什么方法可以做到这一点吗?首先,安装QEMU。在基于Debian的发行版(如Ubuntu)上,运行: $apt get安装qemu 然后运行以下命令: $qemu img convert-O vmdk imagefile.dd vmdkname.vmdk 我假设平面磁盘映像是dd样式的映像。convert操

我有一些旧Linux文件系统的平面文件格式的旧映像。它们可以由使用,但我需要使用它们。Virtual Box无法使用此格式的图像,因此我需要将这些图像从平面文件转换为.vmdk文件格式。有什么方法可以做到这一点吗?

首先,安装QEMU。在基于Debian的发行版(如Ubuntu)上,运行:

$apt get安装qemu
然后运行以下命令:

$qemu img convert-O vmdk imagefile.dd vmdkname.vmdk
我假设平面磁盘映像是
dd
样式的映像。convert操作还处理许多其他格式

有关
qemu img
命令的更多信息,请参阅的输出

$qemu img-h

也许你应该尝试使用星风V2V转换器,你可以从这里得到它-。它还支持IMG磁盘格式,并在IMG、VMDK或VHD之间执行扇区到扇区的转换,而无需对源映像进行任何更改。此工具是免费的:)

在windows上,用于将dd或winhex创建的原始文件转换为vmdk。raw2vmdk v0.1.3.2有一个错误-创建vmdk文件后,编辑vmdk文件并修复原始文件的路径(在我的情况下,不是D:\Temp\flash_16gb.raw(由winhex创建),生成的路径是D:Tempflash_16gb.raw)。然后,在vmware虚拟机版本6.5-7中打开它(5.1拒绝连接vmdk硬盘)。你好

因为问题提到了VirtualBox,所以这一个目前有效:

VBoxManage convertfromraw imagefile.dd vmdkname.vmdk --format VMDK
在没有参数的情况下运行它,了解一些有趣的细节(特别是
--variant
标志):


krosenvold的回答激发了以下脚本的灵感,该脚本实现了以下功能:

  • 通过ssh从远程服务器获取dd转储(作为gz文件)
  • 解压缩转储文件
  • 将其转换为vmware
脚本可重新启动,并检查中间文件是否存在。它还使用pv和qemu img-p来显示每个步骤的进度

在my environment 2 x Ubuntu 12.04 LTS中,采取了以下步骤:

  • 3小时可获得60 GB分区的47 GB磁盘转储
  • 20分钟解包到一个60 GByte dd文件
  • 创建vmware文件需要45分钟
#/bin/bash
#获取dd磁盘转储并将其转换为vmware
#看http://stackoverflow.com/questions/454899/how-to-convert-flat-raw-disk-image-to-vmdk-for-virtualbox-or-vmplayer
#作者:wf 2014-10-1919
#
#从给定主机的给定磁盘获取dd转储,并创建压缩磁盘
#给定目标上的图像
#
#1:主机,例如somehost.somedomain
#2:磁盘,例如sda
#3:目标,例如image.gz
#
# http://unix.stackexchange.com/questions/132797/how-to-use-ssh-to-make-a-dd-copy-of-disk-a-from-host-b-and-save-on-disk-b
getdump(){
本地l_主机=“$1”
本地l_盘=“$2”
本地l_目标=“3美元”
echo“从$l_主机获取$l_磁盘的磁盘转储”
ssh$l_主机sudo fdisk-l|egrep“^/dev/$l_磁盘”
如果[$?-ne 0]
然后
echo“主机$l_主机上不存在设备$l_磁盘”1>&2
出口1
其他的
如果[!-f$l_目标]
然后
ssh$l|u host“sudo dd if=/dev/$disk bs=1M | gzip-1-”| pv | dd of=$l|u目标
其他的
回显“$l_目标已存在”
fi
fi
}
#
#如果还不可用,可以选择从软件包安装命令
#1:命令
#2:包装
#
opt_install(){
l_command=“$1”
l_套餐=“$2”
echo“检查是否安装了$l_程序包中的$l_命令…”
哪个$l_命令
如果[$?-ne 0]
然后
echo“安装$l_包以使$l_命令可用…”
sudo apt获得安装$l_软件包
fi
}
#
#将给定映像转换为vmware
#1:dd转储映像
#2:要转换为的vmware映像文件
#
vmware_convert(){
本地l_ddimage=“$1”
本地l_vmwareimage=“$2”
echo“将dd映像$l_映像转换为vmware$l_vmwareimage”
#转换为显示进度的VMware磁盘格式
#看http://manpages.ubuntu.com/manpages/precise/man1/qemu-img.1.html
qemu img convert-p-O vmdk“$l_ddimage”“$l_vmwareimage”
}
#
#显示用法
#
用法(){
echo“用法:$0主机设备”
echo“主机:从例如frodo.lotr.org获取磁盘转储的主机”
echo“您需要该主机上的ssh和sudo权限”
回声“
echo“设备:从sda等转储的磁盘”
回声“”
“回声”示例:
echo“$0 frodo.lotr.org sda”
echo“$0 gandalf.lotr.org sdb”
回声“”
echo“如果不可用,将安装所需的pv和qemu UTIL包”
echo“您需要本地sudo权限才能运行此功能”
出口1
}
#检查参数
如果[$#-lt 2]
然后
使用
fi
#获取命令行参数
host=“$1”
disk=“$2”
#计算图像文件的名称
ts=`date“+%Y-%m-%d”`
#所有图像的前缀
#.gz压缩的dd
#.dd磁盘转储文件
#.vmware—vmware磁盘文件
image=“${host}{disk}\u image\u$ts”
回显“$0$host/$disk->$image”
#首先检查/安装必要的软件包
选择安装qemu img qemu utils
选择安装光伏
#检查是否已加载dd文件
#如果可以避免的话,我们不想重复这个乏味的过程
如果[!-f$image.gz]
然后
getdump$host$disk$image.gz
其他的
echo“$image.gz已下载”
fi
#检查dd文件是否已解压缩
#如果可以避免的话,我们不想重复这个乏味的过程
如果[!-f$image.dd]
然后
echo“解压缩$image.gz”
zcat$image.gz | pv-cN zcat>$image.dd
其他的
echo“image$image.dd已解压缩”
fi
#检查vmdk文件是否已转换
#如果可以避免的话,我们不想重复这个乏味的过程
如果[!-f$image.vmdk]
然后
vmware_convert$image.dd$image.vmdk
其他的
echo“vmware image$image.vmdk已转换”
fi

回答TJJ:但也可以在不复制整个文件的情况下执行此操作吗?因此,只需以某种方式创建一个引用原始dd图像的附加vmdk图元文件即可

是的,是pos
VBoxManage convertfromraw
dd bs=512 count=60000 if=/dev/zero of=usbdrv.img
VBoxManage internalcommands createrawvmdk -filename "usbdrv.vmdk" -rawdisk "usbdrv.img"
sfdisk -d usbdrv.img
label: dos
label-id: 0xd367a714
device: usbdrv.img
unit: sectors

usbdrv.img1 : start=          63, size=       48132, type=4
sudo losetup -o $((63*512)) loop4 usbdrv.img
mkdir usbdrv
sudo mount /dev/loop4 usbdrv
ls usbdrv -l
total 0
-rwxr-xr-x. 1 root root 0 Apr  5 17:13 'Test file.txt'