我有一些旧 Linux 文件系统的平面文件格式的旧映像。它们可以被 Bochs 使用,但我需要使用 Virtual Box 运行它们。 Virtual Box 无法使用这种格式的图像,因此我需要将这些图像从平面文件转换为 .vmdk 文件格式。有什么办法可以做到这一点吗?
首先,安装QEMU。在基于 Debian 的发行版(例如 Ubuntu)上,运行:
$ apt-get install qemu
然后运行以下命令:
$ qemu-img convert -O vmdk imagefile.dd vmdkname.vmdk
我假设平面磁盘映像是
dd
风格的映像。转换操作还可以处理许多其他格式。
有关
qemu-img
命令的更多信息,请参阅 的输出
$ qemu-img -h
由于问题提到了 VirtualBox,所以这个目前可以使用:
VBoxManage convertfromraw imagefile.dd vmdkname.vmdk --format VMDK
在不带参数的情况下运行它,以获得一些有趣的细节(特别是
--variant
标志):
VBoxManage convertfromraw
回答 TJJ:但是是否也可以在不复制整个文件的情况下执行此操作?因此,只是为了以某种方式创建一个额外的 vmdk-metafile,它引用原始 dd-image。
是的,这是可能的。以下是如何在 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 客户操作系统上使用此方法,并且必须执行以下操作才能为其指定驱动器号:
您可能想访问 Linux 上的文件。首先将其从来宾操作系统中卸载,然后将其从虚拟机中删除。现在我们需要创建一个引用该分区的虚拟设备。
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'
耶!
在 Windows 上,使用 https://github.com/Zapotek/raw2vmdk 将 dd 或 winhex 创建的原始文件转换为 vmdk。 raw2vmdk v0.1.3.2 有一个错误 - 创建 vmdk 文件后,编辑 vmdk 文件并修复原始文件的路径(在我的例子中,而不是 D:\Temp lash_16gb.raw (由 winhex 创建)生成的路径是 D:Tempflash_16gb.raw)。然后,在 vmware 虚拟机版本 6.5-7 中打开它(5.1 拒绝附加 vmdk 硬盘驱动器)。哎呀!
也许您应该尝试使用 Starwind V2V Converter,您可以从这里获取它 - http://www.starwindsoftware.com/converter。它还支持 IMG 磁盘格式,并在 IMG、VMDK 或 VHD 之间执行逐扇区转换,无需对源映像进行任何更改。这个工具是免费的:)
krosenvold 的回答启发了以下脚本,该脚本执行以下操作:
该脚本可重新启动并检查中间文件是否存在。它还使用 pv 和 qemu-img -p 显示每个步骤的进度。
在我的环境 2 x Ubuntu 12.04 LTS 中采取的步骤:
#!/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
只是为了给您另一个选择,您也可以使用 https://sourceforge.net/projects/dd2vmdk/。 dd2vmdk 是一个基于 *nix 的程序,允许您通过获取原始映像、分析主引导记录(物理扇区 0)并获取特定信息来挂载原始磁盘映像(由 dd、dcfldd、dc3dd、ftk imager 等创建)创建 vmdk 文件所需的信息。
就个人而言,imo Qemu 和 Zapotek 的 raw2vmdk 工具是将 dd 转换为 vmdks 的最佳整体选项。
披露:我是这个项目的作者。
我一直在使用:
dd2vmdk https://sourceforge.net/projects/dd2vmdk/ https://github.com/labgeek/dd2vmdk
和
raw2vmdk https://sourceforge.net/projects/raw2vmdk/ https://github.com/Zapotek/raw2vmdk
raw2vmdk 在我看来工作得更好,但它是 java.. 无论哪种方式,Raw、IMG、ISO 和任何未压缩的 DD 映像都可以工作。
事实证明,vmdk 文件可以引用其他文件和数据。这些类型的 vmdk 文件是使用 raw2vmdk 创建的。我已经轻松安装了 oVirt Raw 磁盘、DD Raw 磁盘、ISO 文件,如下所示。
这是用于通过 raw2vmdk 制作文本 vmdk 文件的 tpl 文件:
# Disk DescriptorFile
version=1
encoding="UTF-8"
CID=fffffffe
parentCID=ffffffff
isNativeSnapshot="no"
createType="monolithicFlat"
# Extent description
RW [numOfSectors] FLAT "[imgLocation]" 0
# The Disk Data Base
#DDB
ddb.virtualHWVersion = "7"
ddb.longContentID = "29075898903f9855853610dffffffffe"
ddb.uuid = "60 00 C2 91 8e 73 27 62-43 58 3b f8 05 ae 2e a0"
ddb.geometry.cylinders = "[numOfCylinders]"
ddb.geometry.heads = "[headsPerTrack]"
ddb.geometry.sectors = "[sectorsPerTrack]"
ddb.adapterType = "[diskType]"