How to prepare your own OS image and deploy it on a cloud server
You can deploy a cloud server from your own custom image. This is useful when you need:
An operating system that is not yet available among our ready-to-use images in the Customer Portal
A preconfigured image with your own software and settings
For the purpose of this article, images are grouped into two categories:
Cloud-compatible images — provided by the OS vendor for cloud environments. They typically include the required drivers, cloud-init support, and OpenStack compatibility.
Non-cloud images — generic images, such as ISO-based installers, that require additional configuration before they can run properly in an OpenStack-based cloud.
This guide covers how to create, customize, and prepare a virtual machine (VM) image and then upload it to the Customer Portal to deploy a cloud server. It walks through three scenarios:
Deploying a cloud server using a cloud-compatible image without modifications (as-is)
Preparing and customizing a cloud-compatible image before uploading
Preparing a non-cloud image (for example, from an ISO file) to make it OpenStack-compatible
This article does not cover the operating system installation process.
Our cloud services are built on OpenStack. You can configure all parameters and applications as needed, and ensure your VM meets the following core OpenStack image requirements:
Requirement
Linux
FreeBSD
OpenBSD
NetBSD
Architecture
x64 OS
x64 OS
x64 OS
x64 OS
Image format
qcow2 (recommended)
qcow2 (recommended)
qcow2 (recommended)
qcow2 (recommended)
Boot firmware
Only BIOS (UEFI not supported)
Only BIOS (UEFI not supported)
Only BIOS (UEFI not supported)
Only BIOS (UEFI not supported)
Disk layout
Use the standard disk layout from your distribution's cloud images. Enable automatic root expansion on first boot with cloud-init's growpart and resizefs modules.
Use GPT with two partitions. First: freebsd-boot (≈64 KB, no mount point). Second: freebsd-ufs mounted as /. Root partition must be last on disk. Required for auto-resize with bsd-cloudinit.
Use MBR with the root partition placed last on disk. Auto-grow supported via growfs in OpenBSD 7.3+.
Use GPT (recommended). Automatic root expansion is not supported; resizing requires manual steps: gpt resize + growfs.
No hard-coded networking
Use DHCP; remove any static IP and MAC assignments from network config files (e.g., /etc/network/interfaces, /etc/netplan/*.yaml).
Use DHCP on vtnet0; remove static network config from /etc/rc.conf.
Use DHCP on vio0; remove static config from /etc/hostname.* files.
Use DHCP on vioif0; remove static config from /etc/ifconfig.* files.
Configured remote access
Ensure SSH server is enabled and starts on boot.
Ensure sshd is enabled. bsd-cloudinit injects SSH keys automatically. Grant sudo access to the target user if required.
sshd is enabled by default.
Ensure sshd is enabled. Root SSH login may be disabled by default.
Hypervisor/driver compatibility
Modern Linux distributions include all necessary virtio drivers. Very old kernels (pre-3.0) may require adding virtio and network drivers. Legacy Xen-PV is not needed.
Ensure virtio disk and network drivers are enabled and comconsole is configured. Verify the image boots correctly under KVM/QEMU.
Ensure virtio disk (vioblk) and network (vio) drivers are supported. Virtio is fully supported in OpenBSD 5.3+ and provides optimal performance under KVM.
Ensure basic virtio disk and network support virtio(4) is available.
Image size
No size limit on the image itself; Customer Portal upload is limited to ≤ 5 GB
No size limit on the image itself; Customer Portal upload is limited to ≤ 5 GB
No size limit on the image itself; Customer Portal upload is limited to ≤ 5 GB
No size limit on the image itself; Customer Portal upload is limited to ≤ 5 GB
Cloud-init is a cross-platform tool used to initialize a virtual machine during its first boot and apply configuration through metadata. Typical tasks include setting the hostname, configuring networking, adding SSH keys, creating users, and running initialization commands or scripts.
To provide initialization data when preparing an image locally, this guide uses a small ISO file called seed.iso. During the first boot, cloud-init reads the contents of this ISO and applies the defined settings.
The ISO contains two files:
user-data — defines users, SSH keys, and other initialization settings
meta-data — specifies basic instance parameters, such as hostname
Create two plain text files named user-data and meta-data (without file extensions) in the same directory before building the ISO.
In the example above, ssh_pwauth is set to false to allow authentication only with SSH keys. Setting it to true can be helpful during testing. Before uploading your prepared image to the Customer Portal, make sure to disable password authentication again and rely on SSH keys only.
Example meta-data:
local-hostname: fedora-vm
Specifying local-hostname in meta-data is sufficient; instance-id is generated automatically by cloud-init.
Start the virtual machine with your OS image and seed.iso attached.
Note the parameter -netdev user,id=net0,hostfwd=tcp::2222-:22 — it maps host port 2222 to port 22 inside the VM. You will use this forwarded port to connect to the VM after it boots.
Use -m and -smp to set memory and vCPUs to match the configuration you plan to use on the cloud server.
On non-cloud ISO images, this command often shows status: disabled — this is expected during local testing. After uploading the image and deploying a cloud server, our provisioning system provides the proper OpenStack datasource, and cloud-init runs normally.
This section covers preparing a VM created from an ISO image that does not include cloud-init or any cloud-specific configuration. The goal is to make the image boot correctly in OpenStack and accept initialization metadata during the first launch.
If you already have the OS installed in your VM, skip ahead to verifying that the SSH server is installed and running.
When installing from an ISO, you must first create a virtual disk (the ISO is not a disk image). Choose a <disk-size> that fits your OS installation requirements (for example, 4G).
The first boot must use the installation ISO (for example, ubuntu-25.10-live-server-amd64.iso). Attach it as a virtual CD-ROM device — see Launching a VM with QEMU:
Retrieving metadata and user data (SSH keys, hostname, and so on)
Creating users
Running first-boot initialization tasks, including automatic disk expansion
Install disk auto-expansion utilities to allow the root partition and filesystem to grow automatically when the flavor disk is larger than the original image.
On Linux distributions, cloud-init is commonly used together with utilities such as cloud-utils or cloud-utils-growpart.
Some Unix and BSD systems may use different initialization tools or require manual configuration. Refer to your operating system documentation.
Attach the previously created seed.iso — see Cloud-init setup. Cloud-init reads it as a NoCloud datasource and applies the configuration from user-data and meta-data during the first boot. After initialization, seed.iso can be removed for all subsequent VM launches.
We recommend disabling any VPN when uploading an image. If uploading fails, try restarting the process. If the issue persists, contact our support team.
Upload your image to the Customer Portal (see How to upload your own image), selecting the same location where you plan to deploy the cloud server.
Create a cloud server (see Getting Started). In the Image section, select Other and choose your uploaded custom image. Use SSH authentication with the key that matches the public key in your user-data.
Wait for the cloud server to deploy and obtain a public IP address from the server's details page.
Access to the deployed server depends on the operating system in the image. See How to access the cloud server for details.
SSH access with root is disabled in most vendor images by default.
When a cloud server is provisioned from a custom image, the cloud-user is created and the SSH key you selected during server creation is injected into ~/.ssh/authorized_keys.
Default users in vendor-provided cloud images. Usernames can vary slightly between distributions or custom vendor builds. Check the image description page for confirmation or use this table to find the default login user for common vendor cloud images.