Using KVM Linux hypervisor (with libvirt, virtsh, virt-install and guestfish/libguestfs)

KVM (Kernel-based Virtual Machine) is a virtualization infrastructure for the Linux kernel that turns it into a hypervisor.


## check hardware virtualization supoort
$ egrep -i 'vmx|svm' --color=always /proc/cpuinfo

## disable SELinux
$ vi /etc/selinux/config
$ reboot

## install KVM, QEMU and user-space tools
$ apt-get install qemu-kvm qemu-utils libvirt-bin | yum install qemu-kvm qemu-img libvirt
$ sudo service libvirtd start | sudo systemctl start libvirtd 

# optionally add yourself to libvirtd group, otherwise sudo
$ sudo adduser <youruser> libvirtd
# check libvirtd daemon
$ sudo virsh -c qemu:///system list

from kvm@debian and kvm@centos


libvirt installation provides NAT based connectivity, also called default virtual network. It adds iptables rules to allow traffic to/from guests attached to the virbr0 device in the INPUT, FORWARD, OUTPUT and POSTROUTING chains, and attempt to enable ip_forward.

Advanced users will want to use full bridging, where the guest is connected directly to the LAN. Don’t attach a physical device to virbr0 (this is only for NAT connectivity).

## check default NAT virtual network
$ virsh net-list --all
default              active     yes
$ brctl show

## bridging non-persistent using bridge-utils/brctl
$ apt-get|yum install bridge-utils
$ brctl addbr br0
$ brctl addif br0 eth0
# assign ip to bridge
$ ip link set dev br0 up
$ ip addr add dev br0
# delete
$ ip link set dev eth0 promisc on
$ ip link set dev eth0 master br0

## bridging using ifcfg/rhel
# disable network manager
$ sudo service NetworkManager stop ; sudo chkconfig NetworkManager off
$ sudo chkconfig network on ; sudo service network start
$ ifdown eth0
$ vi /etc/sysconfig/network-scripts/ifcfg-eth0
$ vi /etc/sysconfig/network-scripts/ifcfg-br0
# either static
# or dhcp
$ ifup eth0 ; ifup br0

## bridging in debian
$ vi /etc/network/interfaces
#auto eth0
#iface eth0 inet dhcp
# either static
iface br0 inet static
  bridge_ports eth0 eth1
# or dhcp
auto br0
iface br0 inet dhcp
  bridge_ports eth0
  bridge_stp off
  bridge_fd 0
  bridge_maxwait 0
$ /etc/init.d/networking restart

## bridging using nmcli/networkmanager
$ nmcli con add type bridge autoconnect yes con-name br0 ifname br0
# either static
$ nmcli con mod br0 ipv4.addresses "" ipv4.method manual 
$ nmcli con mod br0 ipv4.dns ""
# or dhcp
$ nmcli con mod br0 ipv4.method auto
# remove current setting and add interface to bridge
$ nmcli c delete eth0
$ nmcli c add type bridge-slave autoconnect yes con-name eth0 ifname eth0 master br0
$ systemctl restart NetworkManager

from virtual networking and networking hints and tips

Using virsh

Virsh/virsh@man is main interface for managing (create, pause shutdown) virsh guest domains. It uses libvirt@wiki, an open source C API/lib, daemon and management tool for managing platform virtualization. It can be used to manage KVM, Xen, LXC, VMware ESX, QEMU, VirtualBox, Hyper-V, Bhyve and other virtualization technologies.

$ curl 
  -o linux.iso

## create virtual disk using qcow2 (grows as needed)
$ qemu-img create -f qcow2 /var/lib/libvirt/images/guest.qcow2 8G

## create domain xml file either manually
$ uuid
$ vi guest.xml
<domain type='kvm'>
    <boot dev='cdrom'/>
  <clock offset='utc'/>
    <disk type="file" device="disk">
      <driver name="qemu" type="qcow2"/>
      <source file="/var/lib/libvirt/images/guest.qcow2"/>
      <target dev="vda" bus="virtio"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x04" function="0x0"/>
    <disk type="file" device="cdrom">
      <driver name="qemu" type="raw"/>
      <source file=linux.iso"/>
      <target dev="hdc" bus="ide"/>
      <address type="drive" controller="0" bus="1" target="0" unit="0"/>
    <controller type="ide" index="0">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x1"/>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport="yes" listen=''/>
    <console type='pty'>
      <target port='0'/>

## start vm
$ virsh create guest.xml
$ virsh list

## remote access vm
# either by vnc, usually kvm-host:5900
$ sudo netstat -nap | grep kvm
tcp 0
# or console
$ virsh console guest

## manage VMs
$ virsh destroy|shutdown|undefined|suspend|resume|autostart guest

Using virt-install

virt-install@man is a command line tool for creating new KVM , Xen, or Linux container guests using libvirt

## install
$ apt-get install virtinst | yum install virt-install

'-r,--ram MEMORY' guest memory
'--vcpus VCPUS' guest virtual cpus
'--cpuset CPUSET' physical cpus used by guest, eg: 1-5,^3,8
'-c,--cdrom CDROM or' virtual file or device, iso usually
'--boot=BOOTOPTS' boot priority and kernel args, eg: cdrom,fd,hd,network,kernel_args="console=/dev/ttyS0"
'--disk path=PATH,size=G,format=raw|qcow2' same as '--filesystem PATH' guest storage media, created if doesnt exist
'--network bridge=BRIDGE|network=NAME'
'--graphics vnc|none' defaults to vnc
'--hvm' request full virtualization, useful if both para and full virtualizations are available
'--autostart' start domain on host boot

## start VM (from ISO locally or remotelly)
$ virt-install --name guest --ram 1024 --vcpus=2 
  --disk path=/var/lib/libvirt/images/guest.qcow2,device=disk,size=8 
  --network bridge=virbr0 --cdrom linux.iso

from Installing a virtual machine using virt-install and virt-install@tecmint

Using guestfish/libguestfs

libguestfs/Libguestfs@wiki/guestfish@man is a set of tools for accessing and modifying virtual machine (VM) disk images. You can use this for viewing and editing files inside guests, scripting changes to VMs, monitoring disk used/free statistics, creating guests, P2V, V2V, performing backups, cloning VMs, building VMs, formatting disks, resizing disks, and much more.

Libguestfs is a C library. All this functionality is available through guestfish scriptable and interactive shell, or virt-* tools (just a script wrapper).

## install
$ apt-get install libguestfs-tools | yum install libguestfs-tools | yaourt -S libguestfs

'-rw(default) or -ro' read-write or read-only
'-d libvirt-domain or -a disk.img'
'-i' interactive shell

# list files

# edit file
$ virt-edit -d DOMAIN FILE -e 'SED-EXPR'
$ guestfish --rw -i -d DOMAIN
><fs> download FILE /tmp/FILE
><fs> ! sed -i 'SED-EXP' /tmp/FILE
><fs> upload /tmp/FILE FILE
# remove root password
$ virt-edit -a disk.img /etc/passwd -e 's/^root:.*?:/root::/'

# checksum file
$ guestfish --ro -a disk.img -i checksum sha256 FILE

# convert ISO to tarball
$ guestfish --ro -a in.iso -m /dev/sda tgz-out / out.tar.gz

# interactive commands, eg: delete,touch,stat a file
$ guestfish -a disk.img -i rm FILE
$ guestfish --ro -a disk.img -i stat FILE
# list all commands
$ guestfish -h

# lists differences between files in two VMs (or disk images)
$ virt-diff -d oldguest -D newguest
$ virt-diff -a old.img -A new.img

# disable systemd service
$ guestfish -a disk.img -i ln-sf /dev/null /etc/systemd/system/cloud-init.service

# export directory from VM
$ virt-copy-out -d DOMAIN VMDIR LOCALDIR

# read file
$ virt-cat disk.img FILE

# install packages
$ virt-builder fedora-20 -edit '/etc/yum.repos.d/fedora-updates-testing.repo:s/enabled=0/enabled=1/' --install emacs
# list os/templates supported
$ virt-builder --list
# same but using virt-customize
$ virt-customize -a fedora-20.img --update --install gcc

# show free space
$ virt-df -a disk.img
# list all filesystems
$ virt-filesystems -a disk.img --all --long -h

# show OS info, including version and installed packages
$ virt-inspector -d DOMAIN

# create a new image
$ virt-builder centos-7.0

# set root password
$ virt-sysprep --enable customize --root-password password:123456 -a /dev/sdX

# resize image, expand '/dev/sda2' by '+5G'
$ virt-filesystems --long -h --all -a olddisk
$ truncate -r olddisk newdisk ; truncate -s +5G newdisk
$ virt-resize --expand /dev/sda2 olddisk newdisk

from virt-tools, virt-tools@rwmj and guestfs-recipes/guestfs-recipes@ubuntu

Other KVM management tools

Virt-manager@wiki, GNOME_Boxes@wiki and OVirt@wiki are GUI versions of virtsh. See tools@kvm.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s