Skip to content

Instantly share code, notes, and snippets.

@poupas
Last active July 10, 2022 18:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save poupas/41e74d2dd09d5507befa1e611bb8329b to your computer and use it in GitHub Desktop.
Save poupas/41e74d2dd09d5507befa1e611bb8329b to your computer and use it in GitHub Desktop.
VM on Ubuntu using libvirt+cloud-init

Install virt-manager

sudo apt install -y virt-manager
sudo mkdir -m 0700 -p  /var/lib/libvirt/cloud-init

Create VM

VM_NAME=myvm
USER_NAME=myuser
# Read first public SSH key from ~/.ssh/authorized_keys
# You can also set a key manually
SSH_PUB_KEY="$(grep -v ^# ~/.ssh/authorized_keys | head -1)"

cat << EOF | sudo tee /var/lib/libvirt/cloud-init/${VM_NAME}-user-data.yml
#cloud-config

hostname: ${VM_NAME}

users:
  - name: ${USER_NAME}
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: sudo
    shell: /bin/bash
    ssh_authorized_keys:
      - ${SSH_PUB_KEY}

packages:
  - chrony
  - unattended-upgrades

ntp:
  enabled: true
  ntp_client: chrony

EOF
sudo curl -L https://cloud-images.ubuntu.com/releases/22.04/release/ubuntu-22.04-server-cloudimg-amd64-disk-kvm.img \
  -o /var/lib/libvirt/images/${VM_NAME}-disk.qcow2

sudo virt-install \
  --name=${VM_NAME} \
  --ram=2048 \
  --vcpus=2 \
  --import \
  --disk path=/var/lib/libvirt/images/${VM_NAME}-disk.qcow2,format=qcow2 \
  --os-variant=ubuntu22.04 \
  --network default \
  --cloud-init user-data=/var/lib/libvirt/cloud-init/${VM_NAME}-user-data.yml \
  --graphics none \
  --noautoconsole

Find out VM's IP

sudo virsh net-dhcp-leases default

Connect to VM from client device

ssh -J <hypervisor.ip.address> ${USER_NAME}@vm-ip 

Delete VM

sudo virsh destroy ${VM_NAME}  # shuts down VM
sudo virsh undefine ${VM_NAME} # removes VM
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment