# KVM

Kernel-based Virtual Machine (KVM) is a virtualization module in the Linux kernel that allows the kernel to function as a hypervisor. KVM support dynamic memory management and Live Migration since 2007 among other features.
KVM is included in all mayor distribution including Ubuntu and RHEL (RedHat), RedHat provides 2 version of KVM, the one included with RHEL which allows to run up to 4 VM or the one included with RHV with unlimited VM.
systemd-cgtop can be used for showing control groups resource utilization.

## Basic KVM commands
### Config files and directories

/etc/libvirt/qemu

### Information

* Show information by pool: virsh pool-info YOUR_POOL_NAME
* virsh guestinfo

### Operations

* Editing Virtual Machine configuration: $VM_ID
* Create VM_MACHINE: virsh define MY_XML_VM_DEFINITION.XML
* Modifying CPUs: virsh setvcpus $VM_NAME ([--maximum] [[--config] [--live] | [--current]]) // Can be live or offline in the next reboot
** To check vcpu info: virsh vcpuinfo $VM_NAME
* Modifying Memory: virsh setmem <vm_name> <memsize>
* Connection by console: virsh console VM_NAME. See also: virt-manager
* Clone a virtual machine: virt-clone
* Create image: qemu-img create
* Resize image: qemu-img resize
* Create domain/virtual machine: virt-install --autostart --check all=on --name VM_DOMAIN_NAME --memory VM_MEMORY_SIZE --vcpus VM_VCPUs --os-variant ubuntu18.04 --cdrom VM_INSTALLATION_MEDIA --disk /path/to/VM_STORAGE_POOL_NAME/VM_DOMAIN_NAME.qcow2 --noautoconsole --wait VM_CREATION_WAIT_TIME --network VM_NETWORK_SETTINGS
* virsh migrate

### Monitoring

* virsh domstate
* virsh domstats

### KVM Networking

* virsh net-list
* virsh net-info YOUR_NET_NAME
* virsh net-destroy YOUR_NET_NAME
See also: MacVTap, virbr0, ovirtmgmt, virtio and brctl.

#### Activities

* Read KVM Network Performance - Best Practices and Tuning Recommendations
* Learn about KVM Host Networking Configuration Choices https://www.ibm.com/support/knowledgecenter/en/linuxonibm/liaag/wkvm/wkvm_c_net.htm

### Storage

* List Storage pools:
       virsh pool-list
       virsh pool-list --all
* Show information by pool: virsh pool-info YOUR_POOL_NAME
* List Volumes from a pool: virsh vol-list YOUR_POOL_NAME
* Create pool:(RHEL 6 documentation)
See also: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/sect-managing_guest_virtual_machines_with_virsh-storage_pool_commands
* Create volume
       virsh vol-create-as --format qcow2 --capacity VM_DISK_SIZE --pool VM_STORAGE_POOL_NAME --name VM_SERVER_NAME.qcow2

### Snapshots

Snapshots can be offline or live and internal or external:
* RedHat recommend using external snapshots using virsh snapshot-create-as command.
* Live snapshot are not supported in RHEL 8
* List snapshots:virsh snapshot-list $DOMAIN
* Create snapshot: virsh snapshot-create-as --domain {VM-NAME} --name "{SNAPSHOT-NAME}"
* Revert snapshot: virsh snapshot-revert --domain YOUR_DOMAIN --snapshotname YOUR_SNAPSHOT_NAME --running
* Snapshots with blockcommit and blockpull

## Hybernate VM

* virsh save

## Performance

* systemd-cgtop can be used for showing control groups resource utilization.

## Activities
### General

* Install KVM in an Ubuntu Server following https://help.ubuntu.com/community/KVM/Installation instructions:
* Connect to KVM using Virt Manager (brew install virt-manager
* Create a KVM virtual machine with Ansible: DevOps/Ansible/ovirt-RHV module
* Read about raw files and qcow2 differences: https://www.berrange.com/posts/2017/02/10/the-surprisingly-complicated-world-of-disk-image-sizes/

### Snapshots

* Read KVM virsh external vs internal snapshots: https://rentry.co/644h6
* Read RedHat recommendations: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/sect-Troubleshooting-Workaround_for_creating_external_snapshots_with_libvirt
* Read this guide about handling snapshots: https://www.cyberciti.biz/faq/how-to-create-create-snapshot-in-linux-kvm-vmdomain/

### Advanced

* Extend LVM on qcow2 images: https://www.technomenace.com/2014/08/how-to-extend-lvm-on-qcow2-images/
* Live Migrate a machine between two servers.
* Offline Migrate or move a virtual machine between two KVM servers without shared storage: virsh dumpxml and virsh define
Backup:
* virsh/Create Live backups using virsh blockcommit
* Review Bacula Enterprise KVM plugin: http://www.bacula.lat/kvm-plugin-bacula-enterprise-quick-guide/?lang=en
* Review Bacula solution with bpipe: http://www.bacula.lat/kvm-hot-online-virtual-machines-backup-with-bacula-bpipe/?lang=en
* Review Veritas Netbackup support for RHV