We will build a VM using KVM/Qemu hypervisor. But we will manage this VM using libvirtd. This VM build will use a kickstart file. This kickstart file will be embedded into VM during install process.
Environment/Tools used:
Host OS is Debian Jessie (Debian-8). We will build CentOS-7.0 VM on this Debian Host. We will use
CentOS-7-x86_64-Minimal-1511.iso image stored in Host machine to build VM.
libvirtd networking:
Please see following link for details.
http://spareslant.blogspot.co.uk/2016/02/libvirtd-netwroking.html
Activate libvirtd "default" network:
# virsh net-list --all If above output shows that "default" network is inactive then run following command to activate it. # virsh net-start defaultActivate DHCP in "default" network.
# virsh net-update default add ip-dhcp-range '<range start="192.168.122.100" end="192.168.122.254" />' --liveCreate storage file.
# qemu-img create -f qcow2 /home/testuser/Downloads/KVM_IMAGES/centos-7.qcow2 5GNote: I created above storage file because I am using non-standard location. Above step is not required if using libvirtd defaults.
Install Virtual Machine.
# virt-install \ --name centos-vm1 \ --memory 1024 \ --cpu=host \ --vcpus 1 \ --os-type=linux \ --graphics none \ --disk path=/home/testuser/Downloads/KVM_IMAGES/centos-7.qcow2 \ --initrd-inject=/tmp/ks.cfg \ --console pty,target_type=serial \ --extra-args='ks=file:/ks.cfg console=ttyS0,115200n8 serial' \ --network=default \ --location /home/testuser/Downloads/CentOS-7-x86_64-Minimal-1511.isoNote:
1) Please note --graphics none parameter. This is required for non-gui installation.
2) Please note "--initrd-inject=/tmp/ks.cfg" parameter. we are injecting ks.cfg file dynamically. No need of external HTTP/FTP/NFS to host ks.cfg.
3) Above command will start installation of VM non-interactively and non-GUI mode.
4) Above setup uses Virtual Private network.
5) VMs setup in this manner however can access external world. But external world cannot access them.
6) VMs setup in this manner can communicate with each other and with HOST machine as well.
7) In this setup HOST machine will have two IPs. One IP on eth0 (as usual) and other IP on virb0 bridge. Both are in different network. Hence isolating VMs network.
8) If we want HOST machine and VMs to be on same network then BRIDGE networking needs to be used.
Following is the ks.cfg file:
#version=DEVEL # System authorization information auth --enableshadow --passalgo=sha512 # Use CDROM installation media cdrom # Use text mode install text # Run the Setup Agent on first boot firstboot --disable # Keyboard layouts keyboard --vckeymap=uk --xlayouts='uk' # System language lang en_GB.UTF-8 # Network information #network --bootproto=static --device=eth0 --gateway=192.168.0.1 --ip=192.168.0.61 --nameserver=8.8.8.8 --netmask=255.255.255.0 --ipv6=auto --activate --hostname=centosvm1 network --bootproto=dhcp --onboot=yes # Root password rootpw --iscrypted $6$pDcoINZetTlq2e2S$Tjz7tBv14Mrw41paKN0O57o.7m7HNWOmIguqdLO6YAA1yrxUcl1mypt5bBKqjVuOqnlNOOoeQH9zJud6FfXcz1 # Do not configure the X Window System skipx # System timezone timezone Europe/London --isUtc user --name=ocean1 --password=$6$wTphTlXg/5nlzaNK$YoezS.sO80koCnVgyC.kOxF.t3jo0dzk9ey6ENiAPpWme9dfKTFX7ziC.oONjtAh1hDnlLLLq1j4N5YWUlcrK0 --iscrypted # System bootloader configuration bootloader --append=" crashkernel=auto console=ttyAMA0,115200 console=tty console=ttyS0" --location=mbr autopart --type=plain # Partition clearing information clearpart --all --initlabel %packages @core kexec-tools %end %addon com_redhat_kdump --enable --reserve-mb='auto' %end %post --interpreter /usr/bin/python --log=/root/post-log import os entirefile=open('/etc/default/grub').read() entirefile=entirefile.replace('rhgb', '') entirefile=entirefile.replace('quiet', '') open('/etc/default/grub', 'w').write(entirefile) os.system("grub2-mkconfig -o /boot/grub2/grub.cfg") %endNote: Please note "text" parameter used in ks.cfg file. This is for non-GUI text installation.