Virtualización con KVM

De WikiSalud
Revisión a fecha de 14:11 16 mayo 2016; Alortiz (Discusión | contribuciones)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar

Contenido

Resumen

Instalación, configuración e introducción a KVM como servidor de virtualización en Debian Jessie

Introducción

KVM puede presentarse como una alternativa a la virtualización por Xen. Xen tiene algunos inconvenientes al cargar drivers privativos para tarjetas de vídeos (Algo por lo que no lo culpamos), y como alternativa, KVM permite virtualizar en un equipo de escritorio usando de forma más eficiente los recursos del sistema que Virtualbox, que sería su competidor directo en ese rubro.

En Debian, y en la mayoría de distribuciones, se recomienda el uso de KVM mediante [libvirt] (Que dicho sea de paso también puede ser usado para administrar otros hypervisores). Los comandos de esta guía se refieren la forma en que libvirt abstrae el uso de KVM, no tratamos la forma de usar a este de forma directa.

Guía de configuración

Instalación

Revisar la disponibilidad de las extensiones de virtualización por hardware en el microprocesador, pero que yo recuerde siempre es posible usarlo de forma más limitada sin ella:

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

Instalar los paquetes

aptitude install qemu-kvm libvirt-bin virtinst spice-client-gtk

Para cargar el módulo e iniciar los servicios libvirtd, lo más saludable es reiniciar el equipo.

La configuración de red es tal como se hace en Ajustes de red del artículo de Xen:

/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto xenbr0
iface xenbr0 inet static
	bridge_ports eth0 
	bridge_stp no
	address	192.168.2.20
	netmask 255.255.255.224
	gateway 192.168.2.1

Será necesario reiniciar el equipo en este momento. Debian no suele manejar bien este cambio en la configuración de red.

Revisando configuración

La interfaz bridge debe estar registrada en libvirt

virsh iface-list
 Name                 State      MAC Address
---------------------------------------------------
 lo                   active     00:00:00:00:00:00
 xenbr0               active     08:2e:5f:16:91:e0

La interfaz física a la que apunta la interfaz bridge no tiene configuración de red, además tiene configurado master xenbr0 para adherirse a la interfaz bridge

ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master xenbr0 state UP group default qlen 1000
    link/ether 08:2e:5f:16:91:e0 brd ff:ff:ff:ff:ff:ff

No importa como este acompañada la interfaz puente, pero en la columna interfaces es necesario que aparezca la interfaz física sobre la que se supone que hemos configurado puente

brctl show
bridge name	bridge id		STP enabled	interfaces
virbr0		8000.f04da23e7c44	yes		em1
							vnet0


Otras posibilidades

Es posible que un usuario no-root use KVM para virtualizar equipos, basta con agregarlo al grupo libvirt

usermod -G libvirt

Por otra parte, estará limitado uso de imágenes de disco en lugar de volúmenes lógicos, al menos de forma independiente.

Administración

Creando la infraestructura

Una de las tantas posibilidades de KVM es la de crear pool de almacenamiento. Tiene opciones bastante avanzadas, pero una de las formas más sencillas consiste en crear un pool como interfaz para un volumen lógico:

El comando va de la siguiente forma:

virsh pool-define-as <<nombre del pool>> <<tipo de pool>> <<ubicación del destino>>

Así por ejemplo

virsh pool-define-as virtual logical /dev/virtual/

Lo mejor será que el pool inicie de inmediato (Condición para poder usarlo) y que arranque con el sistema:

virsh pool-start virtual
virsh pool-autostart virtual

Note que el uso de almacenamiento basado en volúmenes lógicos impide el uso de instantáneas. (Porque las instantáneas en este caso dependen propiamente de la

La otra opción más que interesante es la de crear redes privadas a para configurar como interfaces en los equipos virtualizados. Lo que es una opción muy llamativa cuando se necesita hacer pruebas con necesidades de red específicas: Servicios con capacidades de autodescubrimiento, análisis forense de malware, etc.

La redes deben definirse primero en un fichero .xml.

dmz.xml
<network>
        <name>dmz</name>
</network>

Luego deben darse de alta en el sistema, iniciarlas y configurarlas para que inicien cada vez con el sistema:

virsh net-define dmz.xml 
virsh net-autostart dmz
virsh net-start dmz

Creación de host virtuales

Instalar un equipo necesita en su forma más básica de un comando como el siguiente (Que a primera vista puede parecer bastante extenso, entre otras cosas porque lo es). La mejor opción es siempre crear de forma explícita.

Los siguientes ejemplos pueden tornarse un poco repetitivos, supongo que es bueno documentar lo obvio. Para seguir revisando el patrón con más ejemplos, puede revisar Installing Virtual Machines with virt-install, plus copy pastable distro install one-liners

Host Debian Wheezy

Considere la definición para el host virtual:

Jekyll
Sistema operativo Debian Wheezy
CPU Se reduce su uso a un hilo de procesamiento
RAM 512 MB de memoria RAM
Medio de instalación Usamos una instalación desde un repositorio en red, lo cual permite configurar argumentos en la forma en que el equipo arranca
Almacenamiento Disco duro de 15GB que se basa en el pool virtual, con lo que se creará un volumen lógico de forma automática. Se configura threads como [modo IO]
Red Configura una interfaz de red en el sistema, basada en una interfaz puente a xenbr0 del servidor de virtualización
Gráficos El host no tendrá capacidad de vídeo (Básicamente, porque no lo necesita)
Otros puntos a tomar en cuenta Las opciones en --extra le permiten configurar una consola a la que se podrá tener acceso mediante el comando virsh console <<dominio>>

La opción --autostart configura que el host arranque cuando el sistema lo haga

El comando queda de la siguiente forma:

virt-install -n jekyll --ram 512 --vcpu=1 --os-variant=debianwheezy 
--location=http://debian.salud.gob.sv/debian/dists/oldstable/main/installer-amd64/       
--disk cache=none,pool=virtual,size=15,io=threads 
--network bridge=xenbr0 
--nographics 
--extra-args='console=ttyS0,115200n8' --autostart

Considere la definición para el host virtual:

Firewall
Sistema operativo Debian Jessie (Note que se usa la configuración de Wheezy en el comando)
CPU Dos hilos de ejecución del servidor de virtualización son accesibles desde el host virtual.
RAM 2 GB de memoria RAM
Medio de instalación Usamos una instalación desde un repositorio en red, lo cual permite configurar argumentos en la forma en que el equipo arranca
Almacenamiento Disco duro de 15GB que se basa en el pool virtual, con lo que se creará un volumen lógico de forma automática. Se configura threads como [modo IO]
Red Configura una interfaz de red en el sistema, basada en una interfaz puente a xenbr0 del servidor de virtualización.

Configura dos interfaces más basadas en redes virtuales: lan y dmz.

Gráficos El host no tendrá capacidad de vídeo (Básicamente, porque no lo necesita)
Otros puntos a tomar en cuenta Las opciones en --extra le permiten configurar una consola a la que se podrá tener acceso mediante el comando virsh console <<dominio>>

La opción --autostart configura que el host arranque cuando el sistema lo haga

El comando queda de la siguiente forma:

virt-install -n firewall --ram 2048 --vcpu=2 --os-variant=debianwheezy 
--location=http://debian.salud.gob.sv/debian/dists/oldstable/main/installer-amd64/ 
--disk cache=none,pool=virtual,size=15,io=threads 
--network bridge=xenbr0 --network network=lan --network network=dmz 
--nographics --extra-args='console=ttyS0,115200n8' --autostart

Host CentOS 7

Considere la definición para el host virtual:

correo
Sistema operativo CentOS 7
CPU Se reduce su uso a un hilo de procesamiento
RAM 2 GB de memoria RAM
Medio de instalación Usamos una instalación desde un repositorio http, lo cual permite configurar argumentos en la forma en que el equipo arranca. Si es posible, que se encuentre en el mismo servidor de virtualización
Almacenamiento Disco duro de 20 GB que se crea el directorio de imágenes por defecto en /var/lib/libvirt/images/, con lo que se creará una imagen de forma automática. Se configura threads como [modo IO]
Red Configura una interfaz de red en el sistema, basada en una interfaz puente a xenbr0 del servidor de virtualización
Gráficos El host no tendrá capacidad de vídeo.
Otros puntos a tomar en cuenta Las opciones en --extra le permiten configurar una consola a la que se podrá tener acceso mediante el comando virsh console <<dominio>>

La opción --autostart configura que el host arranque cuando el sistema lo haga

La opcion ks=file:/patada-ks.cfg se usa en conjunto con --initrd-inject=/root/patada-ks.cfg para poder automatizar la creación del host, lo cual es necesario para solventar un problema en la instalación de CentOS 7 (Acá una explicación al respecto). Además, la instalación desde consola no es muy amigable.

El comando queda de la siguiente forma:

virt-install -n correo --ram 2048 --vcpu=1 --os-variant=rhel7 
--location=http://192.168.2.20 
--disk cache=none,io=threads,path=/var/lib/libvirt/images/correo.qcow2,size=20 
--network bridge=xenbr0 
--nographics 
--initrd-inject=/root/patada-ks.cfg 
--extra-args='ks=file:/patada-ks.cfg text console=tty0 console=hvc0,115200n8' --autostart

De esta forma, el sistema queda instalado en menos de 15 minutos dependiendo más bien del origen de la instalación

El fichero patada-ks.cfg queda de la siguiente forma:

# La instalación ocurre en modo texto
text

# No configurar en modo alguno al servidor X
skipx

# Instalar y no actualizar
install

# Medio de instalación: (Es totalmente necesario que sea el mismo que el especificado en el comando de virt-install)
url --url=http://10.10.20.102/

# Lenguaje
lang es_SV.UTF-8

# Teclado
keyboard --vckeymap=la-latin1 --xlayouts='latam'

# Configuración de Red
network --device=eth0 --bootproto=static --ip=10.10.20.104 --gateway=10.10.20.1 --nameserver=10.10.20.20 --netmask=255.255.255.0 --ipv6=auto --activate --hostname correo

# Configuración de autenticación. Este es el método de cifrado más seguro disponible
auth --enableshadow --passalgo=sha512

# Password de root
# Es posible cifrar la contraseña, para lo cual habría que remitirse a la forma de hacerlo en una fuente adicional
rootpw p4sw00rd

# Creación de usuario adicional
user --name=mafi --password=p4sw00rd --gecos="Mafi"

# timezone
timezone America/El_Salvador --isUtc

# bootloader
bootloader --location=mbr

# Limpiar el MBR MBR (Master Boot Record)
zerombr

# El agente de configuración no correo en el primer arranque
firstboot --disable

# Reiniciar el huésped una vez instalado
reboot

# Nivel de logging
logging --level=info

# Remover todas las particiones existentes en el medio de instalación elegido
clearpart --all --initlabel
 
# Crea las particiones en el sistema: Un /boot de al menos 512 MB como se recomienda en https://wiki.centos.org/Manuals/ReleaseNotes/CentOS7/#head-281c090cc4fbc6bb5c7d4cd82a266fce807eee7c
# Usamos xfs para la partición raíz que es única, el tamaño se ajusta automáticamente a todo el disponible
part /boot --asprimary --fstype="ext3" --size=1000
part / --fstype="xfs" --grow --size=1
part swap --recommended
 
# Instalación de paquetes
%packages
@core
%end

Host Windows 7

Considere la siguiente definición para un host Windows 7:

cliente_windows
Sistema operativo Windows 7
CPU Usamos dos hilos de procesamiento del servidor actual.
RAM 1.5 Gb de memoria RAM
Medio de instalación DVD de instalación
Almacenamiento Disco duro de 25GB basada en una imagen qcow2, que ofrece la capacidad de tomar instantáneas del sistema. Se configura threads modo IO
Red Configura una interfaz de red en el sistema, basada en una red virtual llamada lan
Gráficos El host usará un sistema gráfico basado en [spice], una mejor opción a VNC entre otras cosas porque ofrece redimensionado automático (Una vez se instale el driver en el host virtualizado, eso sí) y eso es la onda.
Otros puntos a tomar en cuenta Ninguno exceptuando el hecho de que es un sistema windows.

El comando queda de la siguiente forma:

virt-install -n cliente_windows --ram 1536 --vcpu=2 --os-variant=win7 
--cdrom /home/alortiz/Documentos/Repos/win.iso 
--disk cache=none,path=/home/images/cliente_windows.qcow2,format=qcow2,size=25 
--network network=lan 
--graphics spice,listen=0.0.0.0

Importación/Recreación de host virtuales

Cuando se cuenta con una imagen o volumen lógico que tiene ya instalado un sistema, es posible volverlo a declarar en el sistema

Para recuperar el host virtual firewall habiendo conservado el volumen lógico /dev/virtual/firewall es tan sencillo como obviar la fuente de instalación usando --import y usar la opción --console para activar una consola accesible desde el comando virsh console firewall

virt-install -n firewall --ram 1536 --vcpu=2 --os-variant=debianwheezy 
--import 
--disk /dev/virtual/firewall 
--network bridge=xenbr0 --network network=lan --network network=dmz 
--nographics --console pty,target_type=serial --autostart

Administración de interfaces de red

Lista las interfaces asociadas con un host virtual wheezy-xfce

virsh domiflist wheezy-xfce

Agrega una interfaz basada en la red virtual lan al host virtual wheezy-xfce

virsh attach-interface --config wheezy-xfce --type network --source lan --persistent

Elimina la interfaz con MAC 52:54:00:06:10:dc que se encuentra asociada al host virtual wheezy-xfce, que pude encontrarse con el comando domiflist

virsh help detach-interface wheezy-xfce bridge --mac 52:54:00:06:10:dc --persistent

Administración de instantáneas

Lista las instantáneas asociadas al host virtual cliente_windows

virsh snapshot-list cliente_controlador_windows

Crea una instantánea en el host virtual cliente_windows llamada inicio

virsh snapshot-create-as cliente_windows --name inicio --description "Instalado spice-vdagent y optimizado el entorno grafico"

Revierte la imagen del sistema al estado de la instantánea inicio

virsh snapshot-revert --snapshotname inicio cliente_windows

Borra la instantánea en dpkg en el host virtual cliente_windows

virsh snapshot-delete --snapshotname dpkg cliente_windows

Fuentes

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas