lunes, 3 de noviembre de 2014

Creación de maquinas virtuales XEN usando LVM (Volúmenes Lógicos)

Pasos para montar y probar un servicio
Este articulo esta basado en un caso real, en el cual se implementó un contenedor de maquinas virtuales XEN usando LVM.

Datos Iniciales

*Equipo fisico
160 Disco duro
 2   Ram


*Instalar la versión de debian estable del momento
debian-x.x.x-amd64-i386-netinst.iso

Nombre del equipo:  nombre_server
Nombre del usuario: soporte
Password: xxxxx
Nombre del usuario root: soporte
Password: xxxxx

Preparando el servidor

Particiones del disco

Primaria /boot ext2   :  256mb
Logica Swap             :      2GB
Logica /           ext4   :     10GB
Logica /var      etx4   :       7GB
Primaria LVM            : 280,7GB (lo quedo)

Como se puede observar hay una partición muy grande en comparación a las demás y es una LVM, esto se debe a que esta servirá como contenedor de todos los volúmenes lógicos que se creen, por ejemplo: maquinas virtuales, particiones, entre otros.

Actualizar
aptitude update

Instalación de paquete principal
aptitude install ssh

*Virtualizar con xen

Instalación
aptitude install xen-linux-system-amd64  xen-tools

xen-linux-system-3.2.0-4-amd64 ------> Varia segun el kernel que tengas SO

Para Debian jessie deben estar instalado los siguientes paquetes:

grub-xen-bin grub-xen-host libxen-4.4 libxenstore3.0 xen-hypervisor-4.4-amd64 xen-linux-system-3.16.0-4-amd64 xen-system-amd64 xen-utils-4.4 xen-utils-common xenstore-utils xen-tools

También se instalará fail2ban
aptitude install fail2ban

Se explicara su utilidad mas adelante

*Un briege en la interfaz de red
Una vez instalados los paquetes, se debe configurar la interfaz de red para que actué como puente (bridge), de la siguiente manera:

root@plataforma-prueba:/etc/xen# nano /etc/network/interfaces

Se observará algo como esto:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

Modifica y comenta estas dos líneas:

auto eth0
iface eth0 inet dhcp

# The primary network interface


#iface eth0 inet static

#        address 10.16.106.136
#        netmask 255.255.255.128
#        network 10.16.1.0
#        gateway 10.16.1.1
#        dns-nameservers 200.44.32.12

# This is an autoconfigured IPv6 interface

iface eth1 inet6 auto


auto br0

iface br0 inet static
       address 192.168.1.1
       netmask 255.255.255.0
       network 192.168.1.0
       broadcast 192.168.1.255
       bridge_ports none


Explicando el escenario se adjunta imagen.
Eth0: Puede contener una dirección IP pública (estática o dinámica). Ej.: 200.11.10.25
Br0: Nos ayuda a tener una red privada dentro del contenedor y así es posible asignar direcciones IP a las maquinas virtuales como por ejemplo: 192.168.1.16.
IPTable: Gracias a esto es posible hacer el reenvío de trafico que entra por eth0 y luego es enviado a cualquiera de las maquinas virtuales.
Eth0_V: Son interfaces de red virtuales que se crean al momento de hacer la maquina virtual.
MV1, MV2 y MV3: Son las maquinas virtuales.


*Un cortafuego con iptable 
Para qué IPTable?
Como se mencionó anteriormente este servirá para hacer el reenvío de trafico hacia las maquinas virtuales, primero se debe coloca un “1” al archivo ip_forward que está en la ruta /proc/sys/ipv4/net/ip_forward para que el contenedor sea capaz de hacer reenvío de trafico y por medio de reglas de PREROUTING el trafico se envía a cada maquina virtual. A continuación se presentará un pequeño ejemplo:

Se debe crear el script de IPTable y se guarda en /root/nombre_que_quieran.sh
En este caso lo llamare cortafuego.sh

root@plataforma-prueba:/etc/xen# nano /root/cortafuego.sh

Luego agrega las siguientes lineas:


#!/bin/sh
# Creado por personal de Plataforma

# variables globales

ETH="eth0"

# se blanquean reglas de iptables

iptables -t nat -X
iptables -t nat -F
iptables -t nat -Z
iptables -F
iptables -Z

# se habilita el reenvio de paquetes

echo "1" > /proc/sys/net/ipv4/ip_forward

# se activa el modulo para funcion de 'nateo'

/sbin/modprobe iptable_nat

# se 'natea'

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o $ETH -j MASQUERADE

## mv1 monitoreo zabbix ##

## basada en paradigma de lvm
## Admnistrador: personal de Plataforma
iptables -t nat -A PREROUTING -p tcp -i $ETH -d 192.168.1.101 --dport 22101 -j DNAT --to 192.168.1.101:22
iptables -t nat -A PREROUTING -i $ETH -p tcp --dport 22101 -j DNAT --to-destination 192.168.1.101:22

## Puertos para servicio de correo electrónico

iptables -t nat -A PREROUTING -p tcp -i $ETH -d 192.168.1.101 --dport 25 -j DNAT --to 192.168.1.101:25
iptables -t nat -A PREROUTING -i $ETH -p tcp --dport 25 -j DNAT --to-destination 192.168.1.101:25

#########


## mv2 nombre_maquina - descripcion_del_servicio ##

## basada en paradigma de lvm
## Admnistrador: personal de Plataforma



#####


## se reinicia el bloqueador de intentos de fuerza bruta 'fail2ban'

/etc/init.d/fail2ban restart


IMPORTANTE: Luego que guardamos el archivo corremos el script cortafuego.sh

sh /root/cortafuego.sh

Al principio dije que explicaría porque instalar fail2ban, como se puede observar se está usando en IPTable, su función es una sencilla manera de protegernos de ataques a fuerza bruta

Probando XEN

Para comprobar que el contenedor de maquinas virtuales xen (dum0) esta funcionando bien, se corre el siguiente comando.

root@plataforma-prueba:/etc/xen# xm list

La respuesta esperada es la siguiente:
Name ID Mem VCPUs State Time(s)
Domain-0 0 6145 8 r----- 28365.3

Sí sale un error como este

root@server-soporte:/etc/xen# xm list

WARING! Can't find hypervisor information in sysfs!

Error: Unable to connect to xend: No such file or directory. Is xend running?

Esto se debe a que wheeze utiliza grub2 y los valores de inicio están equivocados para xen, para corregir este error hacemos lo siguiente:

#mv -i /etc/grub.d/10_linux /etc/grub.d/50_linux
#update-grub2

Luego reinicias el contenedor y comprobamos otra vez
root@plataforma-prueba:/etc/xen# init 6

Luego
root@plataforma-prueba:/etc/xen# xm list

Name ID Mem VCPUs State Time(s)

Domain-0 0 6145 8 r----- 28365.3

¡Todo esta funcionado bien!

Creación de un grupo de volúmenes

Ahora es momento de crear un grupo de volúmenes, quien contendrá todos los volúmenes lógicos que se creen. La siguiente imagen puede aclarar un poco la idea:

Explicando el escenario se adjunta imagen.
  • El área en azul representa el LVM que se creo al principio de la instalación del sistema operativo.
  • El área en gris representa el grupo de volumen, este es quien contendrá a los volúmenes lógicos como ya se mencionó anteriormente. Para este caso lo llamaremos vg0.
  • Las áreas verdes representan a cada volumen lógico, que pudieran ser maquinas virtuales, particiones de maquinas virtuales, discos, etc.
Para crear el grupo de volúmenes ejecuta los siguientes comandos:

root@plataforma-prueba:/etc/xen# fdisk -l

Con esto vemos cual es la partición que se dejo para LVM

Disk /dev/sda: 160.0 GB, 160041885696 bytes

255 heads, 63 sectors/track, 19457 cylinders, 312581808 sectores en total

Units = sectores of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Identificador del disco: 0x000ca6be



Disposit. Inicio    Comienzo      Fin         Bloques       Id        Sistema

/dev/sda1             2048         499711       248832        83       Linux

/dev/sda2          501758       39172095    19335169      5        Extendida

/dev/sda3   *    39172096    312580095   136704000    8e       Linux LVM

/dev/sda5          501760      4405247       1951744       82       Linux swap / Solaris

/dev/sda6         4407296     23937023      9764864       83      Linux

/dev/sda7        23939072    39172095      7616512       83      Linux


La que posee el asterisco es la que se dejo para LVM, para este caso es /dev/sda3.

Antes de crear un volumen se debe instalar el siguiente paquete.

root@plataforma-prueba:/etc/xen# aptitude install lvm2

Luego se procede a crear un volumen físico, que pudiera ser un disco duro real o un arreglo RAID. Para ello ejecutamos el siguiente comando:

root@plataforma-prueba:/etc/xen# pvcreate /dev/sda3

Writing physical volume data to disk "/dev/sda3"

Physical volume "/dev/sda3" successfully created


Sí todo a salido bien podemos continuar. Ahora vamos a crear el grupo de volúmenes vg0, para ello ejecuta el siguiente comando:

root@plataforma-prueba:/etc/xen# vgcreate -s 32M vg0 /dev/sda3
Volume group "vg0" successfully created

El parámetro -s se usa para insertar extensiones físicas que pudieran ser 4M, 8M, 16M o 32M. Esto quiere decir lo siguiente:

-s = 4M —> vg0 como máximo va ser de 256Gb.
-s = 8M —–> vg0 como máximo va ser de 512Gb.
-s = 16M —–> vg0 como máximo va ser de 1Tb.
-s = 32M —–> vg0 como máximo va ser de 2Tb.

Crear nuestra primera maquina virtual usando xen-tools y LVM

Primero debemos editar el archivo de xen-tools que se encuentra en /etc/xen-tools/xen-tools.conf

root@plataforma-prueba:/etc/xen# nano /etc/xen-tools/xen-tools.conf

Para este caso editaremos las siguientes lineas:

lvm = vg0
install-method = debootstrap
size   = 20Gb      # Disk image size.
memory = 1Gb    # Memory size
swap   = 512Mb    # Swap size
# noswap = 1      # Don't use swap at all for the new system.
fs     = ext4     # use the EXT3 filesystem for the disk image.
dist   = `xt-guess-suite-and-mirror --suite` # Default distribution to install.
image  = sparse   # Specify sparse vs. full disk images.
gateway    = 192.168.1.1
netmask    = 255.255.255.0
broadcast  = 192.168.1.255
nameserver = 200.44.32.12
bridge = br0
passwd = 1
accounts = 1
kernel = /boot/vmlinuz-`uname -r`
initrd = /boot/initrd.img-`uname -r`
mirror = `xt-guess-suite-and-mirror --mirror`
ext3_options     = noatime,nodiratime,errors=remount-ro
ext2_options     = noatime,nodiratime,errors=remount-ro
xfs_options      = defaults
reiserfs_options = defaults
btrfs_options    = defaults
boot = 1
output    = /etc/xen
extension = .cfg
Mi Configuración quedo asi: 

 lvm = vg0
 install-method = debootstrap
 size   = 20Gb      # Disk image size
 memory = 1Gb    # Memory size
 swap   = 512Mb    # Swap size
 # noswap = 1      # Don't use swap at all for the new system.
 fs     = ext4     # use the EXT3 filesystem for the disk image.
 dist   = `xt-guess-suite-and-mirror --suite` # Default distribution to install.
 image  = sparse   # Specify sparse vs. full disk images.
 gateway    = 192.168.1.1           #IMPORTANTE COLOCARLO
 netmask    = 255.255.255.0       #IMPORTANTE COLOCARLO
 broadcast  = 192.168.1.255       #IMPORTANTE COLOCARLO
 nameserver = 200.44.32.12
 bridge = br0          #PUEDE SER EL NOMBRE DE TU PREFERENCIA YO COLOQUE br0
 passwd = 1
 accounts = 1
 kernel = /boot/vmlinuz-`uname -r`
 initrd = /boot/initrd.img-`uname -r`
 mirror = `xt-guess-suite-and-mirror --mirror`
 ext3_options     = noatime,nodiratime,errors=remount-ro
 ext2_options     = noatime,nodiratime,errors=remount-ro
 xfs_options      = defaults
 reiserfs_options = defaults
 btrfs_options    = defaults
 boot = 1
 output     = /etc/xen
 extension = .cfg


Ya es hora de crear nuestra primera maquina virtual, para ello ejecutamos el siguiente comando:

root@plataforma-prueba:/etc/xen# xen-create-image --force --hostname=nombre_mv --lvm=vg0 --ip=192.168.1.101

root@plataforma-prueba:/etc/xen# xen-create-image --force --hostname=monitoreo --lvm=vg0 --ip=192.168.1.101
  • Hostaname es el nombre de la maquina virtual.
  • Lvm es para especificar el grupo de volúmenes que se va a utilizar y esto especifica que la maquina virtual será creada bajo el paradigma de LVM.
  • Ip es la dirección ip que le asignaremos a la maquinas virtual.
También pueden agregar otros parámetros para la creación de la maquina virtual, como por ejemplo:

–fs      Especifica el sistema de ficheros a utilizar, en nuestro caso ext3

–image      Especifica como crear las imagenes, si al completo full o en parte de la particion sparse

–kernel      La dirección del kernel de domU que creamos en los primeros pasos

–memory     La memoria de que va a disponer la maquina

–passwd      Que solicite el password de root para la maquina en el momento de creación

–size        Tamaño del disco

–swap       Tamaño de la swap

–copy        Instala la nueva imagen copiada de otro directorio

–dist         Especifica la distribución a instalar (nosotros, sarge)

–debootstrap Para utilizar debootstrap si usamos  –dist.

–tar         Obtiene las imagenes de un archivo previamente empaquetado

–dhcp      obtiene la ip por dhcp

–gateway   define el gateway

–netmask   define la mascara de red

–copy copia la imagen de un directorio

Luego hay que esperar que el sistema cree nuestra primera maquina virtual. Al terminar el proceso nos pedirá la clave de root que se le asignará a la maquina virtual.




Por último podemos levantarla usando el siguiente comando:

root@plataforma-prueba:/etc/xen# xm create /etc/xen/nombre_mv.cfg -c


En el caso de la que acabamos de crear que se llama monitoreo, seria de la siguiente forma:
root@plataforma-prueba:/etc/xen# xm create /etc/xen/monitoreo.cfg -c



Luego para comprobar que la maquina virtual arrancó sin problemas ejecuta:

root@plataforma-prueba:/etc/xen# xm list

Name                                          ID   Mem   VCPUs      State    Time(s)
Domain-0                                     0    6145       8            r-----    28827.1
nombre_mv                                 10     256       1           -b----      68.9


Para entrar a la maquina virtual creada se coloca el siguiente comando:
root@plataforma-prueba:/etc/xen# xm console maquina_mv

En el caso de la que acabamos de crear que se llama monitoreo, seria de la siguiente forma:
root@plataforma-prueba:/etc/xen# xm console monitoreo

Pedirá el password de root que se colocó al culminar el proceso de creación de la maquina virtual.

Para salir de las maquinas virtual una vez que entro con ese comando, se debe presionar CTRL + 5

Datos importantes

Al crear una maquina virtual se crean dos volúmenes lógicos, uno para la partición raíz / y otro para el swap. (ambos parámetros se especifican en el archivo de configuración de xen-tools, que está en /etc/xen-tools/xen-tools.conf).



Para comprobarlo ejecuta el siguiente comando:

root@debian:/etc/xen#lvdisplay
 --- Logical volume ---
  LV Name                /dev/vg0/maquina_mv-swap
  VG Name                vg0
  LV UUID                ctMlN2-u7Vq-kGCs-wXVE-keYW-f4Rl-fDeSAz
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                256,00 MiB
  Current LE             8
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:16

  --- Logical volume ---
  LV Name                /dev/vg0/maquina_mv-disk
  VG Name                vg0
  LV UUID                sqfHvB-Ky1e-nCie-ZNU9-1tvB-fg3V-lRacdL
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                4,00 GiB
  Current LE             640
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:17
LV Name: es el nombre del volumen lógico de la maquina virtual que pudiese ser / o swap.
VG Name: nos dice el grupo de volumen donde se aloja el volumen logico.
LV Size: nos indica el tamaño del volumen lógico.

Como se puede obsevar ya existen dos volumenes lógicos, el primero representa la swap de la maquina virtual (/dev/vg0/maquina_mv-swap) y el segundo la partición / ( /dev/vg0/maquina_mv-disk). Realmente esta ultima es el disco de la maquina virtual, es equivalente al archivo .img que se genera al crear una maquina virtual xen basada en dd.

Lista de Subcomandos.
xm full list of subcommands:

 console                     Attach to <Domain>'s console.                     
 vncviewer                   Attach to <Domain>'s VNC server.                  
 create                        Create a domain based on <ConfigFile>.            
 new                           Adds a domain to Xend domain management           
 delete                        Remove a domain from Xend domain management.      
 destroy                      Terminate a domain immediately.                   
 domid                        Convert a domain name to domain id.               
 domname                   Convert a domain id to domain name.               
 dump-core                  Dump core for a specific domain.                  
 list                             List information about all/some domains.          
 mem-max                   Set the maximum amount reservation for a domain.   
 mem-set                     Set the current memory usage for a domain.        
 migrate                       Migrate a domain to another machine.              
 pause                         Pause execution of a domain.                      
 reboot                         Reboot a domain.                                  
 rename                       Rename a domain.                                  
 reset                           Reset a domain.                                   
 restore                        Restore a domain from a saved state.              
 resume                       Resume a Xend managed domain                      
 save                           Save a domain state to restore later.             
 shutdown                    Shutdown a domain.                                
 start                           Start a Xend managed domain                       
 suspend                      Suspend a Xend managed domain                     
 sysrq                          Send a sysrq to a domain.                         
 trigger                         Send a trigger to a domain.                       
 top                              Monitor a host and the domains in real time.      
 unpause                      Unpause a paused domain.                          
 uptime                         Print uptime for all/some domains.                
 usb-add                       Add the usb device to FV VM.                      
 usb-del                        Delete the usb device to FV VM.                   
 domstate                     get the state of a domain                         
 vcpu-list                       List the VCPUs for all/some domains.              
 vcpu-pin                       Set which CPUs a VCPU can use.                    
 vcpu-set                       Set the number of active VCPUs for allowed for the domain.
 debug-keys                  Send debug keys to Xen.                           
 dmesg                         Read and/or clear Xend's message buffer.          
 info                              Get information about Xen host.                   
 log                               Print Xend log                                    
 serve                            Proxy Xend XMLRPC over stdio.                     
 sched-credit2                Get/set credit2 scheduler parameters.             
 sched-credit                  Get/set credit scheduler parameters.              
 sched-sedf                    Get/set EDF parameters.                           
 block-attach                  Create a new virtual block device.                
 block-detach                 Destroy a domain's virtual block device.          
 block-list                       List virtual block devices for a domain.          
 block-configure              Change block device configuration                 
 network-attach               Create a new virtual network device.              
 network-detach              Destroy a domain's virtual network device.        
 network-list                    List virtual network interfaces for a domain.     
 network2-attach             Create a new version 2 virtual network device.    
 network2-detach            Destroy a domain's version 2 virtual network device.
 network2-list                  List version 2 virtual network interfaces for a domain.
 vtpm-list                        List virtual TPM devices.                         
 pci-attach                      Insert a new pass-through pci device.             
 pci-detach                     Remove a domain's pass-through pci device.        
 pci-list                           List pass-through pci devices for a domain.       
 pci-list-assignable-devices List all the assignable pci devices               
 scsi-attach                    Attach a new SCSI device.                         
 scsi-detach                   Detach a specified SCSI device.                   
 scsi-list                         List all SCSI devices currently attached.         
 usb-attach                     Attach a new USB physical bus to domain's virtual port.
 usb-detach                    Detach a USB physical bus from domain's virtual port.
 usb-list                          List domain's attachment state of all virtual port .
 usb-list-assignable-devices List all the assignable usb devices               
 usb-hc-create                Create a domain's new virtual USB host controller.
 usb-hc-destroy               Destroy a domain's virtual USB host controller.   
 vnet-list                         List Vnets.                                       
 vnet-create                    Create a vnet from ConfigFile.                    
 vnet-delete                     Delete a Vnet.                                    
 setpolicy                       Set the policy of the system.                     
 labels                            List <type> labels for (active) policy.           
 addlabel                        Add security label to domain.                     
 rmlabel                          Remove a security label from domain.              
 getlabel                         Show security label for domain or resource.       
 dry-run                          Test if a domain can access its resources.        
 resources                      Show info for each labeled resource.              
 dumppolicy                    Print hypervisor ACM state information.           
 resetpolicy                     Set the policy of the system to the default policy.
 getpolicy                        Get the policy of the system.                     
 getenforce                      Returns the current enforcing mode for the Flask XSM module (Enforcing,Permissive)
 setenforce                      Modifies the current enforcing mode for the Flask XSM module
 tmem-list                        List tmem pools.                                  
 tmem-thaw                      Thaw tmem pools.                                  
 tmem-freeze                    Freeze tmem pools.                                
 tmem-destroy                  Destroy tmem pools.                               
 tmem-set                        Change tmem settings.                             
 tmem-shared-auth            De/authenticate shared tmem pool.                 
 cpupool-create                 Create a CPU pool based an ConfigFile.            
 cpupool-new                     Adds a CPU pool to Xend CPU pool management       
 cpupool-start                    Starts a Xend CPU pool                            
 cpupool-list                      List CPU pools on host                            
 cpupool-destroy                Deactivates a CPU pool                            
 cpupool-delete                  Removes a CPU pool from Xend management           
 cpupool-cpu-add                Adds a CPU to a CPU pool                          
 cpupool-cpu-remove           Removes a CPU from a CPU pool                     
 cpupool-migrate                Moves a domain into a CPU pool                    
 shell                                 Launch an interactive shell.                      


Si queremos ver más opciones, consultamos el manual.
# man xen-create-image
Para arrancar nuestro nuevo host, ejecutamos el siguiente comando.
# xm create /etc/xen/nombre.example.com.cfg
Ya podemos acceder a la nueva máquina de la siguiente manera.
# xm console nombre.example.com
Si queremos que la máquina, se arranque automaticamente en el próximo reinicio.
# ln -s /etc/xen/nombre.example.com.cfg /etc/xen/auto

Comandos utiles:
Muestra las máquinas que están ejecutandose
# xm list
Apaga la máquina
# xm shutdown nombre.example.com
Fuerza el apagado de la máquina virtual
# xm destroy nombre.example.com
Muestra todos los comandos disponibles.
# xm help

No hay comentarios:

Publicar un comentario