Running Cisco UC Appliances In Proxmox (i.e., CUCM, CUCS, Expressway, IM&P, CMS, CSR1000v)

ciscoucguy

New Member
Nov 4, 2023
1
0
1
I've just literally started using ProxMox as an alternative to VmWare ESXi for testing purposes.

My issue as of now is that I cannot build a Cisco call manager (a.k.a., "CUCM") inside of proxmox (see attachment).

I've no doubt the issue is my not fully grasping proxmox in addition to not finding any information regarding running a cisco call manager in a proxmox environment.

Is there anyone here who has any experience running cisco appliances on a proxmox hypervisor?

Thanks in advance...

Jay
 

Attachments

  • CUCM_Proxmox Error (4 Nov 2023).jpg
    CUCM_Proxmox Error (4 Nov 2023).jpg
    116.4 KB · Views: 55
I've just literally started using ProxMox as an alternative to VmWare ESXi for testing purposes.
My issue as of now is that I cannot build a Cisco call manager (a.k.a., "CUCM") inside of proxmox (see attachment).
I've no doubt the issue is my not fully grasping proxmox in addition to not finding any information regarding running a cisco call manager in a proxmox environment.
Is there anyone here who has any experience running cisco appliances on a proxmox hypervisor?
I'm trying the same with CUCM 15 on Proxmox 8.2, with no luck so far either.

Cisco currently only supports ESXi and I think it checks some parameters during bootup of the installation media. So, if Proxmox wants to be a full replacement of ESXi, it needs to have a compatibility mode where the hypervisor of Proxmox mimics the ESXi hypervisor.

For example these settings (dmidecod):

Code:
BIOS Information
        Vendor: SeaBIOS
        Version: rel-1.16.2-0-gea1b7a073390-prebuilt.qemu.org
        Release Date: 04/01/2014
        Address: 0xE8000
        Runtime Size: 96 kB
        ROM Size: 64 kB
        Characteristics:
                BIOS characteristics not supported
                Targeted content distribution is supported
        BIOS Revision: 0.0

Handle 0x0100, DMI type 1, 27 bytes
System Information
        Manufacturer: QEMU
        Product Name: Standard PC (Q35 + ICH9, 2009)
        Version: pc-q35-8.1
        Serial Number: Not Specified
        UUID: 4434a6d8-9bab-4fa8-926f-de84ef79a9ea
        Wake-up Type: Power Switch
        SKU Number: Not Specified
        Family: Not Specified

Handle 0x0300, DMI type 3, 22 bytes
Chassis Information
        Manufacturer: QEMU
        Type: Other
        Lock: Not Present
        Version: pc-q35-8.1
        Serial Number: Not Specified
        Asset Tag: Not Specified
        Boot-up State: Safe
        Power Supply State: Safe
        Thermal State: Safe
        Security Status: Unknown
        OEM Information: 0x00000000
        Height: Unspecified
        Number Of Power Cords: Unspecified
        Contained Elements: 0
        SKU Number: Not Specified

When a vendor of appliances is checking the plattform, it is easy to detect that this is not ESXi, but something different.

Furthermore I assume that the Cisco UC installer is more strict than CUCM itself after installation. So, it may work when installing on ESXi and migrating the installed disk image afterwards. Sadly, I have no ESXi at hand to try this.

Regars,
Ingo
 
Cisco currently only supports ESXi and I think it checks some parameters during bootup of the installation media. So, if Proxmox wants to be a full replacement of ESXi, it needs to have a compatibility mode where the hypervisor of Proxmox mimics the ESXi hypervisor.
Or you could, you know, ask the vendor of the expensive software you want to use to support the environment you want to use. Why is it always on the open source community to get proprietary things to work? Seems to me that if you are paying big bucks for something you ought to get more than abuse and being ignored.

ETA: If Cisco has instructions for "KVM based hypervisors" or similar, that should be helpful for running in Proxmox.
 
Last edited:
Or you could, you know, ask the vendor of the expensive software you want to use to support the environment you want to use. Why is it always on the open source community to get proprietary things to work? Seems to me that if you are paying big bucks for something you ought to get more than abuse and being ignored.

ETA: If Cisco has instructions for "KVM based hypervisors" or similar, that should be helpful for running in Proxmox.
It is as it is. On-Prem products do have a difficult stand within Cisco anyway as Cisco is heavily promoting Cloud services.

Anyway, it is not that Cisco isn't dealing with that topic of Proxmox: https://community.cisco.com/t5/devnet-general-discussions/word-of-the-week-proxmox/td-p/4827187

And when looking into the installer (see the previous Github link), you can see that there are other hypervisors as well, including KVM/QEMU. The Github link deals with that in a way that it modifies the install scripts to use KVM instead of ESXi.

However, when the installation would be successful, it is (state of now) a totally unsupported platform.

But I agree: the customers should urge Cisco to support other virtualization platforms like Proxmox, especially when considering the Broadcom change in licensing. Nonetheless there won't be a quick change in Ciscos policy.
 
I followed the same https://github.com/david8862/create-cucm-kvm-iso with a CUCM 14 installation disk as well and ran into an issue that was due to the naming of the disk. I found a solution in form of an additional line for the script, I documented this in the issues section. I just received my final proxmox hardware today and I am in the process of installing a CUCM right now, after that I will try Unity Connection. The beauty of the script is that it also adds the boot loader, so all you need is an upgrade image

these are my settings:

Bildschirmfoto 2024-07-10 um 16.35.19.png

This is the complete shell script to convert the iso:

Bash:
#! /bin/bash
# Filename: create_cucm_kvm_iso.sh
#
# Copyright (C) 2017  Xiaobin Zhang (david8862@gmail.com)
#
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

#
# main()
#
if [ $# -ne 2 ] ; then
    echo Usage: "`basename $0` SOURCE_ISO DEST_ISO"
    echo "SOURCE_ISO  origin iso image get from Cisco webpage"
    echo "DEST_ISO    output iso image supporting KVM installation"
    exit 1
fi

SOURCE_ISO=$1
DEST_ISO=$2
CURR_PATH=$(pwd)


if [ $(id -un) != "root" ]; then
    echo "Please use root account."
    exit 1
fi

if [ ! -f "$SOURCE_ISO" ]; then
    echo "origin iso un-exists. Please check again."
    exit 1
fi

umount /tmp/iso
umount /tmp/CUCM
rm -rf /tmp/iso
rm -rf /tmp/CUCM
mkdir /tmp/iso
mkdir /tmp/CUCM

mount -o loop $SOURCE_ISO /tmp/iso/
echo "Now syncing ISO to new path, please wait..."
rsync -a /tmp/iso/ /tmp/CUCM/
echo "Syncing finished."

#Remove not used server implementation
pushd /tmp/CUCM/Cisco/hssi/server_implementation/
shopt -s extglob
rm -rf !(KVM|README.TXT|shared|TRANS.TBL)
pushd KVM/
rm -rf !(QEMU|shared|TRANS.TBL)
shopt -u extglob
popd
popd


#Add server hardware detecting error check
sed -i '/HSSI_API $impl returned $isFound and errors/i\            echo "HSSI_API $impl returned $isFound and errors=$validation_errors " >&2' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh

sed -i '/case "$isFound" in/G' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh
sed -i '/case "$isFound" in/a\                ;;' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh
sed -i '/case "$isFound" in/a\                ((validated_count++))' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh
sed -i '/case "$isFound" in/a\                hw_model="$($impl HWModel)"' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh
sed -i '/case "$isFound" in/a\                append_inDataFile_forKey_value $hssi_api_state_file "hardware_implementation_paths" $impl' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh
sed -i '/case "$isFound" in/a\                echo "$($impl HWModel): passed detection validation" >&2' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh
sed -i '/case "$isFound" in/a\                "2")' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh

#Snmp
sed -i '/local method="hasHwSnmpMonitoring"/{n;d}' /tmp/CUCM/Cisco/base_scripts/ihardware.sh
sed -i 's/local method="hasHwSnmpMonitoring"/return 1/g' /tmp/CUCM/Cisco/base_scripts/ihardware.sh

#Remove eth HWADDR check
mv /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh.proposed /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh


sed -i '/_runtime $@/i\function postBootHardwareSetup()' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\{' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    local rc=$HSSI_TRUE' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\\' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    (super postBootHardwareSetup $*)' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    local src=$?' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    # Abort if there is a critical failure' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    if [ $src -eq 1 ]; then' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\        return $src' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    fi' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    rm -f /etc/udev/rules.d/70-persistent-net.rules 2> /dev/null' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\\' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    #' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    # remove hwaddr field from config in case mac address changed.' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    #' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i "/_runtime \$\@/i\    sed -i 's/^HWADDR.*//' /etc/sysconfig/network-scripts/ifcfg-eth* 2> /dev/null" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i "/_runtime \$\@/i\    sed -i 's/^NM_CON.*/NM_CONTROLLED="no"/' /etc/sysconfig/network-scripts/ifcfg-eth* 2> /dev/null" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i "/_runtime \$\@/i\    sed -i 's/^ONBOOT.*/ONBOOT="yes"/' /etc/sysconfig/network-scripts/ifcfg-eth* 2> /dev/null" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i "/_runtime \$\@/i\    return \$rc" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\}' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\\' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh





sed -i '/_runtime $@/i\function postBootHardwareSetup()' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\{' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    local rc=$HSSI_TRUE' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\\' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    (super postBootHardwareSetup $*)' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    local src=$?' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    # Abort if there is a critical failure' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    if [ $src -eq 1 ]; then' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\        return $src' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    fi' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    rm -f /etc/udev/rules.d/70-persistent-net.rules 2> /dev/null' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\\' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    #' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    # remove hwaddr field from config in case mac address changed.' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    #' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i "/_runtime \$\@/i\    sed -i 's/^HWADDR.*//' /etc/sysconfig/network-scripts/ifcfg-eth* 2> /dev/null" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i "/_runtime \$\@/i\    sed -i 's/^NM_CON.*/NM_CONTROLLED="no"/' /etc/sysconfig/network-scripts/ifcfg-eth* 2> /dev/null" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i "/_runtime \$\@/i\    sed -i 's/^ONBOOT.*/ONBOOT="yes"/' /etc/sysconfig/network-scripts/ifcfg-eth* 2> /dev/null" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i "/_runtime \$\@/i\    return \$rc" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\}' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\\' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh

sed -i 's/VDX_PATTERN="vd"/VDX_PATTERN="sd"/g' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh




pushd /tmp/CUCM/
genisoimage -o $CURR_PATH/$DEST_ISO -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -R .
popd

umount /tmp/iso
umount /tmp/CUCM
rm -rf /tmp/iso
rm -rf /tmp/CUCM
echo "KVM ISO is created at $CURR_PATH/$DEST_ISO"
 
I followed the same https://github.com/david8862/create-cucm-kvm-iso with a CUCM 14 installation disk as well and ran into an issue that was due to the naming of the disk. I found a solution in form of an additional line for the script, I documented this in the issues section. I just received my final proxmox hardware today and I am in the process of installing a CUCM right now, after that I will try Unity Connection. The beauty of the script is that it also adds the boot loader, so all you need is an upgrade image

these are my settings:

This is the complete shell script to convert the iso:
Ah, thanks for the update!

EDIT:
Ah, apparently to less space on /tmp. Corrected that and then the scripts runs without issues.


OLD:

Unfortunately the scripts seems to have some issues, at least for me:

Bash:
# ./create_cucm_kvm_iso.sh Bootable_UCSInstall_UCOS.iso Bootable_UCSInstall_UCOS-kvm.iso
umount: /tmp/iso: not mounted.
umount: /tmp/CUCM: not mounted.
mount: /tmp/iso: WARNING: source write-protected, mounted read-only.
Now syncing ISO to new path, please wait...
rsync: [receiver] write failed on "/tmp/CUCM/images/install.img": No space left on device (28)
rsync error: error in file IO (code 11) at receiver.c(380) [receiver=3.2.7]
rsync: [sender] write error: Broken pipe (32)
Syncing finished.
/tmp/CUCM/Cisco/hssi/server_implementation ~
/tmp/CUCM/Cisco/hssi/server_implementation/KVM /tmp/CUCM/Cisco/hssi/server_implementation ~
/tmp/CUCM/Cisco/hssi/server_implementation ~
~
/tmp/CUCM ~
I: -input-charset not specified, using utf-8 (detected in locale settings)
Using CHECK000.;1 for  /checksum_file_sha512 (checksum_file)
Using SYSTE000.RPM;1 for  ./Alma/RPMS/systemd-udev-239-58.el8.x86_64.rpm (systemd-pam-239-58.el8.x86_64.rpm)
Using SYSTE001.RPM;1 for  ./Alma/RPMS/systemd-pam-239-58.el8.x86_64.rpm (systemd-libs-239-58.el8.x86_64.rpm)
Using SYSTE002.RPM;1 for  ./Alma/RPMS/systemd-libs-239-58.el8.x86_64.rpm (systemd-239-58.el8.x86_64.rpm)
[...]
Using PLATF000.;1 for  ./Cisco/ucplatform_post/scripts/platform_services_migrate (platform_certs_migrate)
Using PLATF001.;1 for  ./Cisco/ucplatform_post/scripts/platform_certs_migrate (platform_admin_acct_final)
genisoimage: Uh oh, I cant find the boot image 'isolinux/isolinux.bin' !
~
umount: /tmp/CUCM: not mounted.
KVM ISO is created at /root/Bootable_UCSInstall_UCOS-kvm.iso

The resulting ISO is, well, quite compact:

Bash:
# ls -l /root/Bootable_UCSInstall_UCOS-kvm.iso
-rw-r--r-- 1 root root 34816 Jul 10 18:26 /root/Bootable_UCSInstall_UCOS-kvm.iso

;-)

Regards
Ingo
 
Last edited:
No space left on device (28)
You need to run it on a different storage, the one you are using is full, hence the small image as a result of the script.

Meanwhile I can confirm that it runs for Unity Connection as well, I am in the last stage of the installation. One more thing: The current dialog for creating a VM uses an IDE drive even when the standard SCSI controller has been selected. Delete the IDE drive and create an SCSI drive.

Edit: The installation of Unity Connection just finished successfully.
 
You need to run it on a different storage, the one you are using is full, hence the small image as a result of the script.

Yeah, spotted that already and edited the post accordingly ;)

Meanwhile I can confirm that it runs for Unity Connection as well, I am in the last stage of the installation. One more thing: The current dialog for creating a VM uses an IDE drive even when the standard SCSI controller has been selected. Delete the IDE drive and create an SCSI drive.

Edit: The installation of Unity Connection just finished successfully.

For CUCM 15 there seems to be another issue. HW validation passes, as the install script states, but then the installation is halted:

Bildschirmfoto 2024-07-10 um 19.06.33.png

Bildschirmfoto 2024-07-10 um 19.06.49.png
 
That is unfortunate, it looks like Cisco has removed the KVM support for this release.
Hmmm, that would cause an issue for CUCM 14 at a later stage when upgrading to CUCM 15 as well, I guess.

How does this looks on CUCM 14 ISO?

Bash:
# ls -l /media/Cisco/hssi/server_implementation/*/*/shared/bin/
/media/Cisco/hssi/server_implementation/CLOUD/EC2/shared/bin/:
total 7
-rwxr-xr-x 1 900711 floppy 5913 Mar 14 07:49 api_implementation.sh
-rw-r--r-- 1 900711 floppy  191 Mar 14 07:49 EC2.data
-r--r--r-- 1 900711 floppy  453 Mar 14 09:33 TRANS.TBL

/media/Cisco/hssi/server_implementation/CLOUD/GOOGLE/shared/bin/:
total 7
-rwxr-xr-x 1 900711 floppy 5251 Mar 14 07:49 api_implementation.sh
-rw-r--r-- 1 900711 floppy  191 Mar 14 07:49 GOOGLE.data
-r--r--r-- 1 900711 floppy  456 Mar 14 09:33 TRANS.TBL

/media/Cisco/hssi/server_implementation/KVM/HAL/shared/bin/:
total 8
-rwxr-xr-x 1 900711 floppy 5310 Mar 14 07:49 api_implementation.sh
-rw-r--r-- 1 900711 floppy   28 Mar 14 07:49 HAL.data
-rw-r--r-- 1 900711 floppy   92 Mar 14 07:49 README.TXT
-r--r--r-- 1 900711 floppy  675 Mar 14 09:33 TRANS.TBL

/media/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/:
total 7
-rwxr-xr-x 1 900711 floppy 6092 Mar 14 07:49 api_implementation.sh.proposed
-rw-r--r-- 1 900711 floppy  206 Mar 14 07:49 QEMU.data
-r--r--r-- 1 900711 floppy  463 Mar 14 09:33 TRANS.TBL

/media/Cisco/hssi/server_implementation/KVM/RHEV/shared/bin/:
total 7
-rwxr-xr-x 1 900711 floppy 5247 Mar 14 07:49 api_implementation.sh
-rw-r--r-- 1 900711 floppy  124 Mar 14 07:49 RHEV.data
-r--r--r-- 1 900711 floppy  454 Mar 14 09:33 TRANS.TBL

/media/Cisco/hssi/server_implementation/VMWARE/supported/shared/bin/:
total 12
-rwxr-xr-x 1 900711 floppy 9777 Mar 14 07:49 api_implementation.sh
-rw-r--r-- 1 900711 floppy   92 Mar 14 07:49 README.TXT
-rw-r--r-- 1 900711 floppy  303 Mar 14 07:49 supported.data
-r--r--r-- 1 900711 floppy  681 Mar 14 09:33 TRANS.TBL

What is different for KVM/QEMU is that the api_implementation.sh script is having the suffix ".proposed". Is this the case as well for CUCM 14?
 
This is how it looks like for 14SU1:

Code:
root@pve1:/mnt/iso# ls -l Cisco/hssi/server_implementation/*/*/shared/bin/
Cisco/hssi/server_implementation/CLOUD/EC2/shared/bin/:
total 7
-r-xr-xr-x 1 root root 5913 Oct 22  2021 api_implementation.sh
-r-xr-xr-x 1 root root  191 Oct 22  2021 EC2.data
-r-xr-xr-x 1 root root  453 Oct 22  2021 TRANS.TBL

Cisco/hssi/server_implementation/CLOUD/GOOGLE/shared/bin/:
total 7
-r-xr-xr-x 1 root root 5251 Oct 22  2021 api_implementation.sh
-r-xr-xr-x 1 root root  191 Oct 22  2021 GOOGLE.data
-r-xr-xr-x 1 root root  456 Oct 22  2021 TRANS.TBL

Cisco/hssi/server_implementation/KVM/HAL/shared/bin/:
total 8
-r-xr-xr-x 1 root root 5310 Oct 22  2021 api_implementation.sh
-r-xr-xr-x 1 root root   28 Oct 22  2021 HAL.data
-r-xr-xr-x 1 root root   92 Oct 22  2021 README.TXT
-r-xr-xr-x 1 root root  675 Oct 22  2021 TRANS.TBL

Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/:
total 7
-r-xr-xr-x 1 root root 6092 Oct 22  2021 api_implementation.sh.proposed
-r-xr-xr-x 1 root root  206 Oct 22  2021 QEMU.data
-r-xr-xr-x 1 root root  463 Oct 22  2021 TRANS.TBL

Cisco/hssi/server_implementation/KVM/RHEV/shared/bin/:
total 7
-r-xr-xr-x 1 root root 5247 Oct 22  2021 api_implementation.sh
-r-xr-xr-x 1 root root  124 Oct 22  2021 RHEV.data
-r-xr-xr-x 1 root root  454 Oct 22  2021 TRANS.TBL

Cisco/hssi/server_implementation/VMWARE/supported/shared/bin/:
total 12
-r-xr-xr-x 1 root root 9777 Oct 22  2021 api_implementation.sh
-r-xr-xr-x 1 root root   92 Oct 22  2021 README.TXT
-r-xr-xr-x 1 root root  303 Oct 22  2021 supported.data
-r-xr-xr-x 1 root root  681 Oct 22  2021 TRANS.TBL

I just found out that CUCM 14SU2 cannot be converted with this method. I am looking into this.
 
So in fact the last version of CUCM that seems to be working is 14.0SU1, beginning with 14.0SU2 I am getting the same error as above, and I only get that far if I remove the -R in the genisoimage statement in the script, without that I can not even create the image. I found different, easier instructions here: https://www.eve-ng.net/index.php/documentation/howtos/cisco-cucm/

I get a different error message saying that the hardware is not supported for this product. So it looks like the instructions above (that mess around a lot less with the iso) seem to work slightly better - but not good enough.
 
Last edited:
Well, maybe it's one idea to make it work with KVM/QEMU scripts within the ISO image, maybe it's another idea to patch the VMware scripts to just accepts that it's ok to run on KVM/QEMU?
HW/machine validation is for sure a nice thing to have when you want to ensure that you run only on a supported platform, but running CUCM on Proxmox will give you an unsupported platform anyway, so bypassing all the checks would be an option as well and proceed with just the installation.
 
I am currently migrating from ESXi and I have already tried to import the CUCM publisher, it failed. Therefore I doubt that it is easy to install the ISO with just modification on the hardware check. My plan b is to have a virtualized ESXi in Proxmox for the Cisco UC products.
 
Last edited:
I retried the import, this time I changed the disk type to IDE and it worked, I have CUCM 14SU2 running on Proxmox.
 
Last edited:
I followed the same https://github.com/david8862/create-cucm-kvm-iso with a CUCM 14 installation disk as well and ran into an issue that was due to the naming of the disk. I found a solution in form of an additional line for the script, I documented this in the issues section. I just received my final proxmox hardware today and I am in the process of installing a CUCM right now, after that I will try Unity Connection. The beauty of the script is that it also adds the boot loader, so all you need is an upgrade image

these are my settings:

View attachment 71133

This is the complete shell script to convert the iso:

Bash:
#! /bin/bash
# Filename: create_cucm_kvm_iso.sh
#
# Copyright (C) 2017  Xiaobin Zhang (david8862@gmail.com)
#
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

#
# main()
#
if [ $# -ne 2 ] ; then
    echo Usage: "`basename $0` SOURCE_ISO DEST_ISO"
    echo "SOURCE_ISO  origin iso image get from Cisco webpage"
    echo "DEST_ISO    output iso image supporting KVM installation"
    exit 1
fi

SOURCE_ISO=$1
DEST_ISO=$2
CURR_PATH=$(pwd)


if [ $(id -un) != "root" ]; then
    echo "Please use root account."
    exit 1
fi

if [ ! -f "$SOURCE_ISO" ]; then
    echo "origin iso un-exists. Please check again."
    exit 1
fi

umount /tmp/iso
umount /tmp/CUCM
rm -rf /tmp/iso
rm -rf /tmp/CUCM
mkdir /tmp/iso
mkdir /tmp/CUCM

mount -o loop $SOURCE_ISO /tmp/iso/
echo "Now syncing ISO to new path, please wait..."
rsync -a /tmp/iso/ /tmp/CUCM/
echo "Syncing finished."

#Remove not used server implementation
pushd /tmp/CUCM/Cisco/hssi/server_implementation/
shopt -s extglob
rm -rf !(KVM|README.TXT|shared|TRANS.TBL)
pushd KVM/
rm -rf !(QEMU|shared|TRANS.TBL)
shopt -u extglob
popd
popd


#Add server hardware detecting error check
sed -i '/HSSI_API $impl returned $isFound and errors/i\            echo "HSSI_API $impl returned $isFound and errors=$validation_errors " >&2' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh

sed -i '/case "$isFound" in/G' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh
sed -i '/case "$isFound" in/a\                ;;' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh
sed -i '/case "$isFound" in/a\                ((validated_count++))' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh
sed -i '/case "$isFound" in/a\                hw_model="$($impl HWModel)"' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh
sed -i '/case "$isFound" in/a\                append_inDataFile_forKey_value $hssi_api_state_file "hardware_implementation_paths" $impl' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh
sed -i '/case "$isFound" in/a\                echo "$($impl HWModel): passed detection validation" >&2' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh
sed -i '/case "$isFound" in/a\                "2")' /tmp/CUCM/Cisco/hssi/shared/bin/hssi_api.sh

#Snmp
sed -i '/local method="hasHwSnmpMonitoring"/{n;d}' /tmp/CUCM/Cisco/base_scripts/ihardware.sh
sed -i 's/local method="hasHwSnmpMonitoring"/return 1/g' /tmp/CUCM/Cisco/base_scripts/ihardware.sh

#Remove eth HWADDR check
mv /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh.proposed /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh


sed -i '/_runtime $@/i\function postBootHardwareSetup()' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\{' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    local rc=$HSSI_TRUE' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\\' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    (super postBootHardwareSetup $*)' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    local src=$?' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    # Abort if there is a critical failure' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    if [ $src -eq 1 ]; then' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\        return $src' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    fi' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    rm -f /etc/udev/rules.d/70-persistent-net.rules 2> /dev/null' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\\' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    #' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    # remove hwaddr field from config in case mac address changed.' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\    #' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i "/_runtime \$\@/i\    sed -i 's/^HWADDR.*//' /etc/sysconfig/network-scripts/ifcfg-eth* 2> /dev/null" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i "/_runtime \$\@/i\    sed -i 's/^NM_CON.*/NM_CONTROLLED="no"/' /etc/sysconfig/network-scripts/ifcfg-eth* 2> /dev/null" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i "/_runtime \$\@/i\    sed -i 's/^ONBOOT.*/ONBOOT="yes"/' /etc/sysconfig/network-scripts/ifcfg-eth* 2> /dev/null" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i "/_runtime \$\@/i\    return \$rc" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\}' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh
sed -i '/_runtime $@/i\\' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh





sed -i '/_runtime $@/i\function postBootHardwareSetup()' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\{' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    local rc=$HSSI_TRUE' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\\' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    (super postBootHardwareSetup $*)' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    local src=$?' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    # Abort if there is a critical failure' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    if [ $src -eq 1 ]; then' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\        return $src' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    fi' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    rm -f /etc/udev/rules.d/70-persistent-net.rules 2> /dev/null' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\\' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    #' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    # remove hwaddr field from config in case mac address changed.' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\    #' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i "/_runtime \$\@/i\    sed -i 's/^HWADDR.*//' /etc/sysconfig/network-scripts/ifcfg-eth* 2> /dev/null" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i "/_runtime \$\@/i\    sed -i 's/^NM_CON.*/NM_CONTROLLED="no"/' /etc/sysconfig/network-scripts/ifcfg-eth* 2> /dev/null" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i "/_runtime \$\@/i\    sed -i 's/^ONBOOT.*/ONBOOT="yes"/' /etc/sysconfig/network-scripts/ifcfg-eth* 2> /dev/null" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i "/_runtime \$\@/i\    return \$rc" /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\}' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh
sed -i '/_runtime $@/i\\' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/shared/bin/shared_implementation.sh

sed -i 's/VDX_PATTERN="vd"/VDX_PATTERN="sd"/g' /tmp/CUCM/Cisco/hssi/server_implementation/KVM/QEMU/shared/bin/api_implementation.sh




pushd /tmp/CUCM/
genisoimage -o $CURR_PATH/$DEST_ISO -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -R .
popd

umount /tmp/iso
umount /tmp/CUCM
rm -rf /tmp/iso
rm -rf /tmp/CUCM
echo "KVM ISO is created at $CURR_PATH/$DEST_ISO"
I just wanted to give you a massive shoutout for this. This worked for me on CUCM 12.5 and saved me a huge headache moving from ESXi to proxmox. Thank you!
 
  • Like
Reactions: twiederh
I just wanted to give you a massive shoutout for this. This worked for me on CUCM 12.5 and saved me a huge headache moving from ESXi to proxmox. Thank you!
I'd be cautious with productive systems. The problem might hit when trying to upgrade to a newer version. And you are now running an unsupported system.

The best way would be to also contact your Cisco contacts and demand support for KVM/QEMU based virtualization platforms. I doubt that every CUCM customer will be switching to Nutanix. In most cases Cisco prodcuts will just be one of many apps that need to virtualized and migrated away from VMware.

However, the information within the thread is important information and we should continue to make CUCM & Co work in Proxmox - and give feedback to Cisco how we achieved this.
 
I mean the import of a running CUCM from ESXi. After the import you have to change the type of the vm disk to IDE, otherwise the start will fail.
 
  • Like
Reactions: denjimar

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!