Skip to main content

Packer QEMU Template

Packer QEMU Template for Ubuntu 22.04.02 live server

Prerequisite

  • Packer (v1.9.4)
  • Packer Plugin Qemu (v1.0.9)
  • Packer Provisioner ansible (v1.1.0)
  • QEMU (7.1.0, v8.0.2 (slirp enabled))
  • Ansible (2.15.4)

Packer install

wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install packer

Packer plugin install

packer plugins install github.com/hashicorp/qemu
packer plugins install github.com/hashicorp/ansible

TODO list

  • Check apt source address can be changed (solution: add apt sources in http/user-data)
  • Add Variable hcl file (solution : add variables in template.pkr.hcl file)
  • Add network configuration shell script
  • Check bridge setting
  • Add Ansible Provisioning (solution : add ansible files)
  • Upgrade QEMU version and check compatibility (solution: v8.0.2 checked in WSL2 env)
  • Add automatic deploy is possible with any tools (e.g. vagrant, canonical maas)
  • Check packer-maas : https://github.com/canonical/packer-maas/tree/main/ubuntu (solution: can be upload template to maas)
  • Consider make CI/CD pipeline for QEMU image
  • arm64 supported

Install QEMU

How To Build QEMU image with Packer

Build QEMU image by running following command

PACKER_LOG=1 packer build --force template.pkr.hcl

or more specific command

PACKER_LOG=1 packer build -only=qemu.template --force .

Expected build result in case of success

2023/09/24 23:37:03 [INFO] (telemetry) ending qemu.template
==> Wait completed after 13 minutes 55 seconds
Build 'qemu.template' finished after 13 minutes 55 seconds.
==> Builds finished. The artifacts of successful builds are:

2023/09/24 23:37:03 machine readable: qemu.template,artifact-count []string{"1"}
==> Wait completed after 13 minutes 55 seconds

in case of building image without KVM accelerate, it can take more time than 1 Hour (Takes 1 Hour 16 minutes with following options : without accelerate, cpu=3, memory=4096 option).

How To Run QEMU image built by Packer

  • bios option needed ( if bios option doesn't exist, boot hangs )
  • vnc 0.0.0.0:1 means access vnc is possible from any_address:5901
  • NOTE : -nographic -serial mon:stdio option does not support in
qemu-system-x86_64 -name 22-04-live-server \
-netdev user,id=user.0,hostfwd=tcp::4141-:22 \
-device virtio-net,netdev=user.0 \
-drive file=./output/ubuntu-server-22-04-2-amd64-template,if=virtio,cache=writeback,discard=ignore,format=qcow2 \
-machine type=q35,accel=kvm \
-smp 4 \
-m 4096M \
-bios ./OVMF/OVMF_efi_target_system_is_x86.fd \
-vnc 0.0.0.0:1
  • if upper command does not respond, use following command.
qemu-system-x86_64 -name 22-04-live-server \
-netdev user,id=user.0,hostfwd=tcp::4141-:22 \
-device virtio-net,netdev=user.0 \
-drive file=./output/ubuntu-server-22-04-2-amd64-template,if=virtio,cache=writeback,discard=ignore,format=qcow2 \
-machine type=q35,accel=kvm \
-smp 4 \
-m 4096M \
-bios ./OVMF/OVMF_efi_target_system_is_x86.fd

Custom Configuration

Password Generation in http/user-data

openssl passwd -6 -salt xyz

result of following command should be added in user-data

#cloud-config
user-data:
users:
- name: ubuntu
passwd: "{Add openssl result here}"

How to set vnc server in QEMU running server

  • vnc_bind_address set "0.0.0.0" in template.pkr.hcl
  • open inbound ports if you use cloud services (Azure, AWS, GCP)
  • open firewall like following commands
# open 5900~6000 port
sudo ufw allow 5900:6000/tcdp
sudo ufw allow 5900:6000/udp

# restart firewall setting
sudo ufw disable
sudo ufw enable

sudo ufw status

Upload template file to Canonical MAAS

How to upload template file

sudo apt install packer
sudo apt install qemu-utils
sudo apt install qemu-system
sudo apt install ovmf
sudo apt install cloud-image-utils
  • Upload packer image to MAAS
$ maas admin boot-resources create \
name='custom/ubuntu-raw' \
title='Ubuntu Custom RAW' \
architecture='amd64/generic' \
filetype='ddgz' \
content@=ubuntu-2204-server.dd.gz