JP7FKFの備忘録

ヒトは,忘れる生き物だから.

OVAをqcow2にconvertする

OVAイメージをqcow2にconvertして利用したくなったので調べてみた. VMを構成するためのファイルというのは,いくつかの種類がある. よく聞くのがova, ovf, qcow2などではないだろうか. 今回はこれらのファイルについての意味合いの理解を深め,仮想イメージを変換することを試してみる.

OVAファイルとは何者か

OVAとは"Open Virtual Appliance"のアクロニムである. これはOVF,仮想ディスクイメージ,その他付随するファイルをtarでarchiveしたものだと思えばよいようだ.

ではOVFとは何か

OVFとは"Open Virtualization Format"のアクロニム.

Open Virtualization Format(OVFとOVA)を参照すると,OVFパッケージに内包されるファイルには下記のような種類があるようだ.

  • 記述子: 記述子ファイルにより,その仮想マシンの仮想ハードウェアが定義される.このファイルには仮想ディスク,サービス,およびゲストオペレーティングシステムに関する記述や,ライセンス契約書(EULA),アプライアンス内の仮想マシンの起動および停止手順,サービスのインストール手順などの情報が含まれる.記述子ファイルの拡張子は,.ovf である.
  • マニフェスト: パッケージに含まれる各ファイルのSHA-1ダイジェスト値で,パッケージの破損を検出する.マニフェストファイルの拡張子は,.mf である.
  • 署名: パッケージに含まれるX.509証明書の公開キーで署名されたマニフェストのダイジェスト値で,パッケージの所有者の検証に使用される.署名ファイルの拡張子は,.cert である.
  • 仮想ディスク: OVFは,ディスクイメージの形式についての仕様ではない.OVFパッケージには仮想ディスクを構成するファイルを含むが,その形式は仮想ディスクをエクスポートした仮想化製品により異なる.XenServerで作成するOVFパッケージでは,Dynamic VHD形式のディスクイメージが使用される.VMware製品やVirtual BoxのOVFパッケージでは,ストリーム最適化のVMDK形式が使用される.

このうち,記述子と呼ばれるファイルがOVFファイルを指す. このファイルがどういう役割を持っているかというと,仮想マシンのconfiguration(CPU, Memory, NIC, GuestOSの種類, etc...),ストレージ,ネットワーク構成,その他メタデータ等がxmlで記述されている. OVFファイルがあれば,あるVM(群)の構成を構築することが可能ということである.ただしこのOVFにはディスクイメージは含まないため,その他の手段でディスクイメージを提供する必要がある.具体的にはvmdk等が挙げられる.

OVFパッケージにはこの記述子(ovf)とイメージ(vmdk, etc...)のほか,マニフェストファイル(.mf)と署名ファイル(.cert)が含まれることが多いようである. マニフェストファイルはovaに含まれる各ファイルのsha-1ダイジェストが格納されており,ファイルの破損を検知する目的で利用されるようだ. また,署名ファイルにはマニフェストファイルをX.509証明書の公開キーで署名したダイジェスト値が記載されており,所有者(distributor)の検証が行えるようになっているようだ.

OVFファイルとOVFパッケージは似て非なるもので,OVFパッケージにはOVFファイルが常に含まれるが,場合によっては上記のマニフェスト,署名,仮想ディスクが含まれ,これをtarでarchiveしたものがOVAと呼ばれるファイルとなる. なので,tar -xf hoge.ova すると上記の4つのファイル群が得られることになる.

vmdkをqcow2に変換する

ovaがtarアーカイブであることがわかったので,tar -xf <.ova> で展開すると,仮想ディスクイメージが得られるはずである. 仮想ディスクイメージの種類にはいくつか存在するが,メジャーなものはqemu-img コマンドを用いて変換することができるようだ.

qemu-imgコマンドはqemu-utilsに内包されているようなので,installされていない場合は sudo apt install qemu-utils 等で入手できそうである.

qemu-imgを用いた変換の容量は下記の通りである.

qemu-img convert [-f format] [-O output_format] <input_image_file> <output_image_file>

これで相互にイメージが変換できるはずだ.

実際にやってみる

vyosのOVAイメージ vyos-1.1.7-amd64-signed.ova を例に上記の変換までを実施してみる.

[jp7fkf@lab1]$ ls
vyos-1.1.7-amd64-signed.ova
[jp7fkf@lab1]$
[jp7fkf@lab1]$ tar -xvf vyos-1.1.7-amd64-signed.ova
VyOS-1.1.7-signed.ovf
VyOS-1.1.7-signed.mf
VyOS-1.1.7-signed.cert
VyOS-1.1.7-signed-disk1.vmdk
[jp7fkf@lab1]$ ls
vyos-1.1.7-amd64-signed.ova  VyOS-1.1.7-signed-disk1.vmdk  VyOS-1.1.7-signed.ovf
VyOS-1.1.7-signed.cert       VyOS-1.1.7-signed.mf

tar archiveを展開するとovf, vmdk, mf, certの4つのファイルが出てくる.

マニフェストファイルを見てみよう

[jp7fkf@lab1]$ cat VyOS-1.1.7-signed.mf
SHA1(VyOS-1.1.7-signed.ovf)= f075a5ea7058d16734c82fbe0097abebacc769ce
SHA1(VyOS-1.1.7-signed-disk1.vmdk)= a9e83ab5c700a920d657d6d1b52f8dda3e160efc

想定通り,OVFとvmdkについてのsha-1 digestが記載されている.certはmfから生成されるので,ここには載っていない.

certを見てみると,

[jp7fkf@lab1]$ cat VyOS-1.1.7-signed.cert
SHA1(VyOS-1.1.7-signed.mf)= c76c44df048078b1528a7e0174ab98d2add165c4c91c8d25b58c4561c1368b5c2ccf523e1f614b40dde75a99323ccce3c3a836dae7eabbb5b22964d517c34d2eefbabd70878437aee9694113ca55469e50625b3c7c3efeee93b53ffb036f2ca8aaa8f0d7653cdcb0b38a7063a38769f5ab1c132bedf96b10b2cb11670c5a5b5ad01097f8317fa0a6e9b8882eea36b87bfa3c1efa4adaf7866fba72a03a4651d060f079a4163965a89accb507a671fb228c70e9fb6d1d4e1d8b1a9087a4d80ca73b9b34687624847d6dfd609a917932d088c5f3fbbea9ab49f0b2499fb0f3ea428cc3500513f67159acb03e1326bbcb2b678ee296f0a9ba0a5f9365e198aadb54da0c28678610c2a11ec6126f01cb1985bd44d90293be99bb37c55e41f1483c68c6f2e84604e9e3637af6cb963007616adf9960515e4ef79becbac152c153cc587cb6bcdd2ef580561504d2f8fc7122f5c68072ea8dcd4cba434db4cb53cbbc01130edea3c9a73e114c7ff95709f4a5087e6b026bac3c0ce6b0ebae28c7a15d9767ed3b24b702c1586a70c32bf5eb62aa3ec9c18bea2e43e32b36b023bf592166f10f8079d155eac41010bca46b954c9c9741c934af3fcb4dda687e53fa813d271bcac3ad86117b3238ed512d729edb2fe1ec224bc0a71b872b5ed7d485efb95d374057daddfdb8365593b7cf182e698c88656900dd67e3c14a73dd225786b277
-----BEGIN CERTIFICATE-----
MIIGADCCBOigAwIBAgIQIgpv5xjEXl10TvXTz+syBTANBgkqhkiG9w0BAQsFADB1
MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEpMCcGA1UECxMg
U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIzAhBgNVBAMTGlN0YXJ0
Q29tIENsYXNzIDMgT2JqZWN0IENBMB4XDTE2MDMwODA1MTIzNVoXDTE5MDMwODA1
MTIzNVowYTELMAkGA1UEBhMCRVMxDzANBgNVBAgMBk1hZHJpZDERMA8GA1UEBwwI
QWxjb3Jjb24xFjAUBgNVBAoMDVNlbnRyaXVtIFMuTC4xFjAUBgNVBAMMDVNlbnRy
aXVtIFMuTC4wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDfWjvOnc3m
FWnFdKphQxS1IicZVN0YOoWrDCKbl89hLQD5w76JjWfmLm9yceIjgKIhHvmbHNWH
FpXhTpzLw12YvfrUzjhFTePNDrdHPLbXSaV5F2xkArPLrASFxOVwXJ3kHJPjfs1U
NvG6FEcwfUWC+t2Fzsdto9nI5U44qtU7d9C60Mprx3qnpej4mzgQsc61jCPatARN
cjA/xxC51zxlB4mX+599SZHewX8HyyZtXYPCcq47LzeQqqhqub0LUFKpe47sjzv/
6qzTpz62O7OsKRp1zecCHA0pwvtuFWydQMksvTqSb6l/vXZ1Yf45bvuEpJjePS1N
aMXGa5cpvzSY67YKS3XnaNmnCY2d3T3d0X624CZ+PB7LcSGbcaOH9pMglsASCEBy
Hd0RuTcjWUQaxU5zqcl3H+HmP92sMjum5g6irX47oTi3CvJnK7TdFahNJdyepejo
cVfaVGXf2BnHD6veupjMGBCpecYAvRDBnqrctYBKwNt39+PdA9Cnkn4n9Vx+GFX2
xdP6Wnw+ot9m2JbBeBr4A+BXqb4MXd9eCM2mRBduNliAdN0QrLtJLVPL/1NPUd5D
3XgezSwArkHZduxg2eqdaZd1l0Tn2dNyXOxl7wasSjyENBJR9ovlhDas0eA8Ll5V
nsQc0mV6s+QCzwCoW3lQc8G9hN27sLc9gwIDAQABo4IBnjCCAZowDgYDVR0PAQH/
BAQDAgeAMB8GA1UdJQQYMBYGCCsGAQUFBwMDBgorBgEEAYI3PQEBMAkGA1UdEwQC
MAAwHQYDVR0OBBYEFOfLPzVM5pWho/73a/g9s8ZaPvksMB8GA1UdIwQYMBaAFGZ6
ns2cc4ZqaaCu+oy7GI8I7NUEMG0GCCsGAQUFBwEBBGEwXzAkBggrBgEFBQcwAYYY
aHR0cDovL29jc3Auc3RhcnRzc2wuY29tMDcGCCsGAQUFBzAChitodHRwOi8vYWlh
LnN0YXJ0c3NsLmNvbS9jZXJ0cy9zY2EuY29kZTMuY3J0MDYGA1UdHwQvMC0wK6Ap
oCeGJWh0dHA6Ly9jcmwuc3RhcnRzc2wuY29tL3NjYS1jb2RlMy5jcmwwIwYDVR0S
BBwwGoYYaHR0cDovL3d3dy5zdGFydHNzbC5jb20vMFAGA1UdIARJMEcwCAYGZ4EM
AQQBMDsGCysGAQQBgbU3AQIEMCwwKgYIKwYBBQUHAgEWHmh0dHA6Ly93d3cuc3Rh
cnRzc2wuY29tL3BvbGljeTANBgkqhkiG9w0BAQsFAAOCAQEAuyMGjwa/FgoZzEgL
5w78V5y9oUDrEN1rRgglcMc80Tvcv5Nv3JrS1LoUw8GXVMHkcxl+g86atWUNBXuD
5HZf9xRLBknOw5L6szOm0Wdptdcc42Iu27tUCYY2Lf8e1Qo6JzUXP/Z2q+vZEqDh
l/moBXxIss26tUsU4JzZe9mpgdZt3lxeD/NT13rWhcDVvuRVlUtysT4LBGm0j+5q
K8sMkYSDwoL8lj8t4gnhq9C3Sz6lf3kETJpNfZIBvZuwqcWtGrK3gFqojTljBfzu
pK+M/HqsgMkFVWOaY/x/SrcWPRX7b/hZkbcpXBkkTDwDegpwtlWrL8NuM9OfFoMn
/5oB2w==
-----END CERTIFICATE-----

mfのsha-1 digestと署名が記載があることがわかる.

続いてOVFをはじめの20行についてのみ見てみると,

[jp7fkf@lab1]$
[jp7fkf@lab1]$ cat VyOS-1.1.7-signed.ovf  | head -n 20
<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by VMware VirtualCenter Server, User: FLEXIMOVIL.LOCAL\syncer, UTC time: 2016-04-10T19:20:43.849526Z-->
<Envelope vmw:buildId="build-3339084" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:cim="http://schemas.dmtf.org/wbem/wscim/1/common" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vmw="http://www.vmware.com/schema/ovf" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <References>
    <File ovf:href="VyOS-1.1.7-signed-disk1.vmdk" ovf:id="file1" ovf:size="245504000"/>
  </References>
  <DiskSection>
    <Info>Virtual disk information</Info>
    <Disk ovf:capacity="4" ovf:capacityAllocationUnits="byte * 2^30" ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" ovf:populatedSize="254869504"/>
  </DiskSection>
  <NetworkSection>
    <Info>The list of logical networks</Info>
    <Network ovf:name="management.gs.es">
      <Description>The management.gs.es network</Description>
    </Network>
  </NetworkSection>
  <vmw:IpAssignmentSection ovf:required="false" vmw:protocols="IPv4" vmw:schemes="dhcp">
    <Info>Supported IP assignment schemes</Info>
  </vmw:IpAssignmentSection>
  <VirtualSystem ovf:id="VyOS-1.1.7">
[jp7fkf@lab1]$

xml形式であることがわかる.細かく見ていくと,Disk SectionやNetwork Sectionなど,VMの構成に関する情報が記載されていることが見えてくる.

ではvmdkをqcow2に変換してみよう

[jp7fkf@lab1]$ qemu-img convert -f vmdk -O qcow2 VyOS-1.1.7-signed-disk1.vmdk VyOS-1.1.7-signed-disk1.qcow2
[jp7fkf@lab1]$ ls
vyos-1.1.7-amd64-signed.ova  VyOS-1.1.7-signed-disk1.qcow2  VyOS-1.1.7-signed.mf
VyOS-1.1.7-signed.cert       VyOS-1.1.7-signed-disk1.vmdk   VyOS-1.1.7-signed.ovf
[jp7fkf@lab1]$ file vyos-1.1.7-amd64-signed.ova
vyos-1.1.7-amd64-signed.ova: POSIX tar archive
[jp7fkf@lab1]$ file VyOS-1.1.7-signed-disk1.qcow2
VyOS-1.1.7-signed-disk1.qcow2: QEMU QCOW Image (v3), 4294967296 bytes
[jp7fkf@lab1]$

想定通り,qcow2に変換できていそうだということがわかる.

まとめ

  • OVAファイルが何者か,また内包されるOVF, 仮想イメージ,マニフェスト,署名についての意味合い,実態についてまとめた.
  • 仮想ディスクイメージファイルの相互の変換をqemu-imgコマンドを利用して行うことができることを述べた.
  • 実際にvyosのOVAファイルを用いてコマンドを実行し,変換が行われていることを確認した.

References