
Olá Habr!
De tempos em tempos, ouço de engenheiros praticantes algo estranho: VMDK, VHD e VHDX são formatos de disco virtual completamente diferentes, quase fechados, e é doloroso converter de um para outro. Hoje vou demonstrar que não é assim, vou descobrir como esses formatos se relacionam e como fazer uma conversão rápida ao migrar do Hyper-V para o VMware e vice-versa.
Um pouco de teoria. Do ponto de vista das propriedades, os discos virtuais são divididos em dois tipos:
- fino (disco dinâmico) e
- grosso (disco fixo). Tudo o resto - diferença, provisionamento espesso preguiçoso-zerado - apenas variações no tópico.
Não vou me debruçar sobre isso em detalhes. Só posso dizer que falaremos mais sobre discos grossos.
Formatos de disco
RAW - imagem "bruta" de qualquer unidade. Este é um contêiner comum que não contém cabeçalhos e rodapés específicos e representa a imagem do disco "como está". Se abrirmos essa imagem com um editor HEX, veremos imediatamente os cabeçalhos do GPT / MBR e / ou do sistema de arquivos. A mesma imagem exata é obtida através do comando dd no Linux. A RAW a esse respeito é absolutamente honesta conosco.
O início do arquivo RAW.
Fim do arquivo RAW.VMDC. O VMware ESXi é um RAW comum, em que a geometria do disco é descrita em um arquivo descritor de texto comum (descritor). É o nome dele que vemos no vSphere Console quando conectamos um disco virtual a uma máquina virtual ou navegamos no conteúdo de um diretório no Datastore. O VMware ESXi não faz nada com a imagem. Absolutamente. O disco repousa sobre si mesmo e se expande conforme necessário. Na melhor tradição da VMware, o formato do descritor é muito simples:
# Disk DescriptorFile version=1 encoding="UTF-8" CID=fffffffe parentCID=ffffffff isNativeSnapshot="no" createType="vmfs" # Extent description RW 15122560 VMFS "disk-example-flat.vmdk" # The Disk Data Base #DDB ddb.adapterType = "lsilogic" ddb.geometry.cylinders = "941" ddb.geometry.heads = "255" ddb.geometry.sectors = "63" ddb.longContentID = "4f5dc83d0a5270bee54e2d85fffffffe" ddb.uuid = "60 00 C2 93 b4 38 ed dd-a3 85 88 48 68 40 2f c0" ddb.virtualHWVersion = "13"
E não é apenas simples, mas também funcional: basta fazer anotações no arquivo do descritor para expandir o disco virtual para quaisquer valores suportados. Isso permite que você preencha discos com zeros ou marque-os finos, sem precisar manter informações de geometria nos cabeçalhos dos discos.
Abaixo estão alguns valores padrão para todas as seções do descritor:
Uma descrição de todos os valores pode ser encontrada na especificação de formato:
VMware Virtual Disk Format 1.1Vhd. O VHD espesso é o mesmo RAW, mas com um rodapé de 512 bytes, que descreve a geometria do disco. A máquina virtual Microsoft Hyper-V não possui um arquivo descritor separado. A descrição da geometria do disco leva 4 bytes. Na verdade, a partir daqui, a limitação no tamanho do disco de 2 TB.
Rodapé. Os últimos 512 bytes do disco.O mais interessante é que, se você criar um arquivo descritor e inserir um disco VHD com rodapé no ESXi, o hipervisor VMware ignorará esse rodapé e aceitará o VHD como nativo.
Quando o Storage vMotion converte um disco para thin, ele simplesmente corta esse rodapé e, na saída, obtemos o mesmo RAW sem zeros no final. E ao converter em um disco espesso - RAW honesto. É isso que vou demonstrar um pouco mais tarde.
VHDX. Todas as informações de geometria do disco são armazenadas nos primeiros 4096 Kbytes do disco virtual - na área do cabeçalho.
O esquema geral do disco grosso VHDX.Como é essa área? Ele contém duas cópias dos cabeçalhos com seus logs, o BAT e a área de metadados são comuns.
A estrutura lógica do cabeçalho do disco.Em uma unidade de tempo, apenas uma cópia do cabeçalho está ativa. Isso fornece um certo nível de tolerância a falhas do cabeçalho no caso de interrupções não planejadas nas operações de leitura / gravação. Após cada operação de E / S, a cópia é replicada e uma troca é feita.
Layout da área do cabeçalho.Para converter VHDX em RAW, basta cortar os primeiros 4096 KB.
Inicie os dados em 5 MB.Um leitor atento, é claro, dirá: ok, Zhenya, mas converte RAW para VHDX fracamente? A que responderei: depende do sistema de arquivos e de quanto permite gravar dados no início do arquivo. Manualmente no sistema de arquivos NTFS, isso pode ser feito deslocando o início do arquivo 4 MB para frente na MFT e anexando o cabeçalho a este local.
O utilitário
vhdxtool.exe funciona com o mesmo princípio
. No entanto, com esta conversão, não obteremos uma imagem bonita na forma de um cabeçalho de 4 MB e RAW. O disco estará visível e até funcionará corretamente como VHDX, mas também haverá muitos "zeros" de zeros que apareceram devido a manipulações com deslocamentos. A unidade não será otimizada. Recomenda-se que as VMs com esse disco sejam migradas para outro volume ou otimizadas por meio dos cmdlets Convert-VHD ou Optimize-VHD. Se isso não for feito, o disco ocupará mais espaço do que deveria e poderá funcionar mais lentamente.
No entanto, em cenários de migração do VMware para o Hyper-V, esse utilitário é indispensável, pois permite a conversão no local sem a necessidade de um byte para ler o disco de origem e criar uma cópia nas proximidades. Toda a rugosidade será suavizada na primeira migração do Storage Live.
Conclusão: os discos espessos dos formatos VMDK, VHD, VHDX não são realmente muito diferentes um do outro. Eles são baseados em RAW com vários aditivos. Usando o mesmo editor HEX ou funções do SO para trabalhar com o sistema de arquivos, podemos transformar 10 Tb VMDK ou VHDX no disco do hipervisor de destino em alguns segundos.
Vamos dar uma olhada em como o VMware Exsi lida com o VHD.
- Como exemplo, criei uma imagem do Windows Server usando o Convert-WindowsImage com uma injeção de drivers e parâmetros do VMware:
- Versão do SO: Windows Server 2019 Standard,
- Tipo de disco: Fixo,
- Layout de disco: GPT,
- Tamanho do disco: 30 GB.

Preste atenção aos parâmetros FileSize (tamanho real do arquivo) e Size (tamanho do disco em termos de VM). A diferença entre os valores é exatamente 512 bytes - o tamanho do VHD do rodapé. - Renomeie a unidade para Win2019-test2-flat.vmdk para carregá-la no ESXi Datastore.

- Em seguida, crio uma VM vazia no VMware ESXi com um disco Grosso (Eager Zeroed) para que o descritor do VMDK seja criado automaticamente e não precise calcular manualmente os cilindros.

- Nós nos conectamos ao host via WinSCP e substituímos o arquivo existente:

Tudo é justo: o rodapé está no lugar. - Ligue a VM e verifique se o sistema operacional é inicializado sem problemas. Resta apenas instalar o VMware Tools, que será simples, pois o Convert-WindowsImage nos permite instalar drivers de dispositivo.

- Mova o disco para outro armazenamento de dados via Storage vMotion e converta-o em um disco fino.

- Verifique o tamanho - o disco ficou fino.

- Se convertermos novamente para um disco grosso ou migrarmos a VM para o armazenamento de arquivos, obteremos o RAW mais puro sem cabeçalhos.

O rodapé estalou.
O mesmo foco funciona para os RAWs criados por meio do dd. E mesmo na direção oposta. Dessa forma, você vê que o VMware ESXi aceita rodapé de terceiros ou discos RAW.
Se você não quiser truques, use as ferramentas abaixo.
Para resumir. Os diferentes formatos de discos virtuais espessos não são tão diferentes. No coração de todos os RAW com vários "aditivos".
A conversão de formatos de disco virtual não é assustadora e, como mostrei, às vezes você pode ficar sem ele.
O principal lucro de tudo isso é a redução do tempo de migração do Hyper-V para o VMware e vice-versa e o tempo de inatividade da VM durante a migração. No DataLine, praticamos isso com o tempo de inatividade da VM por menos de 30 minutos. O registro representa 40 segundos de tempo de inatividade da VM durante a migração entre hipervisores.
Lembre-se de que, ao migrar entre diferentes hipervisores, uma conversão não é suficiente. No mínimo, você deve primeiro instalar os componentes de integração do hypervisor de destino, remover ou desativar o início dos componentes do hypervisor de origem, remover os dispositivos virtuais do hypervisor de origem, etc. Mas esta é uma história completamente diferente, sobre a qual também posso contar.
Links úteis: