viernes, 3 de mayo de 2013

Usando Global File System y KVM - GFS2 + KVM

En esta nota vamos a compartir un disco entre 2 hosts a los cuales le vamos a instalar GFS2 para que puedan escribir de manera concurrente. Para realizar esta configuracion vamos a utilizar en una infraestructura virtual basada en KVM (ver nota anterior de KVM) para mas detalle o profundizar conceptos).

Vamos a dar por sentado que tenemos dos maquinas virtuales funcionando

# virsh list
 Id    Name                           State
----------------------------------------------------
 1     vmCentOS1                      running
 2     vmCentOS2                      running

Primero creamos el disco virtual a compartir

qemu-img create -f raw shared.raw 5G
Formatting 'shared.raw', fmt=raw size=5368709120 

Ahora ya creado vamos a presentarlos a ambas VMs
  
Entramos al virsh
# virsh 

Presentamos los devices 

virsh # attach-disk vmCentOS1 /VMs/shared.raw vdb --shareable
Disk attached successfully

virsh # attach-disk vmCentOS2 /VMs/shared.raw vdb --shareable
Disk attached successfully


Verificamos dentro de las VMs si se ve el disco nuevo

[root@vmCentos1 ~]# fdisk -l
...
Disk /dev/vdb: 5368 MB, 5368709120 bytes
16 heads, 63 sectors/track, 10402 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


[root@vmCentos2 ~]# fdisk -l
...
Disk /dev/vdb: 5368 MB, 5368709120 bytes
16 heads, 63 sectors/track, 10402 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Para poder utilizar GFS2 necesitamos instalar los siguientes paquetes, en caso de necesitar mas debido a dependencias yum las seleccionara automaticamente

# yum install lvm2-cluster gfs2-utils

Una vez instalado tendremos que realizar la configuracion del cluster y en especial el fencing, ya que si no esta presente servicio de clvmd no levantara.

El fencing es un mecanismo que se utiliza para aislar a los nodos que no estan respondiendo dentro del cluster, en particular el GFS2/CLVMD cuando detectan una falla en un host, ejecutan el metodo de fencing y detienen las operaciones de entrada/salida hasta que termine la operacion de fencing.
Para hacer fencing vamos a usar fence-virtd, el cual lo instalamos en el host

# yum install fence-virt fence-virtd fence-virtd-libvirt fence-virtd-multicast

En las VMs solo es necesario el paquete fence-virt.
Luego de instalar debemos crear el directorio /etc/cluster y configurar el servicio de fencing
# mkdir /etc/cluster

# fence_virtd -c
Module search path [/usr/lib64/fence-virt]:

Available backends:
    libvirt 0.1
Available listeners:
    multicast 1.1

Listener modules are responsible for accepting requests
from fencing clients.

Listener module [multicast]:

The multicast listener module is designed for use environments
where the guests and hosts may communicate over a network using
multicast.

The multicast address is the address that a client will use to
send fencing requests to fence_virtd.

Multicast IP Address [225.0.0.12]:

Using ipv4 as family.

Multicast IP Port [1229]:

Setting a preferred interface causes fence_virtd to listen only
on that interface.  Normally, it listens on the default network
interface.  In environments where the virtual machines are
using the host machine as a gateway, this *must* be set
(typically to virbr0).
Set to 'none' for no interface.

Interface [none]: virbr0

The key file is the shared key information which is used to
authenticate fencing requests.  The contents of this file must
be distributed to each physical host and virtual machine within
a cluster.

Key File [/etc/cluster/fence_xvm.key]:

Backend modules are responsible for routing requests to
the appropriate hypervisor or management layer.

Backend module [checkpoint]: libvirt

The libvirt backend module is designed for single desktops or
servers.  Do not use in environments where virtual machines
may be migrated between hosts.

Libvirt URI [qemu:///system]:

Configuration complete.

=== Begin Configuration ===
backends {
    libvirt {
        uri = "qemu:///system";
    }

}

listeners {
    multicast {
        interface = "virbr0";
        port = "1229";
        family = "ipv4";
        address = "225.0.0.12";
        key_file = "/etc/cluster/fence_xvm.key";
    }

}

fence_virtd {
    module_path = "/usr/lib64/fence-virt";
    backend = "libvirt";
    listener = "multicast";
}

=== End Configuration ===
Replace /etc/fence_virt.conf with the above [y/N]? y


Ahora creamos la key que usaremos


#  dd if=/dev/urandom of=/etc/cluster/fence_xvm.key bs=4k count=1
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.00238924 s, 1.7 MB/s


Copiamos la key a ambos guests

# scp /etc/cluster/fence_xvm.key root@vmCentOS1:/etc/cluster/fence_xvm.key
# scp /etc/cluster/fence_xvm.key root@vmCentOS2:/etc/cluster/fence_xvm.key

Para validar que la configuracion funciona, corremos desde el host fisico la siguiente linea

# fence_xvm -o list
vmCentOS1            fd58626b-da91-a03f-9610-63cb4a3e0b2e on
vmCentOS2            c986740c-887a-6df1-2b3f-ecbf2d238563 on

Desde la VM, probamos tambien si la configuracion tuvo exito

[root@vmCentos1 ~]# fence_xvm -o list
vmCentOS1            fd58626b-da91-a03f-9610-63cb4a3e0b2e on
vmCentOS2            c986740c-887a-6df1-2b3f-ecbf2d238563 on

Desde la otra VM tambien lo probamos

[root@vmCentos2 ~]# fence_xvm -o list
vmCentOS1            fd58626b-da91-a03f-9610-63cb4a3e0b2e on
vmCentOS2            c986740c-887a-6df1-2b3f-ecbf2d238563 on

Ya aqui estamos en condiciones de poder hacer otro tipo de prueba como el reboot o el apagado de un nodo por medio del fencing

[root@vmCentos1 ~]# fence_xvm -o reboot -H vmCentOS2

Si todo se configuro correctamente, en este momento se debio haber reiniciado el vmCentOS2.
Ahora generaremos un template basico para nuestro cluster

<cluster name="cluster1" config_version="2">
   <cman two_node="1" expected_votes="1"/>
   <clusternodes>
     <clusternode name="vmCentOS1.domain" nodeid="1">
         <fence>
         </fence>
     </clusternode>
     <clusternode name="vmCentOS2.domain." nodeid="2">
         <fence>
         </fence>
     </clusternode>
   </clusternodes>
   <fencedevices>

     <fencedevice agent="fence_xvm" name="virtfence1" key_file="/etc/cluster/fence_xvm.key" multicast_address="225.0.0.12"/>
   </fencedevices>
   <rm>
   </rm>

 </cluster>

Con la configuracion creada podemos levantar y configurar el servicio de cluster 

[root@vmCentos1 cluster]# chkconfig cman on
[root@vmCentos2 cluster]# service cman start
Starting cluster:
   Checking if cluster has been disabled at boot...        [  OK  ]
   Checking Network Manager...                             [  OK  ]
   Global setup...                                         [  OK  ]
   Loading kernel modules...                               [  OK  ]
   Mounting configfs...                                    [  OK  ]
   Starting cman...                                        [  OK  ]
   Waiting for quorum...                                   [  OK  ]
   Starting fenced...                                      [  OK  ]
   Starting dlm_controld...                                [  OK  ]
   Tuning DLM kernel config...                             [  OK  ]
   Starting gfs_controld...                                [  OK  ]
   Unfencing self...                                       [  OK  ]
   Joining fence domain...                                 [  OK  ]



Ahora copiamos el /etc/cluster/cluster.conf al otro nodo del cluster y levamtamos y configuramos el cman igual que en el vmCentOS1

En este momento podemos levantar el servicio de clvmd

[root@vmCentos1 ~]# service clvmd start
Starting clvmd: dlm: Using TCP for communications

Activating VG(s):   2 logical volume(s) in volume group "vg_vmcentos1" now active
  clvmd not running on node vmCentOS2.domain.
[  OK  ]



Corremos el mismo comando desde el nodo 2, en mi caso vmCentOS2 y ya finalmente estamos en condiciones de poder comartir el volumen.

Ahora pasamos a la configuracion de LVM, todos estos pasos son iguales a cuando trabajamos sin cluster, proximamante voy hacer una guia de LVM para Linux aunque es muy similar a lo que es HP-UX, de la cual si tengo una entrada en el blog

Primero creamos el physical volume 
[root@vmCentos1 ~]# pvcreate  /dev/vdb
  Physical volume "/dev/vdb" successfully created


Segundo creamos el volume group

[root@vmCentos1 ~]# vgcreate vgshared /dev/vdb
  Clustered volume group "vgshared" successfully created


Tercero creamos un logical volume

[root@vmCentos1 ~]# lvcreate -L 1024 -n lvol1 vgshared
  Logical volume "lvol1" created


Como ultimo paso nos resta darle formato al volumen, formato que sera gfs2, las opciones del comando son, 

-p tipo de lock, en este caso es un lock distribuido entre los nodos, 
-t  nombre de cluster seguido, el nombre del filesystem separado por :
-j la cantidad de journals a crear, que indica la cantidad de nodos que comparten el filesystem, en este caso configure 5 por un tema de escalabilidad.

[root@vmCentos1 ~]# mkfs.gfs2 -p lock_dlm -t cluster1:fsvgsharedlvol1 -j 5 /dev/vgshared/lvol1
This will destroy any data on /dev/vgshared/lvol1.
It appears to contain: symbolic link to `../dm-2'

Are you sure you want to proceed? [y/n] y

Device:                    /dev/vgshared/lvol1
Blocksize:                 4096
Device Size                1.00 GB (262144 blocks)
Filesystem Size:           1.00 GB (262142 blocks)
Journals:                  5
Resource Groups:           4
Locking Protocol:          "lock_dlm"
Lock Table:                "cluster1:fsvgsharedlvol1"
UUID:                      09053a2a-5a43-3c7d-d46a-919586c612b2


Corremos un vgscan en el nodo2 para importar la configuracion


Agregamos las entradas correspondientes en ambos /etc/fstabs

#
## FSs compartidos gfs2
#

/dev/mapper/vgshared-lvol1    /sharedfs    gfs2   defaults,acl    0 0


creamos el punto de montaje en ambos nodos

# mkdir /sharedfs

Montamos el filesystem, en este paso tendremos tambien que activar el servicio de gfs2 para que cuando reiniciemos las VMs estas monten automaticamente el FS que creamos, esta de mas decir que estas operaciones tambien se deben realizar en ambos nodos

# chkconfig gfs2 on
# mount /sharedfs
 

Verificamos que este montado

[root@vmCentos1 /]# df -k
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/vg_vmcentos1-lv_root
                       9845280   2411808   6933352  26% /
tmpfs                   510208     28744    481464   6% /dev/shm
/dev/vda1               495844     55904    414340  12% /boot
/dev/mapper/vgshared-lvol1
                       1048400    661916    386484  64% /sharedfs

 

Corremos un mount -v para ver el tipo de filesystem

[root@vmCentos1 /]# mount -v
/dev/mapper/vg_vmcentos1-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/vda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
none on /sys/kernel/config type configfs (rw)
/dev/mapper/vgshared-lvol1 on /sharedfs type gfs2 (rw,seclabel,relatime,hostdata=jid=1,acl)


 Como prueba final vamos a escribir en nuestro FS desde los dos nodos, primero vamos a ver el contenido del /sharedfs

[root@vmCentos1 sharedfs]# ls -la
total 8
drwxr-xr-x.  2 root root 3864 May  3 12:13 .
dr-xr-xr-x. 27 root root 4096 May  3 11:51 ..

y

[root@vmCentos2 sharedfs]# ls -al
total 8
drwxr-xr-x.  2 root root 3864 May  3 12:13 .
dr-xr-xr-x. 27 root root 4096 May  3 11:50 ..
[root@vmCentos2 sharedfs]# 


Ahora vamos a escribir unos archivos 

Primero desde el vmCentos1

[root@vmCentos1 sharedfs]# echo hola > hola
 

Luego en el vmCentos2

[root@vmCentos2 sharedfs]# echo mundo > mundo

Verificamos desde ambos nodos

Desde el vmCentos1

[root@vmCentos1 sharedfs]# ls
hola  mundo


y luego desde el vmCentos2




[root@vmCentos2 sharedfs]# ls
hola  mundo



miércoles, 24 de abril de 2013

Usos del comando tar



En muchas ocasiones en las cuales tenemos que copiar contenidos de filesystems, preservando permisos, links archivos ocultos, etc. Justamente podemos utilizar el comando tar para este caso y lo mejor es que podemos hacerlo sin la necesidad de generar un archivo .tar intermedio facilitandonos de esta forma la copia.


Supongamos que queremos copiar toda una estructura de directorios a otro lado, por ejemplo de un filesystem a otro nuevo, solo tendremos que hacer lo siguiente


# cd /source
# tar cf - * | ( cd /target; tar xvfp -)


Tambien podemos usar el comando tar para copiar de un host a otro mediante SSH

# tar cvzf - /foo | ssh@target_host "cat  > /foo.tar.gz

lunes, 15 de abril de 2013

Linux virtualización - KVM

KVM (Kernel-based Virtual Machine), es una solución de virtualización basada en QEMU para la arquitectura x86 que utiliza las extensiones de virtualización de hardware, ya sean AMD-V (svm) o las de Intel-VT (vmx).
Requisitos

Como deciamos en el parrafo anterior, KVM utiliza extensiones de hardware para poder funcionar, con lo cual este sera nuestro único requisito para la instalación. Por lo general cualquier CPU moderno soporta estas características. De todas maneras, para verificar si nuestra CPU esta soportada por KVM  solo tenemos que correr los siguientes comandos

cat /proc/cpuinfo |grep svm (en el caso de tener un micro AMD) o
cat /proc/cpuinfo |grep vmx (en caso de tener Intel)

En caso de no encontrar ninguna extensión de vitrtualización, chequear si son soportadas por el CPU en la pagina del fabricante del micro y en caso afirmativo corroborar en el BIOS que estén activas.

Instalación

La máquina en la que estoy armando este tutorial tiene instalado un CentOS 6.4 64bits, dos procesadores Intel i7 1.2GHz, 8GBs de RAM y LVM con el suficiente espacio libre como para crear nuevos LVs que usaremos para alojar las imágenes ISO y las VMs

yum install kvm python-virtinst libvirt libvirt-python virt-manager \
virt-viewer libguestfs-tools

Creamos un FS de 12GBs para las ISO de instalación

# lvcreate -L 12G vg_pegasus2 -n lvol8
# mkdir /ISOs
# mkfs.ext4 -m 1 /dev/vg_pegasus2/lvol8

Y agregamos al fstab el FS que creamos

/dev/mapper/vg_pegasus2-lvol8 /ISOs                    ext4    defaults        1 2

Montamos el filesystem
# mount /ISOs

Creamos un FS de 80GBs para contener las VMs
# lvcreate -L 80G vg_pegasus2 -n lvol9
# mkdir /VMs
# mkfs.ext4 -m 1 /dev/vg_pegasus2/lvol9

Al igual que en el caso anterior agregamos la entrada al fstab

/dev/mapper/vg_pegasus2-lvol8 /ISOs                    ext4    defaults        1 2

y para chequear que hayamos echo bien el procedimiento montamos el FS

# mount /VMs

Verificamos con df -h

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_pegasus2-lvol1
                      5.0G  439M  4.5G   9% /
tmpfs                 849M  444K  849M   1% /dev/shm
/dev/sda1             485M   73M  388M  16% /boot
/dev/mapper/vg_pegasus2-lvol2
                      194M   47M  137M  26% /home
/dev/mapper/vg_pegasus2-lvol7
                      2.0G   68M  1.9G   4% /opt
/dev/mapper/vg_pegasus2-lvol3
                     1008M   35M  923M   4% /tmp
/dev/mapper/vg_pegasus2-lvol4
                      7.9G  1.8G  5.7G  24% /usr
/dev/mapper/vg_pegasus2-lvol6
                      2.0G   68M  1.9G   4% /usr/local
/dev/mapper/vg_pegasus2-lvol5
                       16G  333M   15G   3% /var
/dev/mapper/vg_pegasus2-lvol8
                       12G  4.4G  7.4G  37% /ISOs
/dev/mapper/vg_pegasus2-lvol9
                       78M  5.6M   72M   8% /VMs


Vemos que los dos últimos FSs son los que creamos, en este caso se ve que copie algunas ISOs al /ISOs

# ls -l /ISOs/
total 4353336
drwx------. 2 root root      16384 Feb 28 04:11 lost+found
-rwxr-xr-x. 1 root root 3729028147 Feb 28 04:33 SL-63-x86_64-2012-08-02-Install-DVD.iso
-rwxr-xr-x. 1 root root  728760320 Feb 28 04:09 SL-63-x86_64-2012-08-24-LiveCD.iso


Ya teniendo el software instalado, las ISOs y el lugar donde ubicaremos las VMs pasamos a la parte de configuración y creado de las VMs

Primeros pasos con KVM
Una vez configurado verificamos con el comando virsh.

El virsh es la interfase que se utiliza para administrar los entornos virtuales este comando nos permite modificar, apagar, prender, sacar snapshots y clonar VMs entre otras cosas. En particular el flag list nos muestra la información acerca de las maquinas virtuales (o dominios).

# virsh -c qemu:///system list
Id Name State
----------------------------------------------------


Una vez revisado que la instalación inicial de KVM fue exitosa procederemos a genera una VM de prueba

virt-install --connect qemu:///system -n vmCentOS1 -r 1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel6 --disk path=/VMs/vmCentOS1-d1.dsk,size=12 -c /VMs/iso/CentOS-6.4-x86_64-bin-DVD1.iso --graphics vnc

Luego de ejecutar este comando nos encontraremos con la pantalla de instalacion de CentOS6, el template de instalacion que se realizara sera por default y se selecionaran los paquetes de server basico.


Ahora finalizada la instalación tendremos que rebootear la VM

Posterior al reboot, bootearemos por primera vez la VM

Luego de realizar la instalacion del CentOS, tendriamos la VM lista para utilizar

# virsh -c qemu:///system list
 Id    Name                           State
----------------------------------------------------
 3     vmCentOS1                      running


Configuracion de consola serie

Para poder entrar por consola de texto al host y evitarnos usar VNC y un entorno gráfico, debemos modificar las opciones de booteo del kernel del guest y habilitar el acceso vía serie, para hacer esto debemos editar el archivo /etc/grub.conf

Dentro de este archivo debemos agregar en la linea

...
kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg_walkure-lvol1 rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=vg_walkure/lvol1 SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet console=ttyS0
...

Para terminar la configuración se debe agregar un manejador de terminal para que atienda en el puerto serie virtual. Para hacer esto tenemos que agregar al /etc/inittab del guest la siguiente entrada
  
...
T0:S12345:respawn:/sbin/agetty ttyS0 115200
...

Para que el sistema tome la configuración realizada al inittab tendremos que recargarla usando el comando initcl

# initctl reload-configuration

Para editar estos archivos desde el host sin entrar al guest podemos hacer uso del comando virt-edit

# virt-edit vmCentOS1 /boot/grub/grub.conf
 
Ahora se esta en condiciones de conectarse a la consola de la VM en modo texto
# virsh -c qemu:///system console 3
Connected to domain vmCentOS1
Escape character is ^]

CentOS release 6.4 (Final)
Kernel 2.6.32-358.el6.x86_64 on an x86_64

vmCentos1 login:
 

o

# virsh -c qemu:///system console vmCentOS1
Connected to domain vmCentOS1
Escape character is ^]

CentOS release 6.4 (Final)
Kernel 2.6.32-358.el6.x86_64 on an x86_64

vmCentos1 login:


Administracion de VMs

Apagado

Podemos apagar una VM desde nuestro host corriendo
# virsh -c qemu:///system shutdown 3
Domain 3 is being shutdown

Este comando baja la VM en forma ordenada, desde la consola podemos observar como se bajan los servicios en la virtual
# virsh -c qemu:///system console 3
Connected to domain vmCentOS1
Escape character is ^]

vmCentos1 login:
CentOS release 6.4 (Final)
Kernel 2.6.32-358.el6.x86_64 on an x86_64

vmCentos1 login: Stopping certmonger: [  OK  ]
Stopping atd: [  OK  ]
Stopping cups: [  OK  ]
Stopping abrt daemon: [  OK  ]
Stopping sshd: [  OK  ]
Shutting down postfix: [  OK  ]
Stopping mcelog
Stopping crond: [  OK  ]
Stopping automount: [  OK  ]
Stopping acpi daemon: [  OK  ]
Stopping HAL daemon: [  OK  ]
Stopping block device availability: Deactivating block devices:
  [SKIP]: unmount of vg_vmcentos1-lv_swap (dm-1) mounted on [SWAP]
  [SKIP]: unmount of vg_vmcentos1-lv_root (dm-0) mounted on /
[  OK  ]
Stopping system message bus: [  OK  ]
Stopping rpcbind: [  OK  ]
Stopping auditd: [  OK  ]
Shutting down system logger: [  OK  ]
Shutting down loopback interface:  [  OK  ]
ip6tables: Flushing firewall rules: [  OK  ]
ip6tables: Setting chains to policy ACCEPT: filter [  OK  ]
ip6tables: Unloading modules: [  OK  ]
iptables: Flushing firewall rules: [  OK  ]
iptables: Setting chains to policy ACCEPT: filter [  OK  ]
iptables: Unloading modules: [  OK  ]
Stopping monitoring for VG vg_vmcentos1:   2 logical volume(s) in volume group "vg_vmcentos1" unmonitored
[  OK  ]
Sending all processes the TERM signal... [  OK  ]
Sending all processes the KILL signal... [  OK  ]
Saving random seed:  [  OK  ]
Syncing hardware clock to system time [  OK  ]
Turning off swap:  [  OK  ]
Turning off quotas:  [  OK  ]
Unmounting pipe file systems:  [  OK  ]
Unmounting file systems:  [  OK  ]
init: Re-executing /sbin/init
Halting system...
Power down.


Podemos verificar el estado de las VMs con el comando virsh -c qemu:///system list --all es importante especificar en este caso el flag --all ya que si lo omitimos no se listara la maquina

# virsh -c qemu:///system list --all
 Id    Name                           State
----------------------------------------------------
 -     vmCentOS1                      shut off


Prendido

Si quisieramos, levantar la maquina que hemos apagado, 

# virsh -c qemu:///system start vmCentOS1

Podemos borrar una VM con corriendo los siguientes comandos

# virsh -c qemu:///system list
 Id    Name                           State
----------------------------------------------------
 3     vmCentOS1                      running


# virsh destroy vmCentOS1
Domain vmCentOS1 destroyed


# virsh -c qemu:///system list
 Id    Name                           State
----------------------------------------------------

# virsh undefine vmCentOS1
Domain vmCentOS1 has been undefined


Clonado

Si la VM esta prendida primero debemos apagarla ya que si no la apagamos al querer clonarla nos dara el siguiente error

#  virt-clone --connect=qemu:///system -o vmCentOS1 -n vmCentOS2 -f /VMs/vmCentOS2.img
ERROR    Domain with devices to clone must be paused or shutoff.

Con lo cual como habiamos dicho debemos apagar la VM primero con el comando

# virsh -c qemu:///system shutdown vmCentOS1Domain vmCentOS1 is being shutdown

Verificamos que la operacion haya sido exitosa

# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     vmCentOS1                      shut off


Para comenzar el clonado corremos 

#  virt-clone --connect=qemu:///system -o vmCentOS1 -n vmCentOS2 -f /VMs/vmCentOS2.img
Cloning vmCentOS1-d1.dsk                                              56% [=================================                          ] 182 MB/s | 6.7 GB     00:29 ETA


La opcion -o indica la maquina origen, la maquina a la cual vamos a clonar, -n especifica el nombre de la nueva VM, -f es el full path al archivo de la nueva VM.

Al cabo de unos minutos la operacion terminara exitosamente con el siguiente mensaje

Clone 'vmCentOS2' created successfully.

Para verificar el estado de ambas maquinas corremos un virsh list --all

# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     vmCentOS1                      shut off
 -     vmCentOS2                      shut off
 

Para evitar problemas de red, nombres e ips duplicadas es conviente bootear la maquina en modo rescue o hacer un loopback device, en este caso como la VM esta creada con LVM vamos a utilizar el primer metodo

# virt-rescue vmCentOS2

Google, Inc.
Serial Graphics Adapter 12/07/11
SGABIOS $Id: sgabios.S 8 2010-04-22 00:03:40Z nlaredo $ (mockbuild@c6b18n1.dev.centos.org) Wed Dec  7 17:04:47 UTC 2011

.....
mdadm: No arrays found in config file or automatically
[    2.190404] device-mapper: uevent: version 1.0.3
[    2.191725] device-mapper: ioctl: 4.23.6-ioctl (2012-07-25) initialised: dm-devel@redhat.com
  Reading all physical volumes.  This may take a while...
  Found volume group "vg_vmcentos1" using metadata type lvm2
  2 logical volume(s) in volume group "vg_vmcentos1" now active

------------------------------------------------------------

Welcome to virt-rescue, the libguestfs rescue shell.

Note: The contents of / are the rescue appliance.
You have to mount the guest's partitions under /sysroot
before you can examine them.

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
><rescue>


Ahora necesitamos saber como esta compuesto el layout de LVM con lo cual corremos el comando lvs

><rescue> lvs
  LV      VG           Attr      LSize Pool Origin Data%  Move Log Cpy%Sync Convert
  lv_root vg_vmcentos1 -wi-a---- 9.54g                                            
  lv_swap vg_vmcentos1 -wi-a---- 1.97g     


Para montar el root FS tenemos que hacer lo siguiente

><rescue> mount /dev/vg_vmcentos1/lv_root /sysroot
[   99.953289] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts:



Una vez montado realizamos las operaciones que necesitamos, en este caso vamos a borrar la configuracion de los devices del host original

><rescue> rm /sysroot/etc/udev/rules.d/70-persistent-net.rules 

Ahora en el proximo booteo la maquina levantara con la interfaz correcta.
Como la VM original estaba configurada con DHCP, no es necesario cambiar la IP.


Modificacion de la VM

Agregado de disco

 Para agregarle un vdisk al dominio virtual primero debemos crear el vdisk. En este caso el vdisk lo armamos con formato raw


# qemu-img create -f raw shared.raw 5G
Formatting 'shared.raw', fmt=raw size=5368709120



Ahora para agregarlo a nuestra VM lo hacemos desde la interface de virsh 


#virsh 
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit


virsh # attach-disk vmCentOS1 /VMs/shared.raw vdb --configure
Disk attached successfully


Desde la VM podemos ver el nuevo disco con el comando fdisk -l

# fdisk -l
...
Disk /dev/vdb: 5368 MB, 5368709120 bytes
16 heads, 63 sectors/track, 10402 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Ahora tenemos el disco listo para usar

Remocion de disco de la VM

Una vez que desmontamos, el filesystem, exportado el VG, en caso de estar usandolo, ya estariamos en condiciones de poder remover el vdisk de la VM.

# virsh detach-disk vmCentOS2 vdb
Disk detached successfully




Configuracion de red

La red por defecto que tendremos una vez instalado el KVM se llama justamente default, para ver la configuracion de esta correremos los sifguientes comandos,

virsh # net-list
Name                 State      Autostart     Persistent
--------------------------------------------------
default              active     yes           yes




De esta forma sabremos que la unica red definida es la default

Para obtener mas informacion acerca de la configuracion de la red lo mejor es correr un net-edit

virsh # net-edit default

Una vez que corremos el comando, nos aparece una pantalla del editor vi

<network>
  <name>default</name>
  <uuid>1cc2cd6d-ffa9-44cd-9c59-d04a455a4c4a</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0' />
  <mac address='52:54:00:4C:C3:89'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254' />
    </dhcp>
  </ip>
</network> 


Ahi podemos ver como esta configurada la red, el virtual switch, el modo en el cual trabaja, tenemos un DHCP y el rango de direcciones IP con el que trabaja

Si quisieramos asociar una IP a una MAC address, tendremos que hacer un net-edit y agregar la siguientes lineas que figuran en negrita

<network>
  <name>default</name>
  <uuid>1cc2cd6d-ffa9-44cd-9c59-d04a455a4c4a</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0' />
  <mac address='52:54:00:4C:C3:89'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254' />
      <host mac='52:54:00:58:26:37' name='vmCentOS1.domain' ip='192.168.122.10' />
      <host mac='52:54:00:1A:37:FC' name='vmCentOS2.domain' ip='192.168.122.11' />

    </dhcp>
  </ip>
</network>

Luego para que el KVM tome la configuracion que establecimos haremos lo siguiente en el guest
# ps -ef |grep dnsmaq |grep -v grep
nobody    2715     1  0 08:41 ?        00:00:00 /usr/sbin/dnsmasq --strict-order --local=// --domain-needed --pid-file=/var/run/libvirt/network/default.pid --conf-file= --except-interface lo --bind-interfaces --listen-address 192.168.122.1 --dhcp-range 192.168.122.2,192.168.122.254 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases --dhcp-lease-max=253 --dhcp-no-override --dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile --addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
 

# kill -HUP 2715

El kill se lo damos al pid del proceso dnsmasq para que este recarge la configuracion. En el cliente hacemos un release de la IP y pediremos otra.
 
Snapshots

Para poder utilizar esta caracteristica el formato de la imagen tiene que ser qcow2, dado que el formato raw no lo soporta. Como las VMs que hemos creado son de tipo raw (que es el default) tendremos que convertirlas a qcow2 para poder utilizar este feature.


# qemu-img convert -O qcow2 vmCentOS1-d1.dsk vmCentOS1-d1.qcow2

Donde -O indica el formato de salida vmCentOS1-d1.dsk es el file original donde reside la VM en formato raw y vmCentOS1-d1.qcow2 es el archivo de salida.
Luego de unos minutos tendremos el nuevo archivo de salida.
# ls -ltr
total 7062000
drwx------. 2 root root       16384 Apr 12 20:07 lost+found
drwxr-xr-x. 2 root root        4096 Apr 15 13:55 iso
-rwxr-xr-x  1 qemu qemu 12884901888 Apr 17 08:08 vmCentOS2.img
-rwxr-xr-x  1 root root 12884901888 Apr 17 10:01 vmCentOS1-d1.dsk
-rw-r--r--  1 qemu qemu  2349793792 Apr 17 13:55 vmCentOS1-d1.qcow2


Paso siguiente sera borrar la definicion del vmCentOS1 e importar el nuevo contenedor.

# virsh undefine vmCentOS1
Domain vmCentOS1 has been undefined
# virt-install --connect qemu:///system -n vmCentOS1 -r 1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel6 --disk path=/VMs/vmCentOS1-d1.qcow2,device=disk,format=qcow2 --graphics vnc --import


Chequeamos si la maquina levanto


# virsh undefine vmCentOS1
Domain vmCentOS1 has been undefined


Ahora estamos en condicion de poder tomar un snapshot del dominio vmCentOS1

viernes, 15 de febrero de 2013

Seteos de semáforos en linux




¿Que son los semáforos?


Los semáforos son mecanismos de comunicación inter-proceso que usa el sistema operativo para regular accesos a regiones criticas de código y recursos.
Al ser mecanismos que provee el kernel de Linux, para tunearlos es necesario modificar parámetros de kernel.


Uso del comando IPCS


Para ver como esta configurado actualmente el sistema y obtener una breve descripción de que es cada seteo podemos ejecutar el siguiente comando

[root@myserver ~]# ipcs -ls

------ Semaphore Limits --------

max number of arrays = 128

max semaphores per array = 250

max semaphores system wide = 32000

max ops per semop call = 32

semaphore max value = 32767

 
Una forma muy útil para visualizar la utilización de los semáforos de un sistema es con el comando ipcs -su


[root@myserver~]# ipcs -su

------ Semaphore Status --------
used arrays = 50
allocated semaphores = 2570

Con esto obtenemos cuantos arrays y semáforos se están utilizando


Configuración


Los parámetros de kernel se configuran con el comando sysctl

[root@myserver~]# sysctl -a |grep sem

kernel.sem = 250 32000 32 128
 
Para ampliar o modificar los seteos actuales tenemos que editar el archivo de configuración /etc/sysctl.conf y establecer la siguiente linea (o reemplazar la existente)

kernel.sem = 250 256000 32 1024

Para que el sistema haga efectivo el cambio debemos correr

sysctl -p