This is a concise description of how to get a virtual machine up and running that focuses on command line and console use. The instructions are written for Gentoo and assume a reasonable understanding of linux. They likely can be easily adapted for other distributions.
Install
Install libvirt
raptor ~ # sudo emerge -av libvirt
The above will install dependencies (including qemu) may require adding some keywords. Ensure you have appropriate qemu targets in your /etc/portage/make.conf file. A typical target is x86_64.
QEMU_SOFTMMU_TARGETS="x86_64"
QEMU_USER_TARGETS="x86_64"
Set permissions for libvirt
See this link about permissions and libvirt: https://wiki.gentoo.org/wiki/QEMU#Permissions
Note from those instructions that the following needed to be uncommented in the /etc/libvirt/libvirtd.conf file:
auth_unix_ro = "none"
auth_unix_rw = "none"
unix_sock_group = "libvirt"
unix_sock_ro_perms = "0777"
unix_sock_rw_perms = "0770"
You should add your non-privileged user to the libvirt group (if it exists… depends on policykit use flag) and the kvm group.
Also make sure you configure/compile appropriate kernel modules as described: https://wiki.gentoo.org/wiki/QEMU#Kernel
raptor ~ # usermod -a -G libvirt exampleusername
raptor ~ # usermod -a -G kvm exampleusername
Adding yourself to a group typically requires you to re-login.
Start the libvirt daemon
raptor ~ # /etc/init.d/libvirtd restart
Create a virtual hard drive image
foo@bar:~$ qemu-img create -f qcow2 Ubuntu-Focal-Fossa.qcow 20G
Download Ubuntu
foo@bar:~$ wget https://releases.ubuntu.com/20.04/ubuntu-20.04.3-live-server-amd64.iso
Install the image
foo@bar:~$ virt-install --location ubuntu-20.04.3-live-server-amd64.iso --memory 4096 --vcpus 4 \
--disk Ubuntu-Focal-Fossa.qcow --nographics --extra-args='console=ttyS0'
Complete the installation then shutdown the machine. I found that I had to force the shutdown:
foo@bar:~$ virsh destroy ubuntu20.04 ## Force shutdown of running virtual machine
Use the virtual machine
Start the machine and connect to its console
Once installed, start and connect to the virtual machine console
foo@bar:~$ virsh start ubuntu20.04 ## Start the virtual machine in the background
foo@bar:~$ virsh console ubuntu20.04 ## Connect to the virtual machine in a console mode
Note it reads the console is real time. Hence, you may have to press return to get a login prompt (or similar).
List virtual machines and their state
foo@bar:~$ virsh list --all
Force shutdown
To force a shutdown the machine (potentially with data loss if files have not yet been written)
foo@bar:~$ virsh destroy ubuntu20.04 ## Force shutdown of running virtual machine
Delete the virtual machine
The following command deletes the machine from virsh but doesn’t delete the disk image
foo@bar:~$ virsh undefine ubuntu20.04 ## Delete the virtual machine from virsh (doesn't delete the disk image)
Rename a machine
foo@bar:~$ virsh domrename {domain} {new-name}
Edit the configuration to add graphics
The goal of the above was a primarily console based system. To get a video display via spice, you must edit the xml. Source
foo@bar:~$ virsh edit ubuntu20.04
Then you can add a grahics video device (qml) and graphics protocol (spice). These must live within the <device></device>.
<graphics type='spice' autoport='yes'>
<listen type='address'/>
<image compression='off'/>
</graphics>
<video>
<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
<address type='pci' domain='0x0000' bus='0x08' slot='0x01' function='0x0'/>
</video>
Restart the machine. Then list the available virtual displays:
foo@bar:~$ virsh domdisplay ubuntu20.04
spice://127.0.0.1:5900
Open a display:
foo@bar:~$ virt-viewer ubuntu20.04
The above, with no arguments, will open the running domain (if there is only one).
Start the graphical environment:
From here:
foo@bar:~$ sudo systemctl isolate graphical
Snapshots
Take a snapshot
foo@bar:~$ virsh snapshot-create-as --domain ubuntu20.04 --name "2021-08-03" --description "Prior to install of ubuntu-desktop"
Note the above can include a –live flag if the snapshot is running
Delete a snapshot
foo@bar:~$ virsh snapshot-delete --domain ubuntu20.04 --snapshotname "2021-08-03"