Basic KVM operations

From Newroco Tech Docs
Jump to navigationJump to search

SEE ALSO!

List all the VMs, and see which ones are running

# sudo virsh list --all

Start, stop, reboot a VM

Start

You can list the VMs first, then:

# sudo virsh start <name of your vm>

Shutdown

Note: this require the VM to have support for ACPI - at the moment it doesn't seem to work with windows VMs (seems OK to me- Jo).

# sudo virsh shutdown <name of the vm>


Reboot

# virsh reboot <name of the vm>

Destroy

Same thing as taking the plug off. Use with care.

# sudo virsh destroy <name of the vm>

Guest start on boot ( Autostart )

sudo virsh autostart $VM_ID
or
sudo virsh autostart --disable $VM_ID

Delete a VM

THIS REMOVES A VM. NO RESTORE POSSIBLE. PLEASE USE WITH SPECIAL CARE.

sudo virsh shutdown <name of the vm>
sudo virsh undefine <name of the vm>
sudo rm -rf /var/lib/kvm/<name of the vm>

Back up a VM

After shutting down:

# cd /var/lib/kvm
# cp -R <name of the vm> /to/safe/place

Copy or move a VM to another host

Copy the VM image to remote server in /tmp dir (make sure the VM is shutdown):

rsync /var/lib/kvm/<vm-name>/<vm-image> <remote-server-ip>:/tmp/

On the remote server create a dir for the VM and copy it from /tmp to that dir:

mkdir /var/lib/kvm/<vm-name>
mv /tmp/<vm-image> /var/lib/kvm/<vm-name>/

Now you also need the xml file for that VM. Since it is just text you can copy it, create a file on remote server and paste it there. The xml file is found in this dir:

/etc/libvirt/qemu

After you copied the VM image and xml file you can define and start it:

virsh define /etc/libvirt/qemu/<vm-name>.xml
virsh start <vm-name>
virsh autostart <vm-name>

Rename a VM

Shutdown the VM, dump the xml file and edit it.

virsh shutdown oldname
virsh dumpxml oldname > /etc/libvirt/qemu/newname.xml
vi /etc/libvirt/qemu/newname.xml

In newname.xml change "<name>oldname</name>" to "<name>newname</name>" and "

" to "

". Undefine the VM and define the new one.

virsh undefine oldname
mv /var/lib/kvm/oldname /var/lib/kvm/newname
virsh define /etc/libvirt/qemu/newname.xml
virsh start newname

or use

# virsh domrename $OLD_NAME $NEW_NAME

ssh to VM and follow the steps from here: changing the hostname

Resizing Memory With Script

VM_ID="my_vm_id"
NEW_AMOUNT="4000"

EDITOR='sed -i "s;[0-9]*</currentMemory>;$NEW_AMOUNT</currentMemory>;"' virsh edit $VM_ID
EDITOR='sed -i "s;[0-9]*</memory>;$NEW_AMOUNT</memory>;"' virsh edit $VM_ID

sudo virsh shutdown $VM_ID
sudo virsh start $VM_ID

Useful Tools

Install tools

apt-get -y install libguestfs-tools virt-top

"ls" List a directory in a virtual machine.

# virt-ls -l -d ubuntu /root 

"cat" Display content of a file in a virtual machine.

# virt-cat -d ubuntu /etc/network/interfaces 


Edit a file in a virtual machine.

# virt-edit -d ubuntu /etc/netplan/01-netcfg.yaml

Edit a file in a virtual machine image.

# virt-edit -a /path/to/image.qcow2 /home/user/.bash_history

Display disk usage in a virtual machine.

# virt-df -h -d ubuntu


Mount a disk of a virtual machine

# guestmount -d ubuntu -i /mnt 
# ll /mnt

Display the status of virtual machines

# virt-top

VM-disk deleted - resolution

Solution 1

# lsof | grep 101
...
kvm       3649       root   18u      REG              253,2 2147483648     524290  (deleted)/var/lib/vz/images/101/vm-101-disk-1.raw
...

Important is the pid (3649) and the filediscriptor (18) do an copy (before that, it's a good idea to stop important services with open files inside the VM, like databases)

cp /proc/3649/fd/18 /var/lib/vz/images/101/vm-101-disk-1.raw

Voila, the disk-file (of an open-VM!) is copied back.

Solution 2

To conver the image from raw to qcow2

qemu-img convert -p -f qcow2 -O raw /proc/2850/fd/19 vm-100-disk-1.raw

Test the copied file with an dummy-VM before shutdown the original VM!


List all the VMs with the autostart option activated

# sudo virsh list --autostart

Snapshoot operations

Create snapshoot

virsh shutdown vm_name
virsh snapshot-create-as --domain vm_name --name "snapshot_name" --description "Snapshot"

Restore snapshoot

virsh snapshot-list --domain vm_name
virsh snapshot-revert --domain vm_name --snapshotname snapshot_name

Delete snapshoot

virsh snapshot-delete --domain vm_name --snapshotname snapshot_name_to_be_deleted

Adding a disk to VM

On the host, create an image

qemu-img create -f qcow2 /path/to/image.qcow2 10G

Attach the disk to the VM (check before if vda is used; if yes use vdb, vdc, etc.). Make sure to provide the full path to the image.

virsh shutdown vm-name
virsh attach-disk vm-name --source /path/to/image.qcow2 vdb --driver qemu --subdriver qcow2 --targetbus virtio --persistent

Before starting the VM check that the disk attached as qcow2 and not another type like raw.

#virsh edit vm-name

<disk type='file' device='disk'>
   <driver name='qemu' type='qcow2'/>
   <source file='/var/lib/kvm/ourbus-nc/ourbus-ncstorage1.qcow2'/>
   <target dev='vda' bus='virtio'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>

If type is not qcow2 change it and start the VM.

virsh start vm-name

On the VM, check disk vda has been attached

# ls -l /dev/disk/by-path/
lrwxrwxrwx 1 root root  9 Oct 23 13:44 virtio-pci-0000:00:05.0 -> ../../vda

Create a partition with parted or other tool

parted /dev/vda

If parted throws a warning that the disk size is only a few KB, there is a problem with the disk. In this case go back and investigate, otherwise go ahead and create the partition.

Format it

mkfs.ext4 /dev/vda1

If the disk will be used for data storage then reduce the space reserved for root operations

tune2fs -m 1 /dev/vda1

Find the UUID of the partition (the groups of numbers/letters before the arrow -> )

#ls -l /dev/disk/by-uuid/
lrwxrwxrwx 1 root root 10 Oct 23 13:45 936de7fd-084f-4456-898f-483341df1cf1 -> ../../vda1

Mount the partition using the UUID

mount /dev/disk/by-uuid/youruuid /path/to/mymountpoint

Append a line to /etc/fstab so your mount can survive a reboot

UUID=youruuid       /path/to/mymountpoint ext4    defaults        0       0

Detach disk from a VM

virsh detach-disk vm-name vda --config

Converting

Info about image

qemu-img info image.vmdk 

From .vdi to .qcow2

qemu-img convert -f vdi -O qcow2 from.vdi to.qcow2

From qcow2 to .vdi

qemu-img convert -O vdi from.qcow2 to.vdi

From .img to .qcow2

qemu-img convert -f raw from.img -O qcow2 to.qcow2

From .qcow2 to .raw

qemu-img convert -O raw from.qcow2 to.raw

List OS suported variants bt virt-install

When creating a guest with virt-install you need to specify the --os-variant. To get a list of acceptable values (on Ubuntu 16.04), install the libosinfo-bin package before running the command below:

# osinfo-query os

Reset and set the root password of a certain VM

First shutdown the VM:

virsh shutdown <vm_name>

Secondly get the path of the image:

virsh dumpxml <vm_name> | grep 'source file'

Afterwards set the root password:

 virt-customize -a <path_of_image> --root-password password:NewRootUserPasswordHere --uninstall cloud-init