Hello Cloudstack Users, following the blog of Rohit about how to install and run Cloudstack on an Raspberry 4 using Ubuntu on arm64/aarch64 ( https://www.shapeblue.com/apache-cloudstack-on-raspberrypi4-with-kvm/ ) and Rohits commits to cloudstack to support arm64 (thx Rohit!) i tried it myself.
For my setup i decided to use the latest release of Cloudstack without any modifications, as Rohits commits were already merged. Instead of using a Raspberry Pi4 i am using an Odroid M1, which shares the arm64 architecture with the rpi4. The installation following the ACS documentation and/or Rohits blog (without the special modifications required at that time) went quite smooth. Missing automatic systemvmtemplate build ---------------------------------------- One thing i felt still missing was how to build the required systemvmtemplate (Consoleproxy, SSVM and VRs) for arm64. Building the same automatic way on both - a x86_64 host, being able to build the amd64 systemvmtemplate and the arm64 systemvmtemplate, and/or directly building on the arm64 host would be great. After quite some work i figured the required changes and thought i'd share them here to see if it helps someone else and if it's useful, maybe the changes could contribute to cloudstack. All the existing logic using packer was kept, which is available for amd64 and arm64. I created a fork and applied the changes in a branch at https://github.com/StepBee/cloudstack/tree/add_systemvmtemplate_arm64_support The changes in code ------------------- - changing debian preseed files tools/appliance/systemvmtemplate/http/preseed.cfg to create an EFI partition and instruct debian to copy /EFI/debian/grubaa64.efi to /EFI/BOOT/BOOTAA64.efi Detailed changes can be found at https://github.com/apache/cloudstack/commit/8f406e7fd1bcf9b71202fe526f0adaff40402884 - changing tools/appliance/systemvmtemplate/template.json packer builder template(s) to provide the right qemuargs and adjust the boot_commands, as these are quite different from amd64 builds, increasing ssh_timeout and boot_wait Detailed changes can be found at https://github.com/apache/cloudstack/commit/a7077a8453dc944048a236bb44e19beeffaec7f9 - changing tools/appliance/build.sh to support providing the target architecture as first parameter and skip all non-kvm builds when building for arm64 - building arm64 systemvmtemplate on x86_64 and arm64 hosts is supported - changing tools/appliance/systemvmtemplate/scripts/install_systemvm_packages.sh to handle repository additions etc for arm64 Detailed changes can be found at https://github.com/apache/cloudstack/commit/fbacf5b2caed958e90ed4c134948aa4eb8dafed1 Required packages are based on the amd64 requirements plus, of course, the arm/aarch64 qemu packages - packer ( https://developer.hashicorp.com/packer/tutorials/docker-get-started/get-started-install-cli ) - qemu-utils - qemu-system-arm - qemu-efi-aarch64 To build the arm64 systemvmtemplate: - Cloning the branch from my fork - cd tools/appliance/ - ./build.sh aarch64 systemvmtemplate Running Cloudstack ------------------ On arm64 i noticed the log was complaining about a missing /etc/cloudstack/agent/uefi.properties Which could look like this one: guest.nvram.template.secure=/usr/share/AAVMF/AAVMF_VARS.snakeoil.fd guest.nvram.template.legacy=/usr/share/AAVMF/AAVMF_VARS.fd guest.loader.secure=/usr/share/AAVMF/AAVMF_CODE.snakeoil.fd guest.nvram.path=/var/lib/libvirt/qemu/nvram/ guest.loader.legacy=/usr/share/AAVMF/AAVMF_CODE.fd An additional hint for using cloud images: Where most of the cloud images for amd64 work with cloudstack userdata out of the box, i noticed most of the arm64/aarch64 cloud images are missing the cloudstack datasource within the built-in cloud-init config. Modification of the cloud images by placing the file /etc/cloud/cloud.cfg.d/cloudstack.cfg with content: datasource_list: ['CloudStack'] datasource: CloudStack: max_wait: 120 timeout: 50 in the qcow2 or raw images solves the issue. I hope it's helping the cloudstack community. Best regards, Stephan
