sudo apt install -y virt-manager
sudo mkdir -m 0700 -p /var/lib/libvirt/cloud-init
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
sudo virsh net-dhcp-leases default
Connect to VM from client device
ssh -J < hypervisor.ip.address> ${USER_NAME} @vm-ip
sudo virsh destroy ${VM_NAME} # shuts down VM
sudo virsh undefine ${VM_NAME} # removes VM