The host server (running CentOS 6.0) only has one public IP address and will be hosting many KVM guests so it needs to use a virtual network switch configuration in NAT mode.

I have previously used pxelinux for automated installation of physical machines and would like to continue to use pxelinux for installation of KVM-guests. The reason for this is that I already have written some scripts that generate pxelinux configuration files and I would like to reuse them.

Could someone provide a step-by-step instruction of how to install a CentOS 6.0 KVM guest on a CentOS 6.0 host server?

I would like to use the command line as much as possible so I prefer virt-install to virt-manager.

The host server has only one LVM volume group: vg0

[root@server ~]# vgs
  VG   #PV #LV #SN Attr   VSize VFree 
  vg0    1   3   0 wz--n- 8.18t 97.90g

1 Answer 1


First install some requirements. (This might be more than actually needed)

yum -y groupinstall "X Window System"
yum -y groupinstall "Virtualization Client" 
yum -y groupinstall "Virtualization" 
yum -y groupinstall "Virtualization Platform" 
yum -y groupinstall "Virtualization Tools"
yum -y groupinstall "Desktop"
yum -y install xorg-x11-fonts-100dpi
yum -y install xorg-x11-fonts-75dpi
yum -y install xorg-x11-fonts-Type1 xorg-x11-font-utils
yum -y install man
yum -y install emacs

As stated in the question we already have an LVM volume group

[root@server ~]# vgs
  VG   #PV #LV #SN Attr   VSize VFree 
  vg0    1   3   0 wz--n- 8.18t 97.90g

First we create and define a libvirt storage pool from that LVM volume group

[root@server ~]# cat /tmp/foobar
<pool type='logical'>
[root@server ~]# virsh pool-define /tmp/foobar
Pool pool0 defined from /tmp/foobar

[root@server ~]# virsh pool-start pool0
Pool pool0 started

[root@server ~]# virsh pool-autostart pool0
Pool pool0 marked as autostarted

[root@server ~]# virsh pool-list
Name                 State      Autostart 
pool0                  active     yes       

Per default libvirt already has a virtual network configured. It is named default. In this example we will redefine that virtual network so that we can use it for PXE install.

[root@server ~]# virsh net-list
Name                 State      Autostart
default              active     yes       

[root@server ~]# emacs /tmp/default.xml
[root@server ~]# cat /tmp/default.xml
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0' />
  <ip address='' netmask=''>
    <tftp root='/var/lib/dnsmasq/tftpboot' />
      <range start='' end='' />
      <host mac='02:54:00:13:be:e4' name='virt1.example.com' ip='' />
      <host mac='02:52:2c:a3:11:42' name='virt2.example.com' ip='' />
      <bootp file='/pxelinux.0' />

The MAC addresses, 02:54:00:13:be:e4 and 02:52:2c:a3:11:42 seen above are just some random MAC addresses. (see the serverfault question: how to generate a random MAC address from the Linux command line)

[root@server ~]# virsh net-destroy default
Network default destroyed

[root@server ~]# virsh net-undefine default
Network default has been undefined

[root@server ~]# virsh net-define /tmp/default.xml
Network default defined from /tmp/default.xml

[root@server ~]# virsh net-start default
Network default started

[root@server ~]# virsh net-autostart default
Network default marked as autostarted

[root@server ~]# mkdir /var/lib/dnsmasq/tftpboot      
[root@server ~]# ls -lZd /var/lib/dnsmasq/tftpboot
drwxr-xr-x. root root unconfined_u:object_r:dnsmasq_lease_t:s0 /var/lib/dnsmasq/tftpboot
[root@server ~]# yum install syslinux
[root@server ~]# rpm -ql syslinux | grep pxelinux.0
[root@server ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/dnsmasq/tftpboot/
[root@server ~]# cd /var/lib/dnsmasq/tftpboot/
[root@server tftpboot]# wget -O centos-6-vmlinuz.x86_64 http://ftp.funet.fi/pub/Linux/mirrors/centos/6.0/os/x86_64/images/pxeboot/vmlinuz
[root@server tftpboot]# wget -O centos-6-initrd.img.x86_64 http://ftp.funet.fi/pub/Linux/mirrors/centos/6.0/os/x86_64/images/pxeboot/initrd.img
[root@server tftpboot]# mkdir /var/lib/dnsmasq/tftpboot/pxelinux.cfg
[root@server tftpboot]# cd /var/lib/dnsmasq/tftpboot/pxelinux.cfg

The MAC address 02:54:00:13:be:e4 used above needs the configuration filename 01-02-54-00-13-be-e4. In other words prepend 01- and convert : into -.

[root@server pxelinux.cfg]# emacs 01-02-54-00-13-be-e4
[root@server pxelinux.cfg]# cat 01-02-54-00-13-be-e4
default local
prompt 1
timeout 50

label local
  localboot 0

label install
  kernel /centos-6-vmlinuz.x86_64
  append initrd=/centos-6-initrd.img.x86_64 ks=http://www.example.com/kickstart-files/virt1.example.com.txt device=eth0 ramdisk_size=9216 lang= devfs=nomount  

[root@server pxelinux.cfg]# cd

Here we assumed that the kickstart file for virt1.example.com can be downloaded from http://www.example.com/kickstart-files/virt1.example.com.txt

Now we run service libvirtd reload. This seems to be required for the dnsmasq tftpserver to run properly.

[root@server ~]# service libvirtd reload
Reloading libvirtd configuration:                          [  OK  ]

Now run virt-install to create the KVM guest virt1.example.com with 20 Gb disk space.

[root@server ~]# virt-install --debug --hvm --vnc --name virt1.example.com --os-type=linux --os-variant=rhel6 --pxe --network network=default,model=e1000,mac=02:54:00:13:be:e4 --disk pool=pool0,size=20 --ram 1024 --vcpus=1 

Now the graphical program virt-viewer will pop up an X-window. When you see "boot: " during the boot sequence, type install.

A note about the virt-install command line options: Using model=virtio didn't work for me, but luckily model=e1000 worked just fine.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.