How to install KVM on Ubuntu 16.04 LTS Headless Server

Posted on in Categories , last updated January 27, 2017

Kernel-based Virtual Machine (KVM) is a virtualization module for the Linux kernel that turns it into a hypervisor. How can I install KVM with bridged networking, setup guest operating system as the back-end virtualization technology for non-graphic Ubuntu Linux 16.04 LTS server?

You can use KVM to run multiple operating systems such as Windows, *BSD, Linux distro using virtual machines. Each virtual machine has its private disk, graphics card, a network card and more.

Steps for installing KVM on Ubuntu Linux 16.04 LTS server

  1. The host server located in the remote data center and it is a headless server.
  2. All commands in this tutorial typed over the ssh based session.
  3. You need a vnc client to install the guest operating system.
  4. In this tutorial, you will learn how to install KVM software on Ubuntu 16.04 LTS server and use KVM to setup your first guest VM.

Follow installation steps of KVM on Ubuntu 16.04 LTS headless sever

Step 1: Install kvm

$ sudo apt-get install qemu-kvm libvirt-bin virtinst bridge-utils cpu-checker

Step 2: Verify kvm installation

$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

Step 3: Configure bridged networking

$ sudo cp /etc/network/interfaces /etc/network/interfaces.bakup-1-july-2016
$ sudo vi /etc/network/interfaces

Edit/append as follows:

 auto br0
 iface br0 inet static
         address 10.18.44.26
         netmask 255.255.255.192
         broadcast 10.18.44.63
         dns-nameservers 10.0.80.11 10.0.80.12
         # set static route for LAN
 	 post-up route add -net 10.0.0.0 netmask 255.0.0.0 gw 10.18.44.1
 	 post-up route add -net 161.26.0.0 netmask 255.255.0.0 gw 10.18.44.1
         bridge_ports eth0
         bridge_stp off
         bridge_fd 0
         bridge_maxwait 0
 
 # br1 setup with static wan IPv4 with ISP router as a default gateway
 auto br1
 iface br1 inet static
         address 208.43.222.51
         netmask 255.255.255.248
         broadcast 208.43.222.55
         gateway 208.43.222.49
         bridge_ports eth1
         bridge_stp off
         bridge_fd 0
         bridge_maxwait 0

Save and close the file. Restart the networking service, enter:
$ sudo systemctl restart networking
Verify it:
$ sudo brctl show

Step 4: Create your first virtual machine

I am going to create a CentOS 7.x VM. First, grab CentOS 7.x latest ISO image:
$ cd /var/lib/libvirt/boot/
$ sudo wget https://mirrors.kernel.org/centos/7.2.1511/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso

Create CentOS 7 VM

In this example, I’m creating CentOS 7.x VM with 2GB RAM, 2 CPU core, 2 nics (1 for lan and 1 for wan) and 40GB disk space, enter:
$ sudo virt-install \
--virt-type=kvm \
--name centos7 \
--ram 2048 \
--vcpus=2 \
--os-variant=rhel7 \
--virt-type=kvm \
--hvm \
--cdrom=/var/lib/libvirt/boot/CentOS-7-x86_64-DVD-1511.iso \
--network=bridge=br0,model=virtio \
--network=bridge=br1,model=virtio \
--graphics vnc \
--disk path=/var/lib/libvirt/images/centos7.qcow2,size=40,bus=virtio,format=qcow2

To configure vnc login from another terminal over ssh and type:
$ sudo virsh dumpxml centos7 | grep vnc
<graphics type='vnc' port='5901' autoport='yes' listen='127.0.0.1'>

You can also use the following command:
$ sudo virsh vncdisplay centos7
Please note down the port value (i.e. 5901). You need to use an SSH client to setup tunnel and a VNC client to access the remote vnc server. Type the following SSH port forwarding command from your client/desktop:
$ ssh vivek@server1.cyberciti.biz -L 5901:127.0.0.1:5901
Once you have ssh tunnel established, you can point your VNC client at your own 127.0.0.1 (localhost) address and port 5901 as follows:

Fig.0 : VNC client to complete CentOS 7.x installation
Fig.01 : VNC client to complete CentOS 7.x installation

You should see CentOS Linux 7 guest installation screen as follows:
Fig.02: CentOS 7.x installation on KVM based VM
Fig.02: CentOS 7.x installation on KVM based VM

Now jist follow on screen instructions and install CentOS 7. Once installed, go ahead and click reboot button. The remote server closed the connection to our VNC client. You can reconnect via KVM client to configure the rest of the server including SSH based session or firewall.

Create FreeBSD 10 or 11 VM

In this example, I’m creating FreeBSD 10 VM with 2GB RAM, 2 CPU core, 2 nics (1 for lan and 1 for wan) and 40GB disk space, enter:
$ cd /var/lib/libvirt/boot/
$ sudo wget ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/10.3/FreeBSD-10.3-RELEASE-amd64-disc1.iso
$ sudo virt-install \
--virt-type=kvm \
--name freebsd \
--ram 2048 \
--vcpus=2 \
--os-variant=freebsd10.0 \
--virt-type=kvm \
--hvm \
--cdrom=/var/lib/libvirt/boot/FreeBSD-10.3-RELEASE-amd64-disc1.iso \
--network=bridge=br0,model=virtio \
--network=bridge=br1,model=virtio \
--graphics vnc \
--disk path=/var/lib/libvirt/images/freebsd10.qcow2,size=40,bus=virtio,format=qcow2

In this example, I’m creating FreeBSD 11 VM with 1GB RAM (expandable to 2GB), 1 vCPU core (expandable to 2vCPU), 1 nic and 40GB disk space, enter:
$ sudo virt-install \
--virt-type=kvm \
--name freebsd \
--memory=1024,maxmemory=2048 \
--vcpus=1,maxvcpus=2 \
--os-variant=freebsd10.0 \
--virt-type=kvm \
--hvm \
--cdrom=/var/lib/libvirt/boot/FreeBSD-11.0-RELEASE-amd64-disc1.iso \
--network=bridge=br0,model=virtio \
--graphics vnc \
--disk path=/var/lib/libvirt/images/freebsd11.qcow2,size=40,bus=virtio,format=qcow2

To configure vnc login from another terminal over ssh and type:
$ sudo virsh dumpxml freebsd | grep vnc
<graphics type='vnc' port='5902' autoport='yes' listen='127.0.0.1'>

Please note down the port value (i.e. 5902). You need to use an SSH client to setup tunnel and a VNC client to access the remote vnc server. Type the following SSH port forwarding command from your client/desktop:
$ ssh vivek@server1.cyberciti.biz -L 5902:127.0.0.1:5902
Once you have ssh tunnel established, you can point your VNC client at your own 127.0.0.1 (localhost) address and port 5902 to continue with FreeBSD 10.3 installation.

Create OpenBSD 5.9 VM

In this example, I’m creating OpenBSD 5.9 VM with 2GB RAM, 2 CPU core, 2 nics (1 for lan and 1 for wan) and 40GB disk space, enter:
$ cd /var/lib/libvirt/boot/
$ sudo wget http://mirror.esc7.net/pub/OpenBSD/5.9/amd64/install59.iso
$ sudo virt-install \
--virt-type=kvm \
--name openbsd \
--ram 2048 \
--vcpus=2 \
--os-variant=openbsd5.6 \
--virt-type=kvm \
--hvm \
--cdrom=/var/lib/libvirt/boot/install59.iso \
--network=bridge=br0,model=virtio \
--network=bridge=br1,model=virtio \
--graphics vnc \
--disk path=/var/lib/libvirt/images/openbsd59.qcow2,size=40,bus=virtio,format=qcow2

To configure vnc login from another terminal over ssh and type:
$ sudo virsh dumpxml openbsd | grep vnc
<graphics type='vnc' port='5903' autoport='yes' listen='127.0.0.1'>

Please note down the port value (i.e. 5903). You need to use an SSH client to setup tunnel and a VNC client to access the remote vnc server. Type the following SSH port forwarding command from your client/desktop:
$ ssh vivek@server1.cyberciti.biz -L 5903:127.0.0.1:5903
Once you have ssh tunnel established, you can point your VNC client at your own 127.0.0.1 (localhost) address and port 5903 to continue with OpenBSD 5.9 installation.

Create Debian 8.x (Debian Jessie) VM

In this example, I’m creating Debian 8.5 VM with 2GB RAM, 2 CPU core, 2 nics (1 for lan and 1 for wan) and 40GB disk space, enter:
$ cd /var/lib/libvirt/boot/
$ sudo wget https://mirrors.kernel.org/debian-cd/current/amd64/iso-dvd/debian-8.5.0-amd64-DVD-1.iso
$ sudo virt-install \
--virt-type=kvm \
--name=debina8 \
--ram=2048 \
--vcpus=2 \
--os-variant=debian8 \
--virt-type=kvm \
--hvm \
--cdrom=/var/lib/libvirt/boot/debian-8.5.0-amd64-DVD-1.iso \
--network=bridge=br0,model=virtio \
--network=bridge=br1,model=virtio \
--graphics vnc \
--disk path=/var/lib/libvirt/images/debian8.qcow2,size=40,bus=virtio,format=qcow2

To configure vnc login from another terminal over ssh and type:
$ sudo virsh dumpxml debian8 | grep vnc
<graphics type='vnc' port='5904' autoport='yes' listen='127.0.0.1'>

Please note down the port value (i.e. 5904). You need to use an SSH client to setup tunnel and a VNC client to access the remote vnc server. Type the following SSH port forwarding command from your client/desktop:
$ ssh vivek@server1.cyberciti.biz -L 5904:127.0.0.1:5904
Once you have ssh tunnel established, you can point your VNC client at your own 127.0.0.1 (localhost) address and port 5904 to continue with Debian Linux 8.5 installation.

Useful commands

Let us see some useful commands.

Find the list of the accepted OS variants

$ osinfo-query os | less
$ osinfo-query os | grep debian
$ osinfo-query os | grep freebsd

List a running vms/domains

$ sudo virsh list

Shutodwn a vm/domain called openbsd

$ sudo virsh shutdown openbsd

Start a vm/domain called openbsd

$ sudo virsh start openbsd

Suspend a vm/domain called openbsd

$ sudo virsh suspend openbsd

Reboot (soft & safe reboot) a vm/domain called openbsd

$ sudo virsh reboot openbsd

Reset (hard reset/not safe) a vm/domain called openbsd

$ sudo virsh reset openbsd

Delete/remove a vm/domain called openbsd

$ sudo virsh undefine openbsd
$ sudo virsh destroy openbsd

To see a complete list of virsh command type
$ virsh help | less
$ virsh help | grep reboot

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin and a trainer for the Linux operating system/Unix shell scripting. He has worked with global clients and in various industries, including IT, education, defense and space research, and the nonprofit sector. Follow him on Twitter, Facebook, Google+.

9 comment

  1. Jesus why are you getting me back to KVM now that I’m on hyper_v and bashonwindows?.Very informative and essential tutorial thank you.keep on that.Any tips about awk sed modern tricks

  2. Hi Vivek,

    A minor thing, but in the iface br1 configs, you should replace:

    network 255.255.255.248
    netmask 255.255.255.0

    with:

    netmask 255.255.255.248

  3. I had just completed the step to make the CentOS VM when I decided to google something. I then realised that I was unable to open any webpages on any browser and restarting my computer multiple times did not fix this. I know the wifi works as my phone and tablet connect fine. Help?

Comments are closed.