Useful commands for configuring KVM virtual machines
KVM
install KVM
apt install --no-install-recommends qemu-system libvirt-daemon-system virtinst dnsmasq qemu-utils
note: this command is intended for use on Debian 12
Network
list networks
virsh net-list --all
create a temporary network config file
cat <<EOF > /tmp/br0
<network>
<name>br0</name>
<bridge name='br0' stp='on'/>
<ip address='192.168.100.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.100.2' end='192.168.100.254'/>
</dhcp>
</ip>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
</network>
EOF
define a network
virsh net-define /tmp/br0
configure a network autostart
virsh net-autostart br0
activate a network
virsh net-start br0
deactivate a network
virsh net-destroy br0
undefine a network
virsh net-undefine br0
attach a network
virsh attach-interface --domain test0 --type bridge --source tmp0 --model virtio --config
detach a network
virsh detach-interface --domain test0 --type bridge --mac 00:11:22:33:44:55 --config
Storage pool
list storage pools
virsh pool-list --all
create a directory for a storage pool
mkdir /mnt/pool0
create a temporary storage pool config file
cat <<EOF > /tmp/pool0
<pool type='dir'>
<name>pool0</name>
<target>
<path>/mnt/pool0</path>
<permissions>
<mode>0755</mode>
<owner>0</owner>
<group>0</group>
</permissions>
</target>
</pool>
EOF
define a storage pool
virsh pool-define /tmp/pool0
configure a pool autostart
virsh pool-autostart pool0
activate a storage pool
virsh pool-start pool0
deactivate a storage pool
virsh pool-destroy pool0
undefine a storage pool
virsh pool-undefine pool0
Storage volume
create a temporary volume config file
cat <<EOF > /tmp/vol0
<volume type='file'>
<name>vol0</name>
<capacity unit='G'>20</capacity>
<target>
<format type='qcow2'/>
</target>
</volume>
EOF
create a volume
virsh vol-create pool0 /tmp/vol0
delete a volume
virsh vol-delete vol0 pool0
attach a volume
virsh attach-disk --domain test0 --source /mnt/pool0/tmp0 --target vdb --driver qemu --subdriver qcow2 --config
detach a volume
virsh detach-disk --domain test0 --target vdb --config
VM
list VMs
virsh list --all
list available OS names
virt-install --osinfo list
create a VM
virt-install --name test0 --osinfo debian11 --cpu host-passthrough --vcpus 4 --memory 4096 --graphics vnc,listen=1.2.3.4 --disk /mnt/pool0/vol0,bus=virtio --network bridge=br0,model=virtio --noautoconsole --noreboot --import
start a VM
virsh start test0
suspend a VM
virsh suspend test0
resume a VM
virsh resume test0
stop a VM gracefully
virsh shutdown test0 --mode acpi
stop a VM forcefully
virsh destroy test0
reboot a VM gracefully
virsh reboot test0
reboot a VM forcefully
virsh reset test0
VNC
get a listening port
virsh dumpxml test0 | grep vnc | sed -rn "s/.port='([0-9])'.*/\1/p"
connect to a VM using any VNC client
ISO
enter a VM config editing mode
virsh edit test0
add the following lines
<device>
...
<disk type='file' device='cdrom'>
<source file='/home/ISO/debian-12.2.0-amd64-netinst.iso'/>
<target dev='hda' bus='sata'/>
<readonly/>
</disk>
...
</device>
edit the following lines
<os>
...
<boot dev='cdrom'/>
...
</os>
restart a VM
Cloning
stop a VM
clone a VM
virt-clone --original test0 --name test99 --file /mnt/pool0/vol99
note: if multiple disks are connected to the VM, then "--file" options should be specified in the same order in which these disks are specified in the VM XML description
Snapshotting
list snapshots
virsh snapshot-list test0
create a snapshot config file
cat <<EOF > /tmp/snapshot0
<domainsnapshot>
<name>snapshot0</name>
</domainsnapshot>
EOF
create a snapshot
virsh snapshot-create --atomic --domain test0 --xmlfile /tmp/snapshot0
apply a snapshot
virsh snapshot-revert --domain test0 --snapshotname snapshot0
delete a snapshot
virsh snapshot-delete --domain test0 --snapshotname snapshot0
Monitoring
vcpu usage
virsh vcpuinfo --domain test0
memory usage
virsh dommemstat --domain test0
network interfaces
virsh domifaddr --domain test0
Links
Network XML format - https://libvirt.org/formatnetwork.html
Storage pool and volume XML format - https://libvirt.org/formatstorage.html
Domain XML format - https://libvirt.org/formatdomain.html
Snapshot XML format - https://libvirt.org/formatsnapshot.html
Manual Snapshots - https://libvirt.org/kbase/snapshots.html