Headless KVM Server on CentOS 8

Update and reboot if this is a new setup.

yum update -y; reboot

Here I download the ISO I’ll create a test VM with.

# cd /kvm/iso
# wget http://mirror.freethought-internet.co.uk/centos/8.2.2004/isos/x86_64/CentOS-8.2.2004-x86_64-dvd1.iso
# wget http://mirror.freethought-internet.co.uk/centos/8.2.2004/isos/x86_64/CHECKSUM
# sha256sum --ignore-missing -c CHECKSUM

Create bridge interface. Backup the current interface configuration and create a new one called br0.

[[email protected] ~]# mkdir -v ~/backup
mkdir: created directory '/root/backup'
[[email protected] ~]# mv -v /etc/sysconfig/network-scripts/ifcfg-eno1 ~/backup/
renamed '/etc/sysconfig/network-scripts/ifcfg-eno1' -> '/root/backup/ifcfg-eno1'
[[email protected] ~]# 
[[email protected] ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0

Enter something like the following.


And then for the old interface.

[[email protected] ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno1

Mine looks like this.


Disable IPv6. To check which interfaces are IPv6 enabled:

[[email protected] ~]# ip a | grep inet6
    inet6 ::1/128 scope host 
    inet6 fe80::1a66:daff:fe12:4ea4/64 scope link

Create a new file in the /etc/sysctl.d directory.

[[email protected] ~]# vim /etc/sysctl.d/ipv6.conf

Insert the following to disable IPv6 on the required interfaces. Here I disable it on all interfaces except local host, ::1/128.

net.ipv6.conf.br0.disable_ipv6 = 1
net.ipv6.conf.eno1.disable_ipv6 = 1
net.ipv6.conf.virbr0.disable_ipv6 = 1
net.ipv6.conf.virbr0-nic.disable_ipv6 = 1

If you just want to disable IPv6 on all interfaces:

net.ipv6.conf.all.disable_ipv6 = 1

Reload the file to bring the changes into effect.

[[email protected] ~]# sysctl --load /etc/sysctl.d/ipv6.conf
net.ipv6.conf.br0.disable_ipv6 = 1
net.ipv6.conf.eno1.disable_ipv6 = 1
net.ipv6.conf.virbr0.disable_ipv6 = 1
net.ipv6.conf.virbr0-nic.disable_ipv6 = 1

You might want to reboot at this stage if you’ve not done so already, just to make sure all comes back up as expected.

[[email protected] ~]# reboot
Connection to closed by remote host.
Connection to closed.

Once you’ve reconnected, lets install the software we need.

[[email protected] ~]# yum install libvirt virt-top libguestfs-tools virt-install virt-viewer libvirt-client virtio-win libguestfs

Start and enable the service.

[[email protected] ~]# systemctl enable --now libvirtd.service

Now lets give that a quick test and check we can create a VM. As this is a headless server, I use a VNC client on another machine on my network to connect to the VM and complete the installation. To follow along, you will need another machine with SSH and a VNC client. I used my Windows laptop just fine for this purpose.

I actually use Git Bash – part of Git for Windows, but you should be able to use any SSH client. Using whatever client, SSH into your KVM server with the below command.

$ ssh [email protected] -L 5900:

Like so:

Now back on the KVM server, copy and paste the below in the command prompt. Amend as required.

virt-install \
--virt-type=kvm \
--name centos8-vm \
--memory 2048 \
--vcpus=2 \
--os-variant=rhel8.1 \
--cdrom=/kvm/iso/CentOS-8.2.2004-x86_64-dvd1.iso \
--network=bridge=br0,model=virtio \
--graphics vnc \
--disk path=/kvm/images/centos8.qcow2,size=20,bus=virtio,format=qcow2

In another terminal, check the VNC port being used (probably 5900):

[[email protected] ~]# virsh dumpxml centos8-vm | grep vnc
    <graphics type='vnc' port='5900' autoport='yes' listen=''>

Now back on the device with VNC and the SSH connection open on – open up your VNC client. Install one if necessary. I’m using RealVNC viewer. Then connect to localhost on TCP port 5900.

You should now be greeted with the installer screen.

I wont cover the full installation here but notice that because we create the bridge interface earlier, when you enable the network interface during the installation, you should see it get assigned a regular IP address from your router and treated like a regular machine.

Once the installation is complete, you should be able to SSH into the device.

[[email protected] ~]# ssh [email protected]

On the KVM server, you and use the virsh command to list all VMs currently on the host.

[[email protected] ~]# virsh list --all
 Id    Name                           State
 3     centos8-vm                     running

You can shutdown the device from the KVM host with:

[[email protected] ~]# virsh shutdown centos8-vm 
Domain centos8-vm is being shutdown

Or if its stuck, you can force it. However this should be used as a last restort.

[[email protected] ~]# virsh destroy centos8-vm

If you actually want to delete it, use the undefine option.

[[email protected] ~]# virsh undefine centos8-vm

Or to start it back up again:

[[email protected] ~]# virsh start centos8-vm 
Domain centos8-vm started

And that’s it really. This was just a quick one showing you how to setup KVM in headless mode. This device will actually be used to install FreeIPA on – hence the hostname value! It was also the main reason I disabled IPv6 – as it integrates with Active Directory better. Guides on that to follow shortly hopefully.

Be the first to comment

Leave a Reply