Información obtenidad de aquí.

Verificación de hardware compatible con la virtualización

El siguiente comando aclarará, de aparecer alguna de las cadenas coloreadas (vmx,svm), si es que nuestra CPU se puede emplear para KVM.

Para mostrar las máquinas viturales que están activadas en XEN se usa el siguiente comando.

$ egrep '(vmx|svm)' --color /proc/cpuinfo

Habilitación de virtualización en la BIOS

Es necesario acceder a la BIOS de nuestra máquina y habilitar la capacidad de virtualización si es que no estuviera ya realizada.

Instalación de KVM

El siguiente comando instalará lo necesario.

$ sudo apt-get install qemu-kvm libvirt-bin virtinst virt-viewer

Es muy probable que sea necesario añadir nuestro usuario al grupo libvirt-qemu, para coprobar si es así lanzaremos el comando id para ver si somos miembros del grupo.

$ id $USER | grep libvirt

Debemos añadirnos al grupo manualmente para poder gestionar los huéspedes de nuestra máquina anfitrion. Para ello ejecutamos esto.

$ sudo adduser $USER libvirt-qemu
$ sudo adduser $USER kvm

Si todo ha ido bien podremos ejecutar el siguiente comando sin ningún problema de permisos.

$ virsh list
 Id    Name                           State
----------------------------------------------------

El resultado debe ser el indicado ya que no hay ninguna máquina virtual funcionando.

Configuración de red

La opción que se va a adoptar es configurar una interfaz puente entre las máquinas huésped y el anfitrión. Para llevarlo acabo debemos deshabilitar el Network Manager, ver aquí.

Podemos verificar que está deshabilitado observando que las interfazes aparecen como no gestionadas tras ejecutar el siguiente comando.

$ nmcli device status
DEVICE  TYPE      STATE      CONNECTION         
eth0    ethernet  unmanaged  --                 
wlan0   wifi      connected  mi_WiFi            
vmnet1  ethernet  unmanaged  --                 
vmnet8  ethernet  unmanaged  --                 
lo      loopback  unmanaged  -- 

Ahora instalaremos en software y crearemos la interfaz puente br0.

$ sudo apt-get install bridge-utils
$ sudo brctl addbr br0

Añadimos al fichero /etc/network/inteces algo como esto.

auto lo
iface lo inet loopback

auto br0
iface br0 inet static
address 1.0.0.100
netmask 255.255.255.0
network 10.0.0.0
bridge_ports eth0
bridge_stp off
bridge_fd 0

Será necesario modificar los valores de IP o bien activar el dhcp según convenga, no se va a detallar aquí como hacerlo.

Para que apliquen los cambios realizados es conveniente reiniciar la interfaz.

$ sudo ifup br0

Un comando útil para verificar que el puente está funcionando correctamente es el siguiente.

$ sudo brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.10bf4872a827	no		eth0

Trambién es necesario comprobar que la interfaz br0 tiene la IP desada y la interfaz eth0 no tiene IP.

Crear una máquina Virtual desde el terminal

La configuración de una instalación KVM se guarda en un archivo con formato XML, en el ejemplo lo llamaremos debian8.xml. Una explicación de este formato se puede leer aquí.

<domain type='kvm'>
  <name>debian8</name>
  <uuid>f5b8c05b-9c7a-3211-49b9-2bd635f7e2af</uuid>
  <memory>1048576</memory>
  <currentMemory>1048576</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type>hvm</type>
    <boot dev='cdrom'/>
  </os>
  <features>
    <acpi/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    
    <disk type="file" device="cdrom">
      <driver name="qemu" type="raw"/>
      <source file="/media/os/debian_8/debian-8.5.0-amd64-DVD-1.iso"/>
      <target dev="hdc" bus="ide"/>
      <readonly/>
      <address type="drive" controller="0" bus="1" target="0" unit="0"/>
    </disk>
    <disk type='block' device='disk'>
      <source dev='/dev/mapper/archivador-asterisk'/>
      <target dev='hda' bus='ide'/>
    </disk>
    <interface type='bridge'>
      <source bridge='br0'/>
      <mac address="00:00:A3:B0:56:10"/>
    </interface>
    <controller type="ide" index="0">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x1"/>
    </controller>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport="yes" listen='0.0.0.0'/>
    <console type='pty'>
      <target port='0'/>
    </console>
  </devices>
</domain>

Crearemos la máquina virtual con el siguiente comando y el archivo debian8.xml

$ sudo virsh create debian8.xml

Podemos comprobar si está funcionando correctamente con el comando siguiente.

$ sudo virsh list
 Id    Name                           State
----------------------------------------------------
 3     debian8                       running

En el archivo hemos definido dos maneras de acceder al la máquina virtual para hacer la instalación, mediante un cliente VNC como vinagre y por consola.

Alternativamente podemos hacer los siguiente.

# mkdir -p /media/kvm/images

# virt-install \
--name template \
--ram 4096 \
--disk path=/media/kvm/images/template.img,size=30 \
--vcpus 2 \
--os-type linux \
--os-variant debianwheezy \
--network bridge=br0 \
--graphics none \
--console pty,target_type=serial \
--location 'http://ftp.jaist.ac.jp/pub/Linux/debian/dists/jessie/main/installer-amd64/' \
--extra-args 'console=ttyS0,115200n8 serial'
Starting install...# installation starts


# En la ventana inicial pulsar "e"

 +----------------------------------------------------------------------------+
 |*Debian GNU/Linux                                                           |
 | Advanced options for Debian GNU/Linux                                      |
 |                                                                            |
 |                                                                            |
 |                                                                            |
 |                                                                            |
 |                                                                            |
 |                                                                            |
 |                                                                            |
 |                                                                            |
 |                                                                            |
 |                                                                            |
 +----------------------------------------------------------------------------+

      Use the ^ and v keys to select which entry is highlighted.
      Press enter to boot the selected OS, `e' to edit the commands
      before booting or `c' for a command-line.

# Añadir consola virtual y pulsar  "Ctrl + x" para continuar.

 +---------------------------------------------------------------------------------------+
 |          search --no-floppy --fs-uuid --set=root  82c9915f-4b67-46cc-ac63-c6dd4d7662d1|
 |                                                                                       |
 |        else                                                                           |
 |          search --no-floppy --fs-uuid --set=root 82c9915f-4b67-46cc-ac63-c6dd4d7662d1 |
 |                                                                                       |
 |        fi                                                                             |
 |        echo        'Loading Linux 3.16.0-4-amd64 ...'                                 |
 |        linux        /vmlinuz-3.16.0-4-amd64 root=/dev/mapper/debian--vg-root ro quiet\|
 |                     console=ttyS0,115200n8                                            |
 |        echo        'Loading initial ramdisk ...'                                      |
 |        initrd        /initrd.img-3.16.0-4-amd64                                       |
 |                                                                                       |
 +---------------------------------------------------------------------------------------+

      Minimum Emacs-like screen editing is supported. TAB lists
      completions. Press Ctrl-x or F10 to boot, Ctrl-c or F2 for
      a command-line or ESC to discard edits and return to the GRUB menu.
  Booting a command list

# Después de arrancar habilitar el servicio como sigue.

# systemctl enable getty@ttyS0

Created symlink from /etc/systemd/system/getty.target.wants/getty@ttyS0.service to /lib/systemd/system/getty@.service.
# Instalación terminada

Haciendo un dumpxml tras esto obtenemos.

$ sudo virsh dumpxml template template.xml
<domain type='kvm' id='2'>
  <name>template</name>
  <uuid>ff93fe12-eb9b-446d-842a-8be2d63d507d</uuid>
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>4194304</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <resource>
    <partition>/machine</partition>
  </resource>
  <os>
    <type arch='x86_64' machine='pc-i440fx-2.1'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <cpu mode='custom' match='exact'>
    <model fallback='allow'>Opteron_G3</model>
  </cpu>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/media/kvm/images/template.img'/>
      <backingStore/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <alias name='usb0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <alias name='usb0'/>
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='on'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci2'>
      <alias name='usb0'/>
      <master startport='2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x1'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci3'>
      <alias name='usb0'/>
      <master startport='4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'>
      <alias name='pci.0'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:57:d6:2f'/>
      <source bridge='br0'/>
      <target dev='vnet0'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/1'/>
      <target type='isa-serial' port='0'/>
      <alias name='serial0'/>
    </serial>
    <console type='pty' tty='/dev/pts/1'>
      <source path='/dev/pts/1'/>
      <target type='serial' port='0'/>
      <alias name='serial0'/>
    </console>
    <input type='tablet' bus='usb'>
      <alias name='input0'/>
    </input>
    <memballoon model='virtio'>
      <alias name='balloon0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </memballoon>
  </devices>
</domain>

Ahora podemos acceder por consola mediante el siguiente comando:

sudo virsh console template

Para salir de la consola con un teclado español pulsaremos Ctrl+5

Si queremos montar la imagen .img para poder acceder por ssh con root podemos hacer esto.

sudo mount -o loop,offset=1048576 /media/kvm/images/template.img /media/HDD-1T/

Por ejemplo, podemos editar el archivo /etc/ssh/sshd_config modificando la línea de PermitRootLogin para acceder por ssh con el usuario root.

PermitRootLogin yes

Acceso a la MV mediante vinagre

Es posible añadir dentro de la siguiente línea para poder acceder por VNC a la máquina virtual, en el ejemplo llamaremos a la nueva plantilla templateVNC.xml.

<graphics type='vnc' port='-1' autoport="yes" listen='0.0.0.0'/>

Debemos actuar sobre la máquina para que recupere la configuración.

sudo virsh destroy template
sudo virsh shutdown template
sudo virsh undefine template
sudo virsh define templateVNC.xml
sudo virsh start template

Una vez arrancado el sistema con esto, debemos ver en qué puerto escucha el servidor VNC, para ello ejecutamos este comando.

$ sudo lsof -i -P | grep -i "libvirt"
qemu-syst 1326 libvirt-qemu   16u  IPv4  16266      0t0  TCP *:5900 (LISTEN)

Vemos que es el puerto 5900, configuramos la IP del huesped y el puerto indicado en vinagre y accedemos. Allí podremos configurar debian8 como lo haríamos desde un CD o un USB si tomamos la primera opción de instalación.

Cómo usar LVM junto con KVM

Pendiente.