如何将平面原始磁盘映像转换为虚拟机或vmplayer的vmdk?

时间:2009-01-18 10:00:20

标签: image vmware virtual-machine virtualization qemu

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

7 个答案:

答案 0 :(得分:80)

apt-get install qemu(在debian / ubuntu上安装QEMU)

然后运行以下命令: qemu-img convert -O vmdk imagefile.dd vmdkname.vmdk

我假设平盘图像是dd风格的图像。转换操作还可以处理许多其他格式。

答案 1 :(得分:78)

由于问题提到VirtualBox,这个目前正在运作:

VBoxManage convertfromraw imagefile.dd vmdkname.vmdk --format VMDK

在没有参数的情况下运行它以获得一些有趣的细节(特别是--variant标志):

VBoxManage convertfromraw

答案 2 :(得分:6)

在Windows上,使用https://github.com/Zapotek/raw2vmdk将dd或winhex创建的原始文件转换为vmdk。 raw2vmdk v0.1.3.2有一个错误 - 一旦创建了vmdk文件,编辑vmdk文件并修复原始文件的路径(在我的情况下代替D:\ Temp \ flash_16gb.raw(由winhex创建)生成的路径是D:Tempflash_16gb.raw)。然后,在6.5-7的vmware虚拟机中打开它(5.1拒绝连接vmdk硬盘)。 howgh!

答案 3 :(得分:4)

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

,这是可能的。以下是在VirtualBox中使用平面磁盘映像的方法:

首先用通常的方式用dd创建一个图像:

dd bs=512 count=60000 if=/dev/zero of=usbdrv.img

然后,您可以为VirtualBox创建一个引用此图像的文件:

VBoxManage internalcommands createrawvmdk -filename "usbdrv.vmdk" -rawdisk "usbdrv.img"

您可以按原样在VirtualBox中使用此图像,但根据来宾操作系统,它可能不会立即显示。例如,我尝试将此方法与Windows客户操作系统一起使用,我必须执行以下操作才能为其提供驱动器号:

  • 转到“控制面板”。
  • 转到“管理工具”。
  • 转到“计算机管理”。
  • 转到左侧面板中的Storage \ Disk Management。
  • 你会在这里看到你的磁盘。在其上创建一个分区并对其进行格式化。对于小容量使用FAT,对于大容量使用FAT32或NTFS。

您可能想要在Linux上访问您的文件。首先从guest虚拟机操作系统中卸载它,然后将其从虚拟机中删除。现在我们需要创建一个引用该分区的虚拟设备。

sfdisk -d usbdrv.img

响应:

label: dos
label-id: 0xd367a714
device: usbdrv.img
unit: sectors

usbdrv.img1 : start=          63, size=       48132, type=4

记下分区的起始位置:63。在下面的命令中,我使用了loop4,因为它是我案例中第一个可用的循环设备。

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'

耶!

答案 4 :(得分:1)

也许你应该尝试使用Starwind V2V Converter,你可以从这里得到它 - http://www.starwindsoftware.com/converter。它还支持IMG磁盘格式,并在IMG,VMDK或VHD之间进行逐扇区转换,无需对源映像进行任何更改。这个工具是免费的:)

答案 5 :(得分:1)

krosenvold的回答启发了以下脚本,该脚本执行以下操作:

  • 从远程服务器(作为gz文件)通过ssh获取dd转储
  • 解压缩转储
  • 将其转换为vmware

脚本可重启并检查中间文件是否存在。它还使用pv和qemu-img -p来显示每个步骤的进度。

在我的环境中2 x Ubuntu 12.04 LTS采取了以下步骤:

  • 3小时获得60 GByte分区的47 GByte磁盘转储
  • 20分钟打开包装到60 GByte dd文件
  • 创建vmware文件45分钟
#!/bin/bash
# get a dd disk dump and convert it to vmware
#  see http://stackoverflow.com/questions/454899/how-to-convert-flat-raw-disk-image-to-vmdk-for-virtualbox-or-vmplayer
#  Author: wf  2014-10-1919

#
# get a dd dump from the given host's given disk and create a compressed
#   image at the given target 
#
#  1: host e.g. somehost.somedomain
#  2: disk e.g. sda
#  3: target e.g. 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() {
  local l_host="$1"
  local l_disk="$2"
  local l_target="$3"
  echo "getting disk dump of $l_disk from $l_host"
  ssh $l_host sudo fdisk -l  | egrep "^/dev/$l_disk"
  if [ $? -ne 0 ]
  then
    echo "device $l_disk does not exist on host $l_host" 1>&2
    exit 1
  else
    if [ ! -f $l_target ]
    then
      ssh $l_host "sudo dd if=/dev/$disk bs=1M | gzip -1 -" | pv | dd of=$l_target
    else
      echo "$l_target already exists"
    fi
  fi
}

#
# optionally install command from package if it is not available yet
# 1: command
# 2: package
#
opt_install() {
  l_command="$1"
  l_package="$2"
  echo "checking that $l_command from package $l_package  is installed ..."
  which $l_command
  if [ $? -ne 0 ]
  then
    echo "installing $l_package to make $l_command available ..."
    sudo apt-get install $l_package 
  fi
}

#
# convert the given image to vmware
#  1: the dd dump image
#  2: the vmware image file to convert to
#
vmware_convert() {
  local l_ddimage="$1"
  local l_vmwareimage="$2"
  echo "converting dd image $l_image to vmware $l_vmwareimage"
  #  convert to VMware disk format showing progess
  # see http://manpages.ubuntu.com/manpages/precise/man1/qemu-img.1.html
  qemu-img convert -p -O vmdk "$l_ddimage" "$l_vmwareimage"
}

#
# show usage
#
usage() {
  echo "usage: $0 host device"
  echo "      host: the host to get the disk dump from e.g. frodo.lotr.org"  
  echo "            you need ssh and sudo privileges on that host"
  echo "
  echo "    device: the disk to dump from e.g. sda"
  echo ""
  echo "  examples:
  echo "       $0 frodo.lotr.org sda"
  echo "       $0 gandalf.lotr.org sdb"
  echo ""
  echo "  the needed packages pv and qemu-utils will be installed if not available"
  echo "  you need local sudo rights for this to work"
  exit 1
}

# check arguments
if [ $# -lt 2 ]
then
  usage
fi

# get the command line parameters
host="$1"
disk="$2"

# calculate the names of the image files
ts=`date "+%Y-%m-%d"`
# prefix of all images
#   .gz the zipped dd
#   .dd the disk dump file
#   .vmware - the vmware disk file
image="${host}_${disk}_image_$ts"

echo "$0 $host/$disk ->  $image"

# first check/install necessary packages
opt_install qemu-img qemu-utils
opt_install pv pv

# check if dd files was already loaded
#  we don't want to start this tedious process twice if avoidable
if [ ! -f $image.gz ]
then
  getdump $host $disk $image.gz
else
  echo "$image.gz already downloaded"
fi

# check if the dd file was already uncompressed
# we don't want to start this tedious process twice if avoidable
if [ ! -f $image.dd ]
then
  echo "uncompressing $image.gz"
  zcat $image.gz | pv -cN zcat > $image.dd
else
  echo "image $image.dd already uncompressed"
fi
# check if the vmdk file was already converted
# we don't want to start this tedious process twice if avoidable
if [ ! -f $image.vmdk ]
then
  vmware_convert $image.dd $image.vmdk
else
  echo "vmware image $image.vmdk already converted"
fi

答案 6 :(得分:0)

只要给您另一个选择,您也可以使用https://sourceforge.net/projects/dd2vmdk/。 dd2vmdk是一个基于* nix的程序,它允许您通过获取原始映像,分析主引导记录(物理扇区0)并确定其原始性来挂载原始磁盘映像(由dd,dcfldd,dc3dd,ftk成像器等创建)。创建vmdk文件所需的信息。

就个人而言,imo Qemu和Zapotek的raw2vmdk工具是将dd转换为vmdks的最佳整体选择。

披露:我是这个项目的作者。