Cisco ルータやファイアウォールを仮想環境で利用したい場合、CSR1000v (IOS-XE) や ASAv を使う、といった手段があります。 しかし、従来からある Cisco IOS を仮想環境で使う手段は無いように思います。 以前、onePK が合った頃は all-in-one-vm 内部で IOSv を使う… という手段はあったかも知れませんが、all-in-one-vm も現在は配信されていないと思われます。 全くニーズ無いと思いますが、「OVA ファイル版の IOSv や IOSvL2 があったら良いな」という夢を見たので、内容をメモしておきます。
Step.1
VIRL で glance 上のイメージを確認します。
$ glance image-list +--------------------------------------+--------------+ | ID | Name | +--------------------------------------+--------------+ | 3354d403-85f3-4b02-83d0-d3c26f3817b4 | ASAv | | b0759344-4bd1-4211-8a2c-2d2505a4b997 | coreos | | f4c9e5f3-2073-4f0c-8328-b20276c1117d | CSR1000v | | b9d9d199-ee68-49e0-888d-baf7ecdfc083 | IOS XRv | | b4c33ad5-90f0-4596-a62d-80ca2614356b | IOS XRv 9000 | | 850d39ff-d041-4682-8326-62679315f8d1 | IOSv | | 0b12a387-478d-480e-a43b-ca814d0a358f | IOSvL2 | | cbe211ce-bcda-47b9-9d99-da7efa1f2856 | NX-OSv | | eaffa073-8601-43ed-bbd1-a713f3d22191 | NX-OSv 9000 | | 7a5f1575-b0cc-49a1-b34f-c38cfb67d26a | server | +--------------------------------------+--------------+
IOSvL2 のイメージを作業用 Linux へコピーします。
sudo scp /var/lib/glance/images//0b12a387-478d-480e-a43b-ca814d0a358f \ USERNAME@ADDRESS:~/vios_l2-adventerprisek9-m.152-1.20180619.qcow2
Step.2
qemu-img info ~
で確認すると glance 上のイメージは qcow2 形式のようです。
# qemu-img info vios_l2-adventerprisek9-m.152-1.20180619.qcow2 image: vios_l2-adventerprisek9-m.152-1.20180619.qcow2 file format: qcow2 virtual size: 2.0G (2147483648 bytes) disk size: 43M cluster_size: 65536 Format specific information: compat: 1.1 lazy refcounts: false refcount bits: 16 corrupt: false
vSphere でインポート出来るように qcow2 → vmdk へフォーマットを変換しておきます。
qemu-img convert \ -f qcow2 vios_l2-adventerprisek9-m.152-1.20180619.qcow2 \ -O vmdk vios_l2-adventerprisek9-m.152-1.20180619.vmdk
変換が完了しました。
# qemu-img info vios_l2-adventerprisek9-m.152-1.20180619.vmdk image: vios_l2-adventerprisek9-m.152-1.20180619.vmdk file format: vmdk virtual size: 2.0G (2147483648 bytes) disk size: 102M cluster_size: 65536 Format specific information: cid: 1373171663 parent cid: 4294967295 create type: monolithicSparse extents: [0]: virtual size: 2147483648 filename: vios_l2-adventerprisek9-m.152-1.20180619.vmdk cluster size: 65536 format:
Step.3
以下のスペックで新規仮想マシンを作成します。 仮想マシン名は vios_l2-adventerprisek9-m.152-1.20180619
としました。
No. | 項目 | 値 |
---|---|---|
1 | ゲスト OS ファミリ | Linux |
2 | ゲスト OS バージョン | その他の Linux (64bit) |
3 | vCPU | 1 |
4 | メモリ | 512MB |
5 | 新規ハードディスク | (削除) |
6 | 新規 SCSI コントローラ | (削除) |
7 | 新規 CD/DVD ドライブ | (削除) |
8 | 新規ネットワーク | アダプタタイプは E1000 を選択 |
Step.4
仮想マシンと同じディレクトリに vmdk 形式で用意したディスクイメージをコピーしておきます。
vios_l2-adventerprisek9-m.152-1.20180619.vmdk
Step.5
仮想マシンの作成が完了したら仮想マシンの構成へ以下の修正を加えます。
新規デバイスを追加
→既存のハードディスク
を選択し、予め用意しておいたvios_l2-adventerprisek9-m.152-1.20180619.vmdk
を指定する- 追加した vmdk ファイル (新規ハードディスク) の
仮想デバイスノード
設定を (SCSI では無く) IDE 接続へ変更する - (
既存のハードディスク
を追加しようとした際に、自動的に SCSI コントローラが追加されてしまっているので) SCSI コントローラを削除する - 好みの枚数、
ネットワークアダプタ
を追加する (※ vSphere 6.7 時点でひとつの仮想マシンあたり、ネットワークアダプタは最大 10 まで)
以下はディスクの設定画面例です。
Step.6
以降の手順で作成した仮想マシンをファイルへエクスポートします。 しかし、vSphere Web Client になってからエクスポート形式が OVF しか選択出来なくなっています。 ファイル数の少ない OVA 形式の方が配布しやすい為、OVA を作成する為に ovftool をインストールします。
My VMware から Linux 用の 64bit 版 ovftool をダウンロードし、インストールします。 しかし、今回の環境ではライブラリが足りず、以下のエラーになりました。
# /bin/sh ./VMware-ovftool-4.3.0-15755677-lin.x86_64.bundle Extracting VMware Installer...done. User interface initialization failed. Exiting. Check the log for details.
必要なライブラリを追加インストールします。
dnf -y install libnsl ncurses-compat-libs
再度、ovftool をインストールします。 ライセンス条項を承諾するのが手間なので、引数を指定してしまいます。
# /bin/sh VMware-ovftool-4.3.0-15755677-lin.x86_64.bundle --console --required --eulas-agreed
これで ovftool がインストール出来ました。
Step.7
ovftool を使って仮想マシンを OVA 形式でエクスポートします。 ただ、vCenter / ESXi に接続する際のパスワードに記号を含んでいる場合、URL エンコードする必要があります。 具体的には以下のように実行します (PASSWORD
部分を任意に書き換えます)。
python -c 'import urllib.parse; import os; print(urllib.parse.quote_plus("PASSWORD"))'
これで URL エンコードされたパスワードを得られるはずです。 ovftool で仮想マシンを OVA 形式でエクスポートします。
ovftool vi://USERNAME:PASSWORD@ADDRESS/vios_l2-adventerprisek9-m.152-1.20180619 ./vios_l2-adventerprisek9-m.152-1.20180619.ova
Step.8
この OVA ファイルのままでも利用することは可能なのですが、OVA ファイルをデプロイする際にウィザード形式でネットワークを割り当て出来るように修正します。 一旦、OVA ファイルを展開します。
tar xvf vios_l2-adventerprisek9-m.152-1.20180619.ova
vios_l2-adventerprisek9-m.152-1.20180619.ovf
の内容を以下のように書き換えます。
<?xml version="1.0" encoding="UTF-8"?> <!--Generated by VMware ESX Server, User: root, UTC time: 2020-05-08T15:23:35.823272Z--> <Envelope vmw:buildId="build-10302608" 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="vios_l2-adventerprisek9-m.152-1.20180619-disk1.vmdk" ovf:id="file1" ovf:size="46556160"/> </References> <DiskSection> <Info>Virtual disk information</Info> <Disk ovf:capacity="2" ovf:capacityAllocationUnits="byte * 2^30" ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" ovf:populatedSize="106692608"/> </DiskSection> <NetworkSection> <Info>The list of logical networks</Info> <Network ovf:name="Ethernet 1"> <Description>Ethernet 1</Description> </Network> <Network ovf:name="Ethernet 2"> <Description>Ethernet 2</Description> </Network> <Network ovf:name="Ethernet 3"> <Description>Ethernet 3</Description> </Network> <Network ovf:name="Ethernet 4"> <Description>Ethernet 4</Description> </Network> <Network ovf:name="Ethernet 5"> <Description>Ethernet 5</Description> </Network> <Network ovf:name="Ethernet 6"> <Description>Ethernet 6</Description> </Network> <Network ovf:name="Ethernet 7"> <Description>Ethernet 7</Description> </Network> <Network ovf:name="Ethernet 8"> <Description>Ethernet 8</Description> </Network> <Network ovf:name="Ethernet 9"> <Description>Ethernet 9</Description> </Network> <Network ovf:name="Ethernet 10"> <Description>Ethernet 10</Description> </Network> </NetworkSection> <VirtualSystem ovf:id="vios_l2-adventerprisek9-m.152-1.20180619"> <Info>A virtual machine</Info> <Name>vios_l2-adventerprisek9-m.152-1.20180619</Name> <OperatingSystemSection ovf:id="101" vmw:osType="otherLinux64Guest"> <Info>The kind of installed guest operating system</Info> </OperatingSystemSection> <VirtualHardwareSection> <Info>Virtual hardware requirements</Info> <System> <vssd:ElementName>Virtual Hardware Family</vssd:ElementName> <vssd:InstanceID>0</vssd:InstanceID> <vssd:VirtualSystemIdentifier>vios_l2-adventerprisek9-m.152-1.20180619</vssd:VirtualSystemIdentifier> <vssd:VirtualSystemType>vmx-14</vssd:VirtualSystemType> </System> <Item> <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits> <rasd:Description>Number of Virtual CPUs</rasd:Description> <rasd:ElementName>1 virtual CPU(s)</rasd:ElementName> <rasd:InstanceID>1</rasd:InstanceID> <rasd:ResourceType>3</rasd:ResourceType> <rasd:VirtualQuantity>1</rasd:VirtualQuantity> </Item> <Item> <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits> <rasd:Description>Memory Size</rasd:Description> <rasd:ElementName>512MB of memory</rasd:ElementName> <rasd:InstanceID>2</rasd:InstanceID> <rasd:ResourceType>4</rasd:ResourceType> <rasd:VirtualQuantity>512</rasd:VirtualQuantity> </Item> <Item> <rasd:Address>1</rasd:Address> <rasd:Description>IDE Controller</rasd:Description> <rasd:ElementName>VirtualIDEController 1</rasd:ElementName> <rasd:InstanceID>3</rasd:InstanceID> <rasd:ResourceType>5</rasd:ResourceType> </Item> <Item> <rasd:Address>0</rasd:Address> <rasd:Description>IDE Controller</rasd:Description> <rasd:ElementName>VirtualIDEController 0</rasd:ElementName> <rasd:InstanceID>4</rasd:InstanceID> <rasd:ResourceType>5</rasd:ResourceType> </Item> <Item ovf:required="false"> <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation> <rasd:ElementName>VirtualVideoCard</rasd:ElementName> <rasd:InstanceID>5</rasd:InstanceID> <rasd:ResourceType>24</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="useAutoDetect" vmw:value="false"/> <vmw:Config ovf:required="false" vmw:key="videoRamSizeInKB" vmw:value="4096"/> <vmw:Config ovf:required="false" vmw:key="enable3DSupport" vmw:value="false"/> <vmw:Config ovf:required="false" vmw:key="use3dRenderer" vmw:value="automatic"/> </Item> <Item ovf:required="false"> <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation> <rasd:ElementName>VirtualVMCIDevice</rasd:ElementName> <rasd:InstanceID>6</rasd:InstanceID> <rasd:ResourceSubType>vmware.vmci</rasd:ResourceSubType> <rasd:ResourceType>1</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="allowUnrestrictedCommunication" vmw:value="false"/> </Item> <Item> <rasd:AddressOnParent>0</rasd:AddressOnParent> <rasd:ElementName>Hard Disk 1</rasd:ElementName> <rasd:HostResource>ovf:/disk/vmdisk1</rasd:HostResource> <rasd:InstanceID>7</rasd:InstanceID> <rasd:Parent>4</rasd:Parent> <rasd:ResourceType>17</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="backing.writeThrough" vmw:value="false"/> </Item> <Item> <rasd:AddressOnParent>7</rasd:AddressOnParent> <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> <rasd:Connection>Ethernet 1</rasd:Connection> <rasd:Description>Ethernet 1</rasd:Description> <rasd:ElementName>Ethernet 1</rasd:ElementName> <rasd:InstanceID>8</rasd:InstanceID> <rasd:ResourceSubType>E1000</rasd:ResourceSubType> <rasd:ResourceType>10</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="connectable.allowGuestControl" vmw:value="true"/> </Item> <Item> <rasd:AddressOnParent>8</rasd:AddressOnParent> <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> <rasd:Connection>Ethernet 2</rasd:Connection> <rasd:Description>Ethernet 2</rasd:Description> <rasd:ElementName>Ethernet 2</rasd:ElementName> <rasd:InstanceID>9</rasd:InstanceID> <rasd:ResourceSubType>E1000</rasd:ResourceSubType> <rasd:ResourceType>10</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="connectable.allowGuestControl" vmw:value="true"/> </Item> <Item> <rasd:AddressOnParent>9</rasd:AddressOnParent> <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> <rasd:Connection>Ethernet 3</rasd:Connection> <rasd:Description>Ethernet 3</rasd:Description> <rasd:ElementName>Ethernet 3</rasd:ElementName> <rasd:InstanceID>10</rasd:InstanceID> <rasd:ResourceSubType>E1000</rasd:ResourceSubType> <rasd:ResourceType>10</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="connectable.allowGuestControl" vmw:value="true"/> </Item> <Item> <rasd:AddressOnParent>10</rasd:AddressOnParent> <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> <rasd:Connection>Ethernet 4</rasd:Connection> <rasd:Description>Ethernet 4</rasd:Description> <rasd:ElementName>Ethernet 4</rasd:ElementName> <rasd:InstanceID>11</rasd:InstanceID> <rasd:ResourceSubType>E1000</rasd:ResourceSubType> <rasd:ResourceType>10</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="connectable.allowGuestControl" vmw:value="true"/> </Item> <Item> <rasd:AddressOnParent>11</rasd:AddressOnParent> <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> <rasd:Connection>Ethernet 5</rasd:Connection> <rasd:Description>Ethernet 5</rasd:Description> <rasd:ElementName>Ethernet 5</rasd:ElementName> <rasd:InstanceID>12</rasd:InstanceID> <rasd:ResourceSubType>E1000</rasd:ResourceSubType> <rasd:ResourceType>10</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="connectable.allowGuestControl" vmw:value="true"/> </Item> <Item> <rasd:AddressOnParent>12</rasd:AddressOnParent> <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> <rasd:Connection>Ethernet 6</rasd:Connection> <rasd:Description>Ethernet 6</rasd:Description> <rasd:ElementName>Ethernet 6</rasd:ElementName> <rasd:InstanceID>13</rasd:InstanceID> <rasd:ResourceSubType>E1000</rasd:ResourceSubType> <rasd:ResourceType>10</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="connectable.allowGuestControl" vmw:value="true"/> </Item> <Item> <rasd:AddressOnParent>13</rasd:AddressOnParent> <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> <rasd:Connection>Ethernet 7</rasd:Connection> <rasd:Description>Ethernet 7</rasd:Description> <rasd:ElementName>Ethernet 7</rasd:ElementName> <rasd:InstanceID>14</rasd:InstanceID> <rasd:ResourceSubType>E1000</rasd:ResourceSubType> <rasd:ResourceType>10</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="connectable.allowGuestControl" vmw:value="true"/> </Item> <Item> <rasd:AddressOnParent>14</rasd:AddressOnParent> <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> <rasd:Connection>Ethernet 8</rasd:Connection> <rasd:Description>Ethernet 8</rasd:Description> <rasd:ElementName>Ethernet 8</rasd:ElementName> <rasd:InstanceID>15</rasd:InstanceID> <rasd:ResourceSubType>E1000</rasd:ResourceSubType> <rasd:ResourceType>10</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="connectable.allowGuestControl" vmw:value="true"/> </Item> <Item> <rasd:AddressOnParent>15</rasd:AddressOnParent> <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> <rasd:Connection>Ethernet 9</rasd:Connection> <rasd:Description>Ethernet 9</rasd:Description> <rasd:ElementName>Ethernet 9</rasd:ElementName> <rasd:InstanceID>16</rasd:InstanceID> <rasd:ResourceSubType>E1000</rasd:ResourceSubType> <rasd:ResourceType>10</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="connectable.allowGuestControl" vmw:value="true"/> </Item> <Item> <rasd:AddressOnParent>16</rasd:AddressOnParent> <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation> <rasd:Connection>Ethernet 10</rasd:Connection> <rasd:Description>Ethernet 10</rasd:Description> <rasd:ElementName>Ethernet 10</rasd:ElementName> <rasd:InstanceID>17</rasd:InstanceID> <rasd:ResourceSubType>E1000</rasd:ResourceSubType> <rasd:ResourceType>10</rasd:ResourceType> <vmw:Config ovf:required="false" vmw:key="wakeOnLanEnabled" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="connectable.allowGuestControl" vmw:value="true"/> </Item> <vmw:Config ovf:required="false" vmw:key="cpuHotAddEnabled" vmw:value="false"/> <vmw:Config ovf:required="false" vmw:key="cpuHotRemoveEnabled" vmw:value="false"/> <vmw:Config ovf:required="false" vmw:key="memoryHotAddEnabled" vmw:value="false"/> <vmw:Config ovf:required="false" vmw:key="firmware" vmw:value="bios"/> <vmw:Config ovf:required="false" vmw:key="tools.syncTimeWithHost" vmw:value="false"/> <vmw:Config ovf:required="false" vmw:key="tools.afterPowerOn" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="tools.afterResume" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="tools.beforeGuestShutdown" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="tools.beforeGuestStandby" vmw:value="true"/> <vmw:Config ovf:required="false" vmw:key="tools.toolsUpgradePolicy" vmw:value="manual"/> <vmw:Config ovf:required="false" vmw:key="powerOpInfo.powerOffType" vmw:value="soft"/> <vmw:Config ovf:required="false" vmw:key="powerOpInfo.resetType" vmw:value="soft"/> <vmw:Config ovf:required="false" vmw:key="powerOpInfo.suspendType" vmw:value="hard"/> <vmw:Config ovf:required="false" vmw:key="nestedHVEnabled" vmw:value="false"/> <vmw:Config ovf:required="false" vmw:key="virtualICH7MPresent" vmw:value="false"/> <vmw:Config ovf:required="false" vmw:key="virtualSMCPresent" vmw:value="false"/> <vmw:Config ovf:required="false" vmw:key="flags.vvtdEnabled" vmw:value="false"/> <vmw:Config ovf:required="false" vmw:key="flags.vbsEnabled" vmw:value="false"/> <vmw:Config ovf:required="false" vmw:key="bootOptions.efiSecureBootEnabled" vmw:value="false"/> <vmw:Config ovf:required="false" vmw:key="powerOpInfo.standbyAction" vmw:value="checkpoint"/> <vmw:ExtraConfig ovf:required="false" vmw:key="nvram" vmw:value="vios_l2-adventerprisek9-m.152-1.20180619.nvram"/> </VirtualHardwareSection> </VirtualSystem> </Envelope>
再度、OVA 形式に圧縮し直します。 ovftool でエクスポートした OVA ファイルには SHA256 のハッシュ値を記載した .mf ファイルが含まれていますが、これは必須では無い為、除外しています。
tar cvf \ vios_l2-adventerprisek9-m.152-1.20180619.ova \ vios_l2-adventerprisek9-m.152-1.20180619.ovf \ vios_l2-adventerprisek9-m.152-1.20180619-disk1.vmdk
Step.9
これで準備 OK です。 OVA ファイルから仮想マシンを作成後、シリアルコンソールを追加して設定します。 尚、IOSvL2 は上手くトラフィック処理出来ていないように見えた (IOSvL2 からパケットが送信されいない。但し、受信は出来ていた) のですが、IOSv は問題無く利用出来ました。
Step.10
…という夢をみました。