Virtual Machine (KVM)
Note that VMs are known as domains in the KVM world.
Prerequisites
This guide assumes you have a basic working environment, run the kvm-ok
command to sanity check...
root@kvm-host:# kvm-ok INFO: /dev/kvm exists KVM acceleration can be used
Install Media
You need to have a local copy of the appropriate ISO. If you have the ISO file already, upload to your KVM server, alternatively download from the site using wget
- Ubuntu Desktop LTS - http://releases.ubuntu.com/16.04.3/ubuntu-16.04.3-desktop-amd64.iso
Create Virtual Machine
Parameter | Example | Usage |
---|---|---|
name |
VM-Name | Name of virtual machine (typically this should match the intended hostname of the VM) |
description |
"Test VM to be used for X" | Description of virtual machine's purpose etc |
os-type |
Linux | OS family, can be Linux, Solaris, Unix or Windows |
os-variant |
ubuntu16.04 | Distribution type for the above (run osinfo-query os to view what is available)
|
ram |
2048 | vRAM in GB |
vcpus |
2 | vCPUs (cores) |
vcpus |
2 | vCPUs (cores) |
disk path |
/vm-store/images/VM-Name.img,bus=virtio,size=50 | Virtual disk path, using virtio bus and with a 50GB disk |
graphics |
none | If noneset, VM will be created with a serial display output (as opposed to VNC window) |
cdrom |
/home/user/cdrom.iso | Path to installation ISO |
network |
bridge:br0 | Network connection details |
Create Server (no GUI)
Update location
path to reflect where your install ISO is located, and the disk
path for where VM disk files are intended to be.
The --extra-args "console=ttyS0"
option allows a local console to be accessed from the host machine (to allow OS install etc before the VM is on a network), though note that it can't be used with --cdrom
, so --location
has been used instead. Note that where installing Ubuntu guests v22.04 and upwards the kernel and initrd paths on the ISO need to be specified with the ISO location.
virt-install \ --virt-type=kvm \ --name ubuntu22-vm \ --ram 2048 \ --vcpus=1 \ --os-variant=ubuntu16.04 \ --network=bridge=br0,model=virtio \ --graphics none \ --disk path=/mnt/md0/kvm/vm/ubuntu22-vm.img,size=20,bus=virtio \ --extra-args "console=ttyS0" \ --location ubuntu-22.04-live-server-amd64.iso,kernel=casper/vmlinuz,initrd=casper/initrd
You should be presented with the console of the VM as it installs, however if you lose connection etc, connect to the console of the server using virsh console <server-name>
. Make sure you set a static IP and install SSH during setup (select OpenSSH server during Software selection section). Once installation is completed, SSH to the server and setup normal console access (as the instructions in the section below). Its highly recommended that you follow the steps below to ensure that Console access is available via the KVM host if needed.
Eject CD-ROM
If you need to eject the CD-ROM towards the end o the installation process, first identify the disk target name (eg hda, hdb, etc) then eject
virsh edit server-name virsh change-media server-name hda --eject
Console Access
- Update the
/etc/default/grub
- Add
console=ttyS0
to the config lineGRUB_CMDLINE_LINUX_DEFAULT
- EG
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash console=ttyS0"
- EG
- Update grub
update-grub
- Restart the guest machine
Connect using virsh console <server-name>
, you may need to hit Return once to show the logon prompt.
Create Workstation (GUI)
virt-install \ --virt-type=kvm \ --name ubuntu-desktop \ --ram 2048 \ --vcpus=1 \ --os-variant=ubuntu16.04 \ --cdrom=/mnt/md0/kvm/iso/ubuntu-16.04.3-desktop-amd64.iso \ --network=bridge=br0,model=virtio \ --graphics vnc,listen=0.0.0.0 \ --disk path=/mnt/md0/kvm/vm/ubuntu-desktop.img,size=40,bus=virtio
Once the command has got as far as Waiting for installation to complete.
you need to connect to the VNC console session, to find the port number to connect on query the config from another SSH session connected to the host (typically VNC uses ports starting from 5900 upwards). Cancelling the command causes the VM/domain to power off, which you won't want to happen until you've completed setup of the VM.
virsh dumpxml ubuntu-desktop | grep vnc
Move Virtual Machine
If you want to move your domain/VM to another KVM host and don't have shared storage you can manually copy the data and VM config across to another host and import it.
- Shutdown the virtual machine
- Preferably from the OS so it gets a graceful shutdown, alternatively stop the VM from KVM
- Export the config
- EG
virsh dumpxl <VMname> > /tmp/VMName.xml
- EG
- Copy the VM disk file(s) and config XML to their new host
- Disk file(s) should go the location from which your VM's will run from
- Update the config, if necessary...
- Disk file path - If the VM disks are in a different path on the new server up date the path in the XML file, look for
source file=
- CPU type - If the physical CPU type is different on the new host, you may need to update the VM config to allow for this, update the
cpu mode
config to match the capabilities of the destination host, or just set to<cpu mode='host-passthrough'/>
. See https://www.berrange.com/posts/2018/06/29/cpu-model-configuration-for-qemu-kvm-on-x86-hosts/ for more info.
- Disk file path - If the VM disks are in a different path on the new server up date the path in the XML file, look for
- Import the VM
- EG
virsh define /path/to/VMName.xml
- EG
- Start the VM
- EG
virsh start <VMName>
- EG
Add Disk
- Create new disk image file
- EG
qemu-img create -f qcow2 /var/lib/libvirt/images/vm-name-disk1.img 20G
- EG
- Attach disk image to virtual machine
- Use
df
in the VM to determine next disk label, egvdb
- EG
qemu-img create -f qcow2 /var/lib/libvirt/images/vm-name-disk1.img 20G -o preallocation=full
- To create a thin provisioned file use the following (however you may find the disk the OS sees is small (~200K), if so, use the command above)
- EG
virsh attach-disk vm-name /var/lib/libvirt/images/vm-name-disk1.img vdb --cache none
- Use
- Update file owner and group to match other disk images
- EG
chown libvirt-qemu /var/lib/libvirt/images/vm-name-disk1.img
- EG
chgrp libvirt-qemu /var/lib/libvirt/images/vm-name-disk1.img
- EG
- Attach disk
- EG
virsh attach-disk --domain vm-name /var/lib/libvirt/images/vm-name-disk1.img --target vdb --persistent --config --live
- EG
- In the VM, format the disk using defaults..
- EG
fdisk /dev/vdb
- EG
Command: n
- EG
Partition type: p,
- EG
Partition number: <default>,
- EG
First sector: <default>
- EG
Last sector: <default>
- EG
Command: w
- EG
- EG
- Format new partition
- EG
mkfs.ext4 /dev/vdb1
- EG
- Create mount directory
- EG
mkdir /vdb1/
- EG
- Mount the the disk
- EG
mount /dev/vdb1 /vdb1/
- EG
- Add an appropriate entry to fstab so the disk gets mounted on next boot
- EG
/dev/vdb1 /vdb1 ext4 defaults 0 0
- EG
Other Config
Auto Start
To ensure that a VM domain starts with the host server issue the following commands (replace vm-name
with the name of your VM
virsh autostart vm-name
To disable issue
virsh autostart vm-name --disable
To see what machines are/aren't set to start automatically
virsh list --all --autostart virsh list --all --no-autostart