+
+ +

Stupid KVM Tricks

+

virt-install ubuntu16.04

+

Create the disk image

+

qemu-img create -f qcow2 /var/lib/libvirt/images/xenial.qcow2 20G

+

Command to run the install

+
virt-install \
+    --name xenial \
+    --ram 4096 \
+    --disk path=/var/lib/libvirt/images/xenial.qcow2,size=20 \
+    --vcpus 4 \
+    --os-type linux \
+    --os-variant ubuntu16.04 \
+    --network bridge=br0 \
+    --graphics none \
+    --console pty,target_type=serial \
+    --location ./ubuntu-16.04.3-server-amd64.iso \
+    --extra-args 'console=ttyS0,115200n8 serial'
+
+ +

Change the Network Interface

+

br0 gets addresses from the network router, but what if you want +your vm to have be on the virbr0 192.168.122.0/24 subnet?

+

virsh edit xenial

+

And then 'J' all the way down to the bottom, change the interface name from br0 to +virbr0,

+

virsh start xenial

+

and then look for the machine with nmap

+

nmap -sn 192.168.122.0/24

+

Clone the VM

+

In this case we don't have to pre-allocate the disk image because virt-clone will do that +for us.

+
virt-clone --original xenial --name xenial-clone \
+    --file /var/lib/libvirt/images/xenial-clone.qcow2
+
+ +

Clone the VM to another Machine

+

First dump the xml that defines the virtual machine.

+
virsh dumpxml xenial > xenial.xml
+
+ +

Then copy both xenial.xml and xenial.qcow2 to the new host machine. On the new kvm +host you'll want to at least make sure your vm has the correct CPU architecture. +The command to get a list of supported kvm cpu architectures is:

+
virsh cpu-models <arch>
+# i.e.
+virsh cpu-models x86_64
+
+ +

After you edit xenial.xml and update the correct cpu architecture, mv xenial.qcow2 +to /var/lib/libvirt/images/, clone it. virt-clone will handle generating new +mac addresses for the network interfaces.

+
  <cpu mode='custom' match='exact'>
+    <model fallback='allow'>Haswell-noTSX</model>
+  </cpu>
+# i.e. change to above to
+  <cpu mode='custom' match='exact'>
+    <model fallback='allow'>SandyBridge</model>
+  </cpu>
+
+
+ +
virt-clone --original-xml xenial.xml --name xenial-clone \
+    --file /var/lib/libvirt/images/xenial-clone.qcow2
+
+ +

What is the os-type and os-variant type names?

+

osinfo-query os

+

misc

+
    +
  • Start the vm virsh start xenial
  • +
  • List all the vms virsh list --all
  • +
  • Stop the vm virsh destroy xenial
  • +
  • Delete the vm virsh undefine xenial
  • +
+

virsh help

+

The virsh help command returns a long chart of help information. But each section has +a keyword.

+

Take for instance the command virsh help monitor. From this we +see the domiflist subcommand (among others). Unfortunately domifaddr doesn't seem to +work on the Ubuntu:16.04 host, but there are other ways to find the ip address of +a virtual machine.

+

So now if you want to see what host interface the vm xenial is attached to, +type.

+
virsh domiflist xenial
+
+ +

which returns:

+
Interface  Type       Source     Model       MAC
+-------------------------------------------------------
+vnet1      bridge     virbr0     virtio      52:54:00:58:bf:75
+
+ +

So now we can find the address of virbr0 on the host machine.

+
ifconfig virbr0
+
+ +

which returns:

+
virbr0    Link encap:Ethernet  HWaddr 52:54:00:38:87:38  
+          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
+          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
+          RX packets:1351 errors:0 dropped:0 overruns:0 frame:0
+          TX packets:3037 errors:0 dropped:0 overruns:0 carrier:0
+          collisions:0 txqueuelen:1000 
+          RX bytes:232346 (232.3 KB)  TX bytes:502916 (502.9 KB)
+
+ +

and thus we know what subnet to scan with nmap to find the ip address of the vm

+
nmap -sn 192.168.122.0/24
+
+ +
+