Virsh, short for Virtual Shell, is a command line user interface for managing virtual guest machines. Virsh allows you to create, list, edit, start, restart, stop, suspend, resume, shutdown and delete VMs. It currently supports KVM, LXC, Xen, QEMU, OpenVZ, VirtualBox and VMware ESX. In this guide, we will be discussing how to manage KVM virtual machines with Virsh management user interface in Linux.
Make sure you have installed KVM and Virsh utility on your Linux machine. The following guides explains how to install KVM on DEB and RPM-based systems.
- Install And Configure KVM In Ubuntu 20.04 Headless Server
- Install And Configure KVM In CentOS 8 Server
Manage KVM Virtual Machines With Virsh Commands
If you are new to or don't know how to work with Virsh interactive terminal, enter the following command to view the list of available commands along with brief description.
$ virsh help
You will see an extensive list of available virsh commands to manage KVM virtual machines from command line.
You don't have to memorize everything. Just read the description of a command that you want to run and use it.
The commands are grouped into the following sections:
- Domain Management,
- Domain Monitoring,
- Host and Hypervisor,
- Network Filter,
- Node Device,
- Storage Pool,
- Storage Volume,
- Virsh itself.
Each section contains the commands related to do particular set of tasks. You can view help section of a group, for example Networking, like below:
$ virsh help Networking
You will see commands related to do networking tasks:
Networking (help keyword 'network'): net-autostart autostart a network net-create create a network from an XML file net-define define an inactive persistent virtual network or modify an existing persistent one from an XML file net-destroy destroy (stop) a network net-dhcp-leases print lease info for a given network net-dumpxml network information in XML net-edit edit XML configuration for a network net-event Network Events net-info network information net-list list networks net-name convert a network UUID to network name net-start start a (previously defined) inactive network net-undefine undefine a persistent network net-update update parts of an existing network's configuration net-uuid convert a network name to network UUID net-port-list list network ports net-port-create create a network port from an XML file net-port-dumpxml network port information in XML net-port-delete delete the specified network port
You can further display help section of a specific command as well. For example, I am going to display the help section of "net-name" command:
$ virsh help net-name NAME net-name - convert a network UUID to network name SYNOPSIS net-name <network> OPTIONS [--network] <string> network uuid
List virtual machines
To view list of guest virtual machines in run or suspend mode, execute the following command:
$ virsh list Id Name State --------------------
As you can see, there are no guests in run or suspend mode.
You can use the --inactive option to list inactive guests.
To view all guest machines, run:
$ virsh list --all Id Name State -------------------------------- - centos8-uefi shut off - nginx_centos8 shut off
As you see in the above output, I have two virtual machines namely "centos8-uefi" and "nginx_centos8". Both are powered off.
Start Virtual machines
To start a virtual machine, for example "centos8-uefi", run:
$ virsh start centos8-uefi
You will see an output like below:
Domain centos8-uefi started
To verify if the VM is running, use "list" command:
$ virsh list Id Name State ------------------------------ 1 centos8-uefi running
Save Virtual machines
To save the current state of a running VM, run:
$ virsh save centos8-uefi centos8-save Domain centos8-uefi saved to centos8-save
This command stops the guest named "centos8-uefi" and saves the data to a file called "centos8-save". This will take a few moments depending upon the amount of memory in use by your guest machine.
Restore Virtual machines
To restore the previously saved state of a VM, just specify the file name like below:
$ virsh restore centos8-save Domain restored from centos8-save
Verify if the VM is restored using "list" command:
$ virsh list Id Name State ------------------------------ 4 centos8-uefi running
Restart Virtual machines
To restart a running VM, run:
$ virsh reboot centos8-uefi Domain centos8-uefi is being rebooted
Suspend/Pause Virtual machines
To suspend a running VM, do:
$ virsh suspend centos8-uefi Domain centos8-uefi suspended
Verify it with "list" command:
$ virsh list Id Name State ----------------------------- 1 centos8-uefi paused
Resume Virtual machines
To resume the paused VM, run:
$ virsh resume centos8-uefi Domain centos8-uefi resumed
Stop active Virtual machines
To forcibly stop an active VM, and leave it in the inactive state, run:
$ virsh destroy centos8-uefi Domain centos8-uefi destroyed
You can also gracefully stop the VM instead of forcing it like below:
$ virsh destroy centos8-uefi --graceful Domain centos8-uefi destroyed
Shutdown Virtual machines
To power off a running VM, do:
$ virsh shutdown centos8-uefi Domain centos8-uefi is being shutdown
Retrieve Virtual machines XML dump
To display the XML configuration file of a VM in the standard output, run:
$ virsh dumpxml centos8-uefi
This command will display the complete configuration details (software and hardware) of the virtual machine:
You can also export the XML dump to a file instead of just displaying it in the standard output like below:
$ virsh dumpxml centos8-uefi > centos8.xml
This command will dump the "centos8-uefi" XML file in a file named "centos8.xml" and save it in the current working directory.
Create Virtual machines with XML dump
You can create a new virtual guest machine using the existing XML from previously created guests. First, create a XML dump as shown above and then create a new VM using the XML file like below:
$ virsh create centos8.xml Domain centos8-uefi created from centos8.xml
This command will create a new VM and start it immediately. You can verify it using command:
Edit Virtual machines XML configuration file
If you wanted to make any changes in a guest machines, you can simply edit its configuration file and do the changes as you wish. The guests can be edited either while they run or while they are offline.
$ virsh edit centos8-uefi
This command will open the file in your default editor that you set with $EDITOR variable.
Enable console access for Virtual machines
After creating KVM guest machines, you can access them via SSH, VNC client, Virt-viewer, Virt-manager and Cockpit web console etc. However, you can't access them using "virsh console" command. The console command is used to connect the virtual serial console for the guest. To access KVM guests using "virsh console" command, you need to enable serial console access in the guest machine. Refer the following guide to enable virsh console access:
Rename Virtual machines
If you ever wanted to rename a virtual machine, refer the following guide.
Display Domain ID of Virtual machines
To find the domain id of a running guest virtual machine, run:
$ virsh domid centos8-uefi 2
Please note that the guest should be running to get its domain id.
Display Domain name of Virtual machines
To get the domain name of a running VM, run:
$ virsh domname <domain-id or domain-uuid>
$ virsh domname 2 centos8-uefi
Here, 2 is the domain id.
Display UUID of Virtual machines
To find the guest machine UUID, run:
$ virsh domuuid <domain-name or domain-id>
$ virsh domuuid centos8-uefi
$ virsh domuuid 2
Display Virtual machines details
To display a guest machine's information, use domain name, domain id or domain uuid like below:
$ virsh dominfo centos8-uefi
$ virsh dominfo 2
$ virsh dominfo de4100c4-632e-4c09-8dcf-bbde29170268
Id: - Name: centos8-uefi UUID: de4100c4-632e-4c09-8dcf-bbde29170268 OS Type: hvm State: shut off CPU(s): 2 Max memory: 2097152 KiB Used memory: 2097152 KiB Persistent: yes Autostart: disable Managed save: no Security model: apparmor Security DOI: 0
Display host information
To get the information of your host system, run:
$ virsh nodeinfo
CPU model: x86_64 CPU(s): 4 CPU frequency: 1167 MHz CPU socket(s): 1 Core(s) per socket: 2 Thread(s) per core: 2 NUMA cell(s): 1 Memory size: 8058840 KiB
Display Virtual CPU information
To display the virtual CPU information, run:
$ virsh vcpuinfo <domain-id or domain-name or domain-uuid>
$ virsh vcpuinfo centos8-uefi VCPU: 0 CPU: 3 State: running CPU time: 5.6s CPU Affinity: yyyy
VCPU: 1 CPU: 1 State: running CPU time: 0.0s CPU Affinity: yyyy
Find IP address of Virtual machines
Finding the IP address of a virtual machine is not a big deal. If you have console access to the virtual machine, you can easily find its IP address using “ip” command. However, it is also possible to identify a KVM VM’s IP address without having to access its console. The following guide explains how to find the IP address of a KVM virtual machine.
Delete Virtual machines
If you don't want a VM anymore, simply delete it like below:
$ virsh destroy centos8-uefi
$ virsh undefine centos8-uefi
The first command will forcibly stop the VM if it is already running. And the second command will undefine and delete it completely.
You can further use following options to delete the storage volumes and snapshots as well.
--managed-save remove domain managed state file
--storage remove associated storage volumes (comma separated list of targets or source paths) (see domblklist)
--remove-all-storage remove all associated storage volumes (use with caution)
--delete-storage-volume-snapshots delete snapshots associated with volume(s)
--wipe-storage wipe data on the removed volumes
--snapshots-metadata remove all domain snapshot metadata (vm must be inactive)
Manage Virtual networks
List virtual networks
To list of available virtual networks, run:
$ virsh net-list Name State Autostart Persistent -------------------------------------------- default active yes yes
As you can see, I have only one virtual network which is the default one.
Display virtual network details
To view the details of a virtual network, run:
$ virsh net-dumpxml default
Replace "default" with your network name in the above command.
<network connections='1'> <name>default</name> <uuid>ce25d978-e455-47a6-b545-51d01bcb9e6f</uuid> <forward mode='nat'> <nat> <port start='1024' end='65535'/> </nat> </forward> <bridge name='virbr0' stp='on' delay='0'/> <mac address='52:54:00:ee:35:49'/> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254'/> </dhcp> </ip> </network>
Start virtual networks
To start an inactive network, run:
$ virsh net-start <Name-Of-Inactive-Network>
To auto-start a network:
$ virsh net-autostart <network-name>
Create virtual networks XML dump
To create the XML configuration file of an existing virtual network, run:
$ virsh net-dumpxml default > default.xml
The above command will create XML config of the "default" network and save it in a file named "default.xml" in the current directory.
You can view the XML file using cat command:
$ cat default.xml <network connections='1'> <name>default</name> <uuid>ce25d978-e455-47a6-b545-51d01bcb9e6f</uuid> <forward mode='nat'> <nat> <port start='1024' end='65535'/> </nat> </forward> <bridge name='virbr0' stp='on' delay='0'/> <mac address='52:54:00:ee:35:49'/> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254'/> </dhcp> </ip> </network>
Create new virtual networks from XML file
To create a new virtual network using an existing XML file and start it immediately, run:
$ virsh net-create <Name-of-XMLfile>
If you want to create a network from XML file but don't want to start it automtacially, run:
$ virsh net-define <Name-of-XMLfile>
Deactivate virtual networks
To deactivate an active network, run:
$ virsh net-destroy <network-name>
Delete virtual networks
To delete a virtual network, deactivate it frist as shown above and then run:
$ virsh net-undefine <Name-Of-Inactive-Network>
Virsh has a lot of commands and options. Learning to use Virsh command line throughly is just enough to setup a complete Virtual environment in Linux. You don't actualy need GUI applications.
For more details, refer virsh man pages.
$ man virsh
Manage KVM guests graphically
Remembering all virsh commands is nearly impossible and also unnecessary. If you find it hard to perform all Kvm management tasks from command line, you can try graphical KVM management tools such as Virt-manager and Cockpit.
- Manage KVM Virtual Machines Using Cockpit Web Console
- How To Manage KVM Virtual Machines With Virt-Manager
Hope this helps.