Proxmox Import And Use Cloud Images
Published: 2021-11-13
Intro
In this post I will cover the process to import and use cloud based images in Proxmox. Cloud based images are handy because they are configurable on boot via cloud-init. I will use the image created in this post in a future post on how to deploy VMs in Proxmox via Terraform.
The following software was used in this post.
- Proxmox - 7.0-11
- Ubuntu - 20.04
Image Prep
Prior to uploading the cloud images to the Proxmox host, I will be downloading them to an Ubuntu host to install the qemu-guest-agent. The guest agent allows for introspection into the guest from the host and better integrations to control the guest shutdown, restart etc..
The libguestfs-tools package allows you to install packages into an image without booting it up. The libguestfs-tools package conflicts with Proxmox. For this reason, I am using my Ubuntu host to complete this step.
Lets get started by downloading a cloud image.
curl -O http://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.imgNow install libguestfs-tools.
sudo apt install libguestfs-tools -yInstall the qemu-guest-agent into the image.
sudo virt-customize -a focal-server-cloudimg-amd64.img --install qemu-guest-agent
# output
[ 0.0] Examining the guest ...
[ 27.1] Setting a random seed
virt-customize: warning: random seed could not be set for this type of guest
[ 27.3] Setting the machine ID in /etc/machine-id
[ 27.4] Installing packages: qemu-guest-agent
[ 130.6] Finishing offOnce the package is installed, copy the image to the Proxmox host.
scp ubuntu-20.04-server-cloudimg-amd64.img <user>@<host>:/tmp/Proxmox Host
Create a new VM that will be used as the base for future images.
qm create 9001 \
--name ubuntu-2004-cloud-init --numa 0 --ostype l26 \
--cpu cputype=host --cores 2 --sockets 1 \
--memory 2048 \
--net0 virtio,bridge=vmbr0Import the cloud image to a storage pool.
qm importdisk 9001 /tmp/ubuntu-20.04-server-cloudimg-amd64.img local-lvm
# output
Successfully imported disk as 'unused0:local-lvm:vm-9001-disk-0'Attach the disk to the VM as a SCSI drive.
qm set 9001 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9001-disk-0
# output
update VM 9001: -scsi0 local-lvm:vm-9001-disk-0 -scsihw virtio-scsi-pciCreate a cloud-init CDROM drive. This allows you to assign configuration to the VM on boot.
qm set 9001 --ide2 local-lvm:cloudinit
# output
update VM 9001: -ide2 local-lvm:cloudinit
Logical volume "vm-9001-cloudinit" created.Make the VM disk bootable.
qm set 9001 --boot c --bootdisk scsi0
# output
update VM 9001: -boot c -bootdisk scsi0Assign a serial console to the VM. This required by some cloud-init images.
qm set 9001 --serial0 socket --vga serial0
# output
update VM 9001: -serial0 socket -vga serial0Enable the guest agent.
qm set 9001 --agent enabled=1
# output
update VM 9001: -agent enabled=1Convert the VM to a template. The template will be used to clone future VMs.
qm template 9001
# output
Renamed "vm-9001-disk-0" to "base-9001-disk-0" in volume group "pve"
Logical volume pve/base-9001-disk-0 changed.
WARNING: Combining activation change with other commands is not advised.Create VM
Now that the VM template is built, lets create a VM from the template.
qm clone 9001 999 \
--name ubuntu-test \
--full \
--storage local-lvm
# output
create full clone of drive ide2 (local-lvm:vm-9001-cloudinit)
Logical volume "vm-999-cloudinit" created.Assign an SSH key to the VM that will be applied via cloud-init on boot.
qm set 999 --sshkey ~/.ssh/id_rsa.pub
# output
update VM 999: -sshkeys ssh-rsa...For this test I will assign an IP address to the VM that will be applied via cloud-init on boot.
qm set 999 --ipconfig0 ip=192.168.255.60/24,gw=192.168.255.1
# output
update VM 999: -ipconfig0 ip=192.168.255.60/24,gw=192.168.255.1Start the VM.
qm start 999
# output
generating cloud-init ISOOnce the VM has booted, SSH to the VM with the SSH key previously defined and the default username, ubuntu in the case of Ubuntu cloud images.
ssh [email protected]
# Accept hostkey
The authenticity of host '192.168.255.60 (192.168.255.60)' cant be established.
ECDSA key fingerprint is SHA256:4iiOYYaI1uS7cH1YqIByhZfTAJSgwtiQtLSMkkUHAdc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
ubuntu@ubuntu-test:~$Clean Up
Shutdown and delete the VM.
qm stop 999 && qm destroy 999Remove the orginal cloud image
rm /tmp/ubuntu-20.04-server-cloudimg-amd64.imgOutro
In this post, I covered the process to import an Ubuntu cloud image as a VM template, deploy a VM from the template and configure the VM via cloud-init.
Links
https://pve.proxmox.com/wiki/Cloud-Init_Support
https://austinsnerdythings.com/2021/08/30/how-to-create-a-proxmox-ubuntu-cloud-init-image/
http://cloud-images.ubuntu.com/releases/focal/release/
https://www.reddit.com/r/Proxmox/comments/l3ya2q/enable_qemu_agent_in_proxmox_from_command_line/