Cisco Catalyst Center 2.3.7.x on ESXi をProxmoxにインストールしてみた

# はじめに
Cisco Catalyst Center 2.3.7.x on ESXi をご存じでしょうか。
Cisco Catalyst Center は Cisco DNA Center が 2.3.7.x系から名称が変更されたもので、さらに2.3.7.x系から従来の専用アプライアンスだけではなく、ESXi上での仮想マシンとしての提供が始まりました。

VM要件の主なところを並べると以下の通りです。

| Feature | Description |
|:-|:-|
| Virtualization platform and hypervisor | VMware vSphere (which includes ESXi and vCenter Server) 7.0.x or later, including all patches.  |
| Processors  |  Intel Xeon Scalable server processor (Cascade Lake or newer) or AMD EPYC Gen2 with 2.1 GHz or better clock speed. <br>32 vCPUs with 64-GHz reservation must be dedicated to the VM. |
| Memory | 256-GB DRAM with 256-GB reservation must be dedicated to the VM.  |
| Storage  |  3-TB solid-state drive (SSD). <br>If you plan to create backups of your virtual appliance, also reserve additional datastore space. For information, see "Backup Server Requirements" in the Cisco Catalyst Center on ESXi Administrator Guide. |
| I/O Bandwitdh | 180 MB/sec. |
|  Input/output operations per second (IOPS) rate | 2000-2500, with less than 5 ms of I/O completion latency.  |
| Latency  |  Catalyst Center on ESXi to network device connectivity: 200 ms. |


https://www.cisco.com/c/en/us/td/docs/cloud-systems-management/network-automation-and-management/catalyst-center/catalyst-center-va/esxi/2-3-7/deployment-guide/b_cisco_catalyst_center_237x_on_esxi_deployment_guide.html

:::note info
メモリは256GBを仮想マシンに割り当てる必要があるため、ホストマシンは256GBより多いメモリの搭載が必要になります。
:::


# 目的
私は検証環境としてProxmoxが好きなので、サポート外でありますが、Proxmox上にCisco Catalyst Centerをインストールしてみましょう。

:::note alert
本件はメーカーでは未サポートのデプロイになります。
自己責任での利用をお願いします。
:::

# 手順
Catalyst Center 2.3.7.7 および、 Proxmox 8.3.0 でのテストを実施しました。

CiscoのCCOのサイトからCisco Catalyst Center の.ovaファイルを取得して解凍します。

``` text
$ tar xvf CatC-SW-2.3.7.7-VA.ova
CatC-SW-2.3.7.7-VA_SHA256.ovf
CatC-SW-2.3.7.7-VA_SHA256.mf
CatC-SW-2.3.7.7-VA_SHA256.cert
CatC-SW-2.3.7.7-VA_SHA256-disk1.vmdk
CatC-SW-2.3.7.7-VA_SHA256-disk2.vmdk
CatC-SW-2.3.7.7-VA_SHA256-disk3.vmdk
```

私はLVM-ThinをVM向けストレージにしているので、VMDKからrawファイルに変換します。ZFSでも同様です。

``` text
$ qemu-img convert -f vmdk -O raw CatC-SW-2.3.7.7-VA_SHA256-disk1.vmdk CatC-SW-2.3.7.7-VA_SHA256-disk1.raw
$ qemu-img convert -f vmdk -O raw CatC-SW-2.3.7.7-VA_SHA256-disk2.vmdk CatC-SW-2.3.7.7-VA_SHA256-disk2.raw
$ qemu-img convert -f vmdk -O raw CatC-SW-2.3.7.7-VA_SHA256-disk3.vmdk CatC-SW-2.3.7.7-VA_SHA256-disk3.raw
```

標準状態ではVMwareとProxmoxでPCIスロットの番号が異なることから、インストーラを書き換えるためにRAWファイルをマウントします。
本来ESXi用なので、NIC interface が ens160 を期待するインストーラになっている。(PCI slot 16番)

これをProxmoxにインストールしたとき (i440fx)の ens18等に書き換える不調があります。
/dev/sda1-part4 が当該のイメージファイルなので、適当にmountして書き換えるのが手っ取り早いです。


sed -i s/検索パターン/置換パターン/g ファイル名

``` text
$ sudo losetup -f -P test/CatC-SW-2.3.7.7-VA_SHA256-disk1.raw
$ sudo mount /dev/loop0p4 /media/
cd /media
```

マウントしたイメージ上で、関連するファイルを探します。バージョン毎に出てくるファイルが異なっているので、バージョンが違う場合はきちんと確認ください。

``` text
$ find . -type f -exec grep -q ens160 {} \; -print
```

出てきたファイルに対して書き換えます。

```text

sudo sed -i s/ens160/ens18/g ./etc/maglev/web-install/dna-preinstall_map.json
sudo sed -i s/ens160/ens18/g ./etc/maglev/web-install/dnacluster-preinstall_map.json
sudo sed -i s/ens160/ens18/g ./etc/maglev/web-install/maglevsystem-postinstall_map.json
sudo sed -i s/ens160/ens18/g ./etc/maglev/web-install/maglevsystem-preinstall_map.json
sudo sed -i s/ens160/ens18/g ./etc/maglev/web-install/maglevsystemseed-postinstall_map.json
sudo sed -i s/ens160/ens18/g ./etc/maglev/web-install/maglevsystemseed-preinstall_map.json
sudo sed -i s/ens160/ens18/g ./etc/maglev/web-install/preinstall_map.json
sudo sed -i s/ens160/ens18/g ./etc/maglev/cloud-init-netplan.cfg
sudo sed -i s/ens160/ens18/g ./etc/netplan/config.yaml.temp
sudo sed -i s/ens160/ens18/g ./etc/netplan/config.yaml.orig
sudo sed -i s/ens160/ens18/g ./etc/netplan/config.yaml.prime
sudo sed -i s/ens160/ens18/g ./etc/netplan/config.yaml
sudo sed -i s/ens160/ens18/g ./etc/network/interfaces.orig
sudo sed -i s/ens160/ens18/g ./mnt/install-artifacts/apps-deploy/product-config/bond_map.json
sudo sed -i s/ens160/ens18/g ./mnt/install-artifacts/bond_map.json
sudo sed -i s/ens160/ens18/g ./mnt/install-artifacts/dna-preinstall_map.json
sudo sed -i s/ens160/ens18/g ./mnt/install-artifacts/dnacluster-preinstall_map.json
sudo sed -i s/ens160/ens18/g ./mnt/install-artifacts/interface_map.json
sudo sed -i s/ens160/ens18/g ./mnt/install-artifacts/maglevsystem-postinstall_map.json
sudo sed -i s/ens160/ens18/g ./mnt/install-artifacts/maglevsystem-preinstall_map.json
sudo sed -i s/ens160/ens18/g ./mnt/install-artifacts/maglevsystemseed-postinstall_map.json
sudo sed -i s/ens160/ens18/g ./mnt/install-artifacts/maglevsystemseed-preinstall_map.json
sudo sed -i s/ens160/ens18/g ./mnt/install-artifacts/mks-edge-manufactured.json
sudo sed -i s/ens160/ens18/g ./mnt/install-artifacts/mks_edge-interface_map.json
sudo sed -i s/ens160/ens18/g ./mnt/install-artifacts/preinstall_map.json
sudo sed -i s/ens160/ens18/g ./usr/local/lib/python3.6/dist-packages/maglev_config_wizard/ansible/roles/cloud-enablement/files/aws/udev.rules
sudo sed -i s/ens160/ens18/g ./usr/local/lib/python3.6/dist-packages/maglev_config_wizard/ansible/roles/cloud-enablement/files/cloud-init-netplan.cfg

sudo sed -i s/ens192/ens19/g ./etc/maglev/web-install/dna-preinstall_map.json
sudo sed -i s/ens192/ens19/g ./etc/maglev/web-install/dnacluster-preinstall_map.json
sudo sed -i s/ens192/ens19/g ./etc/maglev/web-install/maglevsystem-postinstall_map.json
sudo sed -i s/ens192/ens19/g ./etc/maglev/web-install/maglevsystem-preinstall_map.json
sudo sed -i s/ens192/ens19/g ./etc/maglev/web-install/maglevsystemseed-postinstall_map.json
sudo sed -i s/ens192/ens19/g ./etc/maglev/web-install/maglevsystemseed-preinstall_map.json
sudo sed -i s/ens192/ens19/g ./etc/maglev/web-install/preinstall_map.json
sudo sed -i s/ens192/ens19/g ./etc/maglev/cloud-init-netplan.cfg
sudo sed -i s/ens192/ens19/g ./etc/netplan/config.yaml.temp
sudo sed -i s/ens192/ens19/g ./etc/netplan/config.yaml.orig
sudo sed -i s/ens192/ens19/g ./etc/netplan/config.yaml.prime
sudo sed -i s/ens192/ens19/g ./etc/netplan/config.yaml
sudo sed -i s/ens192/ens19/g ./etc/network/interfaces.orig
sudo sed -i s/ens192/ens19/g ./mnt/install-artifacts/apps-deploy/product-config/bond_map.json
sudo sed -i s/ens192/ens19/g ./mnt/install-artifacts/bond_map.json
sudo sed -i s/ens192/ens19/g ./mnt/install-artifacts/dna-preinstall_map.json
sudo sed -i s/ens192/ens19/g ./mnt/install-artifacts/dnacluster-preinstall_map.json
sudo sed -i s/ens192/ens19/g ./mnt/install-artifacts/interface_map.json
sudo sed -i s/ens192/ens19/g ./mnt/install-artifacts/maglevsystem-postinstall_map.json
sudo sed -i s/ens192/ens19/g ./mnt/install-artifacts/maglevsystem-preinstall_map.json
sudo sed -i s/ens192/ens19/g ./mnt/install-artifacts/maglevsystemseed-postinstall_map.json
sudo sed -i s/ens192/ens19/g ./mnt/install-artifacts/maglevsystemseed-preinstall_map.json
sudo sed -i s/ens192/ens19/g ./mnt/install-artifacts/mks-edge-manufactured.json
sudo sed -i s/ens192/ens19/g ./mnt/install-artifacts/mks_edge-interface_map.json
sudo sed -i s/ens192/ens19/g ./mnt/install-artifacts/preinstall_map.json
sudo sed -i s/ens192/ens19/g ./usr/local/lib/python3.6/dist-packages/maglev_config_wizard/ansible/roles/cloud-enablement/files/aws/udev.rules
sudo sed -i s/ens192/ens19/g ./usr/local/lib/python3.6/dist-packages/maglev_config_wizard/ansible/roles/cloud-enablement/files/cloud-init-netplan.cfg

sudo sed -i s/ens224/ens20/g ./etc/maglev/web-install/dna-preinstall_map.json
sudo sed -i s/ens224/ens20/g ./etc/maglev/web-install/dnacluster-preinstall_map.json
sudo sed -i s/ens224/ens20/g ./etc/maglev/web-install/maglevsystem-postinstall_map.json
sudo sed -i s/ens224/ens20/g ./etc/maglev/web-install/maglevsystem-preinstall_map.json
sudo sed -i s/ens224/ens20/g ./etc/maglev/web-install/maglevsystemseed-postinstall_map.json
sudo sed -i s/ens224/ens20/g ./etc/maglev/web-install/maglevsystemseed-preinstall_map.json
sudo sed -i s/ens224/ens20/g ./etc/maglev/web-install/preinstall_map.json
sudo sed -i s/ens224/ens20/g ./etc/maglev/cloud-init-netplan.cfg
sudo sed -i s/ens224/ens20/g ./etc/netplan/config.yaml.temp
sudo sed -i s/ens224/ens20/g ./etc/netplan/config.yaml.orig
sudo sed -i s/ens224/ens20/g ./etc/netplan/config.yaml.prime
sudo sed -i s/ens224/ens20/g ./etc/netplan/config.yaml
sudo sed -i s/ens224/ens20/g ./etc/network/interfaces.orig
sudo sed -i s/ens224/ens20/g ./mnt/install-artifacts/apps-deploy/product-config/bond_map.json
sudo sed -i s/ens224/ens20/g ./mnt/install-artifacts/bond_map.json
sudo sed -i s/ens224/ens20/g ./mnt/install-artifacts/dna-preinstall_map.json
sudo sed -i s/ens224/ens20/g ./mnt/install-artifacts/dnacluster-preinstall_map.json
sudo sed -i s/ens224/ens20/g ./mnt/install-artifacts/interface_map.json
sudo sed -i s/ens224/ens20/g ./mnt/install-artifacts/maglevsystem-postinstall_map.json
sudo sed -i s/ens224/ens20/g ./mnt/install-artifacts/maglevsystem-preinstall_map.json
sudo sed -i s/ens224/ens20/g ./mnt/install-artifacts/maglevsystemseed-postinstall_map.json
sudo sed -i s/ens224/ens20/g ./mnt/install-artifacts/maglevsystemseed-preinstall_map.json
sudo sed -i s/ens224/ens20/g ./mnt/install-artifacts/mks-edge-manufactured.json
sudo sed -i s/ens224/ens20/g ./mnt/install-artifacts/mks_edge-interface_map.json
sudo sed -i s/ens224/ens20/g ./mnt/install-artifacts/preinstall_map.json
sudo sed -i s/ens224/ens20/g ./usr/local/lib/python3.6/dist-packages/maglev_config_wizard/ansible/roles/cloud-enablement/files/aws/udev.rules
sudo sed -i s/ens224/ens20/g ./usr/local/lib/python3.6/dist-packages/maglev_config_wizard/ansible/roles/cloud-enablement/files/cloud-init-netplan.cfg

sudo sed -i s/ens256/ens21/g ./etc/maglev/web-install/dna-preinstall_map.json
sudo sed -i s/ens256/ens21/g ./etc/maglev/web-install/dnacluster-preinstall_map.json
sudo sed -i s/ens256/ens21/g ./etc/maglev/web-install/maglevsystem-postinstall_map.json
sudo sed -i s/ens256/ens21/g ./etc/maglev/web-install/maglevsystem-preinstall_map.json
sudo sed -i s/ens256/ens21/g ./etc/maglev/web-install/maglevsystemseed-postinstall_map.json
sudo sed -i s/ens256/ens21/g ./etc/maglev/web-install/maglevsystemseed-preinstall_map.json
sudo sed -i s/ens256/ens21/g ./etc/maglev/web-install/preinstall_map.json
sudo sed -i s/ens256/ens21/g ./etc/maglev/cloud-init-netplan.cfg
sudo sed -i s/ens256/ens21/g ./etc/netplan/config.yaml.temp
sudo sed -i s/ens256/ens21/g ./etc/netplan/config.yaml.orig
sudo sed -i s/ens256/ens21/g ./etc/netplan/config.yaml.prime
sudo sed -i s/ens256/ens21/g ./etc/netplan/config.yaml
sudo sed -i s/ens256/ens21/g ./etc/network/interfaces.orig
sudo sed -i s/ens256/ens21/g ./mnt/install-artifacts/apps-deploy/product-config/bond_map.json
sudo sed -i s/ens256/ens21/g ./mnt/install-artifacts/bond_map.json
sudo sed -i s/ens256/ens21/g ./mnt/install-artifacts/dna-preinstall_map.json
sudo sed -i s/ens256/ens21/g ./mnt/install-artifacts/dnacluster-preinstall_map.json
sudo sed -i s/ens256/ens21/g ./mnt/install-artifacts/interface_map.json
sudo sed -i s/ens256/ens21/g ./mnt/install-artifacts/maglevsystem-postinstall_map.json
sudo sed -i s/ens256/ens21/g ./mnt/install-artifacts/maglevsystem-preinstall_map.json
sudo sed -i s/ens256/ens21/g ./mnt/install-artifacts/maglevsystemseed-postinstall_map.json
sudo sed -i s/ens256/ens21/g ./mnt/install-artifacts/maglevsystemseed-preinstall_map.json
sudo sed -i s/ens256/ens21/g ./mnt/install-artifacts/mks-edge-manufactured.json
sudo sed -i s/ens256/ens21/g ./mnt/install-artifacts/mks_edge-interface_map.json
sudo sed -i s/ens256/ens21/g ./mnt/install-artifacts/preinstall_map.json
sudo sed -i s/ens256/ens21/g ./usr/local/lib/python3.6/dist-packages/maglev_config_wizard/ansible/roles/cloud-enablement/files/aws/udev.rules
sudo sed -i s/ens256/ens21/g ./usr/local/lib/python3.6/dist-packages/maglev_config_wizard/ansible/roles/cloud-enablement/files/cloud-init-netplan.cfg
```

Proxmoxの仮想マシンにストレージとしてインポートします。今回は仮想マシンのIDは500、ストレージの保存は"data"を使用しています。

```text
$ sudo qm importdisk 500 CatC-SW-2.3.7.7-VA_SHA256-disk1.raw data
$ sudo qm importdisk 500 CatC-SW-2.3.7.7-VA_SHA256-disk2.raw data
$ sudo qm importdisk 500 CatC-SW-2.3.7.7-VA_SHA256-disk3.raw data
```

あとは当該ストレージをProxmoxの仮想マシンにアタッチして終了です。

仮想マシンのハードウェア構成です
![Screenshot 2024-12-11 at 13.54.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385067/c71420ee-3e89-800c-569d-52bf0fce6c78.png)

無事にブートしました
![Screenshot 2024-12-11 at 13.55.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385067/8546a16b-222e-4418-cbd4-be0b40d1676e.png)

セットアップが終了して起動しました
![Screenshot 2024-12-11 at 14.03.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385067/53699bf6-0dfc-0db1-aaf6-047a6dd09c9c.png)


# まとめ
今回はProxmox上に Cisco Catalyst Center 仮想版をインストールしてみました。
皆さん、よい検証を！