Img to vhd windows

There are many Virtual Disk formats, VDI, VMDK, VHD, VHDX, IMG, RAW, HDD, and many more. Unfortunately VHD and VHDX formats are amongst the least popular ones, but if you’re running a Hyper-V server these are the only formats you can work with.

Don’t fret, there is a way to convert a lot of these common formats to the VHD Micrsosoft disk image. Oracle includes a conversion tool with their Virtual Box application VBoxManage.Virtual box is a free tool available for download, and use. You can find the software over here: https://www.virtualbox.org/ .

I found that this works better than the actual tool that Microsoft offers and have since successfully converted many formats with Virtual Box to the VHD disk image. Usually I go from a IMG to VHD file. I capture the drive using dd from within a Linux Mint boot drive and then proceed to convert it. But I have sometimes setup test VMs in VirtualBox that I needed to run on a Hyper-V server after.

To perform the conversions have a look at the following two commands.

Install Virtual Box and use it by opening a command prompt and navigate to the VirtualBox installation directory. Usually located in C:\Program Files\Oracle\VirtualBox.

Usage:

VBoxManage clonehd  <uuid|inputfile>  <uuid|outputfile>
                    [--format VDI|VMDK|VHD|RAW|<other>]
                    [--variant Standard,Fixed,Split2G,Stream,ESX]
                    [--existing]

A baisc command and output of this would look something like this.

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe clonehd "c:\VMs\Windows 10\Windows 10.vmdk" "f:\temp\Windows10.vhd" -format vhd
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'vhd'. UUID: 1f6e118a-f0e2-49ed-a352-6b842791cdfa

C:\Program Files\Oracle\VirtualBox>

VHD is a Hyper-V generation 1 format, where as VHDX is a Hyper-V generation 2 format.

Alternatively if you have a DD captured raw IMG file you can convert it to VHD by using the following command first:

 C:\Program Files\Oracle\VirtualBox>VBoxManage.exe convertdd file.img file.vmdk

…once converted follow this up by the “clonehd” command which converts to vhd. Prior to converting to vhd make an attempt to boot the vmdk in VirtualBox. Attempt to boot it in to the OS, either normally or via safe mode. The reason for this is that sometimes the OS will need to run a chkdsk before booting into itself, you should let it run as this chkdsk will allow the vhd to properly mount in Hyper-V. It seems that either the VMDK format is more forgiving than VHD, or only VirtualBox can fix the conversion errors.

If you’re only looking to only mount a volume and not boot off the virtual disk and into an OS you can try a tool called Disk2vhd. Also since windows 7 the backup software built into the OS created vhd backup sets. That could be an option as well.

Как я уже рассказывал в многочисленных своих статьях о виртуальных машинах, в ряде случаев мной упоминались образы (или так называемые дампы), жестких дисков с данными. Давным давно, еще лет 10-12 назад, такой формат как *.img использовался исключительно в качестве образов файловых систем для загрузки Linux\Unix, и образов снимаемых резервных копий с жестких дисков, для последующей записи на другой HDD при аварийном восстановлении. По мере появления флеш-драйвов (флешек, портативных накопителей), формат *.img стал приобретать большую популярность, и сегодня практически на каждом сайте организации или сообщества, занимающемся разработкой операционных систем (в большей части это конечно Linux), стали появляться дистрибутивы операционных систем в двух самых распространенных форматах, *.ISO — образ CD\DVD диска, *.IMG — образ для записи на флешку, жесткий диск либо другой магнитный накопитель. Производители программ виртуализации: VMware и Microsoft в свою очередь придумали свои форматы образов жестких дисков.

  • VMDK — Virtual Machine Disk, с которым работают программные продукты VMware
  • VHD — Virtual Hard Disk, с которым работают программные продукты Microsoft

И кстати в одной из предыдущих статей я рассказывал о том как можно просмотреть содержимое образов дисков (см. статью: Монтирование образов дисков в Windows)
Принимая во внимание все вышесказанное, напрашивается вопрос: «Можно ли преобразовывать (конвертировать) эти форматы, один в другой?»
Ответ очевиден: «Да!»
И для этого мы сегодня возьмем такую бесплатную (freeware) программу как V2V Image Converter от компании StarWind Sostware, скачать которую можно официальном сайте
Официальный сайт компании StarWind
Страница программы V2V
Интерфейс программы и процесс преобразования очень прост:

После установки программы V2V выбираем образ *.img, *.vmdk или *.vhd:

Далее указываем формат, в котором нам нужно сохранить дамп жесткого диска в одном из форматов:

VMware growable image — *.vmdk формат расширяемого образа диска VMware workstation (с заранее не зарезервированной областью виртуального жесткого диска), и расширяющейся по мере попадания информации.

VMware  pre-allocated image  — *.vmdk формат образа виртуального жесткого диска VMware workstation с предварительной зарезервированной и размеченной областью.

VMware ESX server image — *.vmdk формат образа виртуального жесткого диска VMware ESX сервера с предварительной зарезервированной и размеченной областью.

MS Virtual PC growable image — *.vhd формат расширяемого образа жесткого диска Microsoft Virtual PC.

MS Virtual PC pre-allocated image — *.vhd формат образа виртуального жесткого диска Microsoft Virtual PC с предварительной зарезервированной и размеченной областью.

Raw image — *.img формат образа виртуального жесткого диска IMG с предварительной зарезервированной и размеченной областью.

Каждому формату соответствуют расширения *.img, *.vmdk или *.vhd

Небольшая заметка: опять же по опциям связанным с VMware продуктами виртуализации, это возможность выбрать тип контроллера образа жесткого диска, и как мы уже знаем по опциям это 2 формата:

  • IDE
  • SCSI

И теперь нам остается лишь указать куда будет программа конвертировать файл

Вот пожалуй и все, что касается конвертации виртуальных жестких дисков, и образов *.img, *.vhd, *.vmdk. Удачи и приятной работы!

Для переноса виртуальной машины с одного гипервизора на другой может потребоваться конвертация образа диска этой виртуальной машины.
С этой задачей на отлично справляется qemu-img.
Програма поддерживает форматы дисков для всех распространённых гипервизоров:

  • KVM, Xen — qcow2
  • VMware — vmdk
  • Hyper-V — vhd, vhdx
  • VirtualBox — vdi

Так же возможна конвертация образов дисков, созданных с помощью dd.

Далее будет описана работа программы под Windows, однако qemu-img так же доступен и на Linux, формат команд везде одинаковый

apt install qemu-utils


yum install qemu-img

Информацю об образе диска можно получить выполнив команду

qemu-img.exe info D:\test\test-mv.vhd

Ответ будет примерно таким:

image: D:\test\test-vm.vhd
file format: vpc
virtual size: 40G (42949017600 bytes)
disk size: 17G
cluster_size: 2097152

Конвертация диска виртуальной машины из формата vpc (Hyper-V) в qcow2 (KVM) выполняется командой

qemu-img.exe convert -p -f vdi -O qcow2 D:\test\test-mv.vhd D:\test\test-mv.qcow2

Ключи обозначают следующее:

  • -p — отображение прогресса конвертации
  • -f — исходный формат образа
  • -O — формат образа после конвертации

Форматы файлов указываются именно ключами, а не расширениями имён файлов.
Более подробную справку можно увидеть выполнив команду

qemu-img.exe --help

   ImgToVHD — небольшая бесплатная утилита, которая позволит конвертировать файл-backup, другими словами файл образ резервной копии, созданный также бесплатной программой Macrium Reflect от общей у них компанией профессионально занимающейся разработкой программного обеспечения в области сохранения данных, компанией Macrium Software.

   Итак, данное ПО позволит преобразовать образ от вышеупомянутого инструмента, имеющих расширение .mrimg в VHD формат образа от компании Microsoft. Такое преобразование позволит разворачивать и использовать его впоследствии на виртуальных машинах Microsoft Virtual PC, VMWare и Virtual Box от Oracle.

   ImgToVHD представляет собой простейший графический интерфейс, в котором нужно просто указать путь к образу от Macrium Reflect и программа тут же отобразит структуру данного образа. После этого пользователь может задать новое имя файла после конвертирования. Натсроек приложение никаких не имеет за исключением нескольких доступных для включения опций. Так, возможно произвести перерисовку таблицы разделов, сбросить ID диска и наконец, выбрать вариант преобразования даже при наличии ошибок.

#!/bin/bash

VERBOSITY=0

TEMP_D=««

FORMATS=(

qcow2

qcow2-compressed

raw

azure

azure-dynamic

azure-fixed

)

error() { echo «$@« 1>&2; }

fail() { [ $# -eq 0 ] || error «$@«; exit 1; }

_assert_python() {

[ -n «$_PYTHON« ] && return 0

local out=«« c=««

for c in python python3; do

out=$(command -v $c 2>&1) && _PYTHON=$c && break

done

[ -n «$_PYTHON« ] || fail «No python available.«

}

json_key() {

# json_key(json_blob, keyname)

_assert_python

local val=«« jblob=«$1« kname=«$2« req=«$3«

val=$(

$_PYTHON -c «

import json, sys;

jblob, kname = (sys.argv[1], sys.argv[2])

data = json.loads(jblob)

print(data.get(kname, ‘_none’))« «$jblob« «$kname«) ||

{ error «Failed to read input as json«; return 1; }

[ «$val« = «_none« -a «$req« = «req« ] && return 1

_RET=«$val«

}

get_img_info() {

debug 2 «get image info${2:+ -f $2} —output=json $1«

qemu-img info ${2:+-f $2} —output=json «$1« ||

{ debug 1 «failed qemu-img info $img«; return 1; }

}

get_img_info_key() {

local img=«$1« key=«$2« ifmt=$3 info=««

info=$(qemu-img info ${ifmt:+-f $ifmt} —output=json «$img«) ||

{ debug 1 «failed qemu-img info $img«; return 1; }

json_key «$info« «$key« || {

debug 1 «failed to get key ‘$key‘ from ‘$img«

return 1

}

}

disk_to_azure() {

# https://docs.microsoft.com/en-us/azure/virtual-machines/linux/redhat-create-upload-vhd

local img_in=«$1« img_out=«$2« subfmt=$3 ifmt=«$4« img_tmp=««

local out=«« force_size=«« fimg_in=«« ret=««

fimg_in=$(realpath «$img_in«) ||

{ error «failed to get full path to $img_in«; return 1; }

out=$(qemu-img convert -O vpc -o ? 2>&1) ||

{ error «Failed to check qemu-img for vpc out.«; return 1; }

echo «$out« | grep -q force_size && force_size=«force_size«

get_img_info_key «$img_in« virtual-size «$ifmt« || return

local vsize=$_RET mb=$((1024*1024))

local roundmb=$(( ((vsize+mb1)/mb)*mb ))

debug 2 «${img_in} is $vsize bytes.«

local curifmt=«$ifmt«

if [ $vsize -ne $roundmb ]; then

debug 1 «creating $vsize != $roundmb temp image in even mb $roundmb.«

img_tmp=«$TEMP_D/img.roundmb«

rq 3 create-tmp-1mb-img qemu-img create \

-f qcow2 -F «$curifmt« -b «$fimg_in« «$img_tmp« «$roundmb« ||

{ error «failed to create temp image«; return 1; }

curifmt=«qcow2«

else

img_tmp=«$img_in«

fi

local opts=«subformat=$subfmt«

# force_size is https://bugs.launchpad.net/qemu/+bug/1490611

# and really is probably necessary.

opts=«$opts${force_size:+,${force_size}}«

rq 2 convert-vhd qemu-img convert \

-f «$curifmt« -O vpc -o «$opts« \

«$img_tmp« «$img_out«

ret=$?

[ «$img_tmp« = «$img_in« ] || rm -f «$img_tmp«

return $ret

}

rq() {

local verbosity=$1 name=$2

shift 2;

debug 2 «running:« «$@«

if [ ${VERBOSITY} -ge $verbosity ]; then

«$@«

else

local f=«${TEMP_D}/${name}.out«

«$@« > «$f« 2>&1

local ret=$?

[ $ret -eq 0 ] && { rm -f «$f«; return 0; }

error «FAILED:« «$@«

cat «$f« 1>&2;

rm -f «${f}«

return $ret

fi

}

bad_Usage() { Usage 1>&2; fail «$@«; }

Usage() {

cat <<EOF

Usage: ${0##*/} [ options ] input format output

Convert a qcow image to another format successfully.

options:

—resize SIZE grow the disk to SIZE during conversion

format is one of:

EOF

local f

for f in «${FORMATS[@]}«; do

echo « $f«

done

}

bad_Usage() { Usage 1>&2; [ $# -eq 0 ] || error «$@«; exit 1; }

cleanup() {

[ -z «${TEMP_D}« -o ! -d «${TEMP_D}« ] || rm -Rf «${TEMP_D}«

}

debug() {

local level=${1}; shift;

[ «${level}« -gt «${VERBOSITY}« ] && return

error «${@}«

}

is_hidden_vpc() {

# qemu-img info can’t identify vpc fixed format from raw.

# https://bugs.launchpad.net/bugs/1819182

local detected=«$1« img=«$2«

[ «$detected« = «raw« ] || return 1

case «$img« in

*.[vV][hH][dD]|*.[vV][pP][cC]) return 0;;

esac

local foot=««

# footer at 512 bytes from end starts with ‘conectix’

tail -c 512 «$img« | head -c 8 | grep -q conectix && return 0

return 1

}

inargs() {

local needle=«$1« hay=««

shift

for hay in «$@«; do

[ «$needle« = «$hay« ] && return 0

done

return 1

}

short_opts=«hr:v«

long_opts=«help,resize:,verbose«

getopt_out=$(getopt —name «${0##*/}« \

—options «${short_opts}« —long «${long_opts}««$@«) &&

eval set«${getopt_out}« ||

bad_Usage

## <<insert default variables here>>

input=««

output=««

resize=««

while [ $# -ne 0 ]; do

cur=$1; next=$2;

case «$cur« in

-h|—help) Usage ; exit 0;;

-v|—verbose) VERBOSITY=$((${VERBOSITY}+1));;

-r|—resize) resize=$next;;

—) shift; break;;

esac

shift;

done

[ $# -eq 3 ] ||

bad_Usage «Expect 3 args. (input, format, output). got $#«

input=«$1«

oformat=«$2«

output=«$3«

curimg=«$input«

command -v qemu-img >/dev/null || fail «No qemu-img in path«

[ -f «$input« ] || fail «$input: not a file«

[ «$input« -ef «$output« ] && fail «input has to differ from output.«

rm -f «$output« || fail «failed to delete output file: $output«

inargs «$oformat« «${FORMATS[@]}« ||

fail «$oformat not valid format: ${FORMATS[*]}«

TEMP_D=$(mktemp -d «${TMPDIR:-/tmp}/${0##*/}.XXXXXX«) ||

fail «failed to make tempdir«

trap cleanup EXIT

info=$(get_img_info «$input«) ||

fail «failed to get image info for $input«

json_key «$info« «format« req && ifmt=«$_RET« ||

fail «failed to get image type of $_RET: $info«

if is_hidden_vpc «$ifmt« «$input«; then

debug 1 «Input looks like vhd, assuming that.«

ifmt=«vpc«

info=$(get_img_info «$input« «$ifmt«) ||

fail «failed to get image info for $input as fmt=$ifmt«

fi

json_key «$info« «virtual-size« req && isize=«$_RET« ||

fail «failed to get size of $input«

debug 1 «input: $input [format=$ifmt virtual-size=$isize]«

debug 2 «output: $output [format=$oformat]«

case «$oformat« in

# force_size is https://bugs.launchpad.net/qemu/+bug/1490611

# older qemu-img just can’t really work with dynamic size.

azure-dynamic)

out=$(qemu-img convert -O vpc -o ? 2>&1) ||

{ error «Failed to check qemu-img for vpc out.«; return 1; }

if ! echo «$out« | grep -q force_size; then

error «Cannot create $oformat with this qemu.«

fail «see https://bugs.launchpad.net/qemu/+bug/1490611«

fi

esac

img_raw=«${TEMP_D}/img.raw«

curifmt=«$ifmt«

if [ -n «$resize« ]; then

debug 1 «resizing via qcow2 backed.«

fcurimg=$(realpath «$curimg«)

rq 2 resize-with-qcow2 qemu-img create \

-F «$ifmt« -f qcow2 -b «$fcurimg« \

«$TEMP_D/resized.img« «$resize« ||

fail «failed to create qcow2 resized.«

curimg=«$TEMP_D/resized.img«

curifmt=«qcow2«

fi

case «$oformat« in

qcow2-compressed)

rq 2 to-qcow2-comp qemu-image convert \

-f «$curifmt« -O qcow2 -c \

«$curimg« «$output« ||

fail «failed to convert to qcow2«

;;

qcow2)

rq 2 to-qcow2 qemu-image convert \

-f «$curifmt« -O qcow2 \

«$curimg« «$output« ||

fail «failed to convert to qcow2«

;;

azure-dynamic)

disk_to_azure «$curimg« «$output« dynamic $curifmt ||

fail «failed to convert to azure-dynamic type.«

;;

azure|azure-fixed)

disk_to_azure «$curimg« «$output« fixed $curifmt ||

fail «failed to convert to azure type.«

;;

raw)

rq 2 to-raw qemu-image convert \

-f «$curifmt« -O raw «$curimg« «$output« ||

fail «failed to convert to raw«

;;

esac

debug 1 «created $output in $oformat format«

exit

# vi: ts=4 expandtab

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Почему не удается расширить том в windows 10
  • Синхронизация фото icloud windows
  • Mount bin files windows
  • Как отформатировать жесткий диск в exfat в windows 10
  • Управление сохраненными паролями в windows 10