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>
- formatに利用できる引数はそれぞれ下記の通り
これで相互にイメージが変換できるはずだ.
実際にやってみる
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ファイルを用いてコマンドを実行し,変換が行われていることを確認した.