Category Archives: Linux - Page 2

Cluster de Almacenamiento con GlusterFS 3 y CentOS 5.6

En el artículo de hoy vamos a montar un cluster de almacenamiento con dos servidores CentOS. Para la implementación del cluster vamos a usar GlusterFS, que es un sistema de ficheros en espacio de usuarios (FUSE). Sigue la arquitectura clásica de cliente-servidor y puede escalar hasta varios PetaBytes.

Introducción.

Para este tutorial vamos a utilizar dos servidores:

  • server1 192.168.2.100
  • server2 192.168.2.101

Y un cliente:

  • client1 192.168.2.102

Todos los componentes deben poder resolver los nombres de los demás, si no se puede por DNS debes editar el fichero /etc/hosts:

# /etc/hosts
192.168.2.100   server1
192.168.2.101   server2
192.168.2.102   client1

Configuración de los servidores.

Antes de empezar con GlusterFS, vamos a preparar el sistema añadiendo las herramientas de desarrollo y librerías. En cada uno de los servidores ejecutamos:

# yum groupinstall 'Development Tools'
# yum groupinstall 'Development Libraries'
# yum install libibverbs-devel fuse-devel

Descargamos el software y lo compilamos:

# mkdir sandbox
# cd sandbox
# wget http://download.gluster.com/pub/gluster/glusterfs/3.0/LATEST/glusterfs-3.0.8.tar.gz
# tar zxvf glusterfs-3.0.8.tar.gz
# cd glusterfs-3.0.8
# ./configure

Al finalizar deberemos ver esto:

GlusterFS configure summary
===========================
FUSE client        : yes
Infiniband verbs   : yes
epoll IO multiplex : yes
libglusterfsclient : yes
argp-standalone    : no
fusermount         : no

Entonces compilamos e instalamos.

# make && make install

Enlazamos con las librerías dinámicas.

# ldconfig

Podemos ahora comprobar que se ha instalado correctamente.

# glusterfs --version

glusterfs 3.0.8 built on May 13 2011 20:20:55
Repository revision: v3.0.8
Copyright (c) 2006-2009 Gluster Inc. 
GlusterFS comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GlusterFS under the terms of the GNU General Public License.

Vamos ahora a crear una estructura de directorio desde el que exportar el volumen. En este tutorial queremos compartir /home por lo que vamos a montar una porción de disco sobre el directorio que exportamos con Gluster para más adelante montar en el cliente en /home.

Creamos los siguientes directorios.

# mkdir -p /data/{exports,export-ns} /etc/glusterfs

En /etc/glusterfs/glusterfsd.vol añadimos el fichero de configuración para nuestro volumen.

volume posix
  type storage/posix
  option directory /data/exports
end-volume

volume locks
  type features/locks
  subvolumes posix
end-volume

volume brick
  type performance/io-threads
  option thread-count 8
  subvolumes locks
end-volume

volume server
  type protocol/server
  option transport-type tcp/server
  option auth.addr.brick.allow 192.168.2.*
  subvolumes brick
end-volume

Para aumentar la seguridad, sólo se permiten las direcciones listadas en la línea option auth.addr.brick.allow, admite comodines y varias direcciones separadas por comas. En este ejemplo hemos dado acceso a todo el rango 192.168.2.0/24.

Como hemos compilado sin pasar ninguna opción previa al configure, vamos a crear un enlace simbólico para que el sistema encuentre el binario.

# ln -s /usr/local/sbin/glusterfsd /sbin/glusterfsd

Ya podemos arrancar el demonio y configurar su nivel de arranque.

# chkconfig --levels 35 glusterfsd on
# /etc/init.d/glusterfsd start
Starting glusterfsd:                           [  OK  ]

Ahora vamos a añadir una partición en /etc/fstab la cual montaremos en /data/exports

# vim /etc/fstab
/dev/sda3     /data/exports     ext3     defaults     0 0

En cada servidor se hace esto, es lo que ofreceremos a los clientes a través de Gluster.

Configuración de los clientes.

Pasamos ahora a la configuración de los clientes, empezamos instalando las dependencias de compilación y librerías para acabar montando el volumen Gluster en /home. Estos pasos hay que hacerlos en cada cliente.

# yum groupinstall 'Development Tools'
# yum groupinstall 'Development Libraries'
# yum install libibverbs-devel fuse-devel

Ahora cargamos el módulo fuse que se encargará de hacer de interface con el Kernel.

# modprobe fuse

Configuramos el sistema para que cargue el módulo con cada arranque.

# echo "modprobe fuse" >> /etc/rc.modules
# chmod +x /etc/rc.modules

En cada cliente descargamos e instalamos el software. Tal y como hemos hecho antes.

# mkdir sandbox
# cd sandbox
# wget http://download.gluster.com/pub/gluster/glusterfs/3.0/LATEST/glusterfs-3.0.8.tar.gz
# tar zxvf glusterfs-3.0.8.tar.gz
# cd glusterfs-3.0.8
# ./configure

Al finalizar deberemos ver esto:

GlusterFS configure summary
===========================
FUSE client        : yes
Infiniband verbs   : yes
epoll IO multiplex : yes
libglusterfsclient : yes
argp-standalone    : no
fusermount         : no

Entonces compilamos e instalamos.

# make && make install

Enlazamos con las librerías dinámicas.

# ldconfig

Podemos ahora comprobar que se ha instalado correctamente.

# glusterfs --version

glusterfs 3.0.8 built on May 13 2011 20:20:55
Repository revision: v3.0.8
Copyright (c) 2006-2009 Gluster Inc. 
GlusterFS comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GlusterFS under the terms of the GNU General Public License.

Creamos el directorio de configuración de GlusterFS.

# mkdir /etc/glusterfs

Añadimos lo siguiente al fichero glusterfs.vol

vim /etc/glusterfs/glusterfs.vol

volume remote1
  type protocol/client
  option transport-type tcp/client
  option remote-host server1
  option remote-subvolume brick
end-volume

volume remote2
  type protocol/client
  option transport-type tcp/client
  option remote-host server2
  option remote-subvolume brick
end-volume

volume stripe
  type cluster/stripe
  option block-size 1MB
  subvolumes remote1 remote2
end-volume

volume writebehind
  type performance/write-behind
  option window-size 1MB
  subvolumes stripe
end-volume

volume cache
  type performance/io-cache
  option cache-size 512MB
  subvolumes writebehind
end-volume

Y ya podemos montar el volumen en /home:

 # glusterfs -f /etc/glusterfs/glusterfs.vol /home

Podemos consultar que está montado ejecutando mount:

# mount

glusterfs#/etc/glusterfs/glusterfs.vol on /home type fuse (rw,allow_other,default_permissions,max_read=131072)

También ver el espacio disponible con df:

# df -hT

S.ficheros    Tipo  Tamaño Usado  Disp Uso% Montado en
/dev/sda1     ext3    2,9G  1,7G  1,1G  63% /
tmpfs        tmpfs    125M     0  125M   0% /dev/shm
glusterfs#/etc/glusterfs/glusterfs.vol
              fuse    6,5G  143M  6,1G   3% /home

Para hacer el montaje permanente, añadimos la siguiente línea a /etc/fstab

/etc/glusterfs/glusterfs.vol  /home             glusterfs          defaults,_netdev  0  0

Fallos.

Si has llegado hasta aquí significa que todo ha ido bien, si has encontrado algún problema los ficheros de logs de Gluster se encuentra en:

/usr/local/var/log/glusterfs/

Revisa que todas las máquinas resuelven los nombres, que la línea auth.addr.brick.allow está bien configurada y que has escrito correctamente los nombres de los directorios. Estos son problemas comunes.

Por ejemplo, si algún cliente no está autorizado a montar el volumen, pasará esto:

# glusterfs -f /etc/glusterfs/glusterfs.vol /home
# mount 

/dev/sda1 on / type ext3 (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)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
glusterfs#/etc/glusterfs/glusterfs.vol on /home type fuse (rw,allow_other,default_permissions,max_read=131072)

# df -hT

S.ficheros    Tipo  Tamaño Usado  Disp Uso% Montado en
/dev/sda1     ext3    2,9G  1,7G  1,1G  63% /
tmpfs        tmpfs    125M     0  125M   0% /dev/shm
/dev/sda3     ext3    6,5G  143M  6,1G   3% /data/exports
df: «/home»: Argumento inválido

Vemos que se ha producido un error que no es muy descriptivo del problema real que está ocurriendo ya que sí ha montado el volumen.

Conclusión.

Este sistema proporciona escalabilidad y tolerancia. El echo de exportar un directorio nos permite montar en ese directorio el disco físico un volumen LVM, un RAID, combinaciones de ambos, sistemas NAS o DAS y así montar nuestro propio DropBox! ;)

Destruyendo y Recuperando GRUB

Vamos a ver que ocurre cuando se elimina el sector de arranque del disco y como se puede recuperar para poder seguir usando el PC. El sector de arranque según la Wikipedia es:

Un bloque de arranque (a veces llamado sector de arranque o MBR) es un sector en un disco duro, disquete, o cualquier otro dispositivo de almacenamiento de datos que contiene código de arranque, por lo general (pero no necesariamente), de un sistema operativo almacenado en otros sectores del disco.

El sector de arranque en PC ocupa los primero 512 bytes del disco (incluyendo la tabla de particiones). Cuando no hay nada ahí el sistema no sabe como iniciar y puede quedar en un estado indeterminado, por ejemplo un cursor parpadeando o un mensaje indicando que se introduzca algún dispositivo de arranque.

Para borrar esta parte del disco vamos a arrancar con un LiveCD e introducir el siguiente comando:

dd if=/dev/zero of=/dev/hda bs=446 count=1

Cuando ahora tratemos de arrancar el sistema veremos lo siguiente:

FATAL: No bootable medium found! System halted.

Indicando que no hay ningún medio para arrancar.

Si queremos borrar el MBR completo tomaríamos los 512 bytes.

dd if=/dev/zero of=/dev/hda bs=512 count=1

Para ambos casos sustituir hda por el dispositivo adecuado.

Ahora vamos a recuperar el GRUB volviéndolo a instalar en el sector de arranque.

Lo primero será volver a arrancar la máquina con el LiveCD.

Una vez arrancada, miramos la tabla de particiones para saber que discos están en el sistema.

trk ~ # fdisk -l

Disk /dev/hda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1         991     7960176   83  Linux
/dev/hda2             992        1044      425722+  82  Linux swap / Solaris

Vemos una tabla simple con una partición del sistema y otra para swap. Tenemos que acceder a los datos del sistema para eso vamos a hacer chroot. La razón es que tenemos que ejecutar la instalación de grub desde dentro del sistema ya que es ahí donde se encuentra toda la información necesaria para llevarla a cabo.

En primer lugar vamos a crear un directorio de trabajo.

# mkdir linux

Vamos a montar la partición del sistema sobre este directorio de trabajo.

# mount /dev/hda1 /root/linux

Ahora vamos a montar los pseudos sistemas de ficheros /dev y /proc para poder hacer chroot.

# mount -t proc none /root/linux/proc
# mount --rbind /dev /root/linux/dev

Ahora podemos hacer chroot, hay que tener en cuenta que si el LiveCD es de 32 bits sólo podremos hacer chroot a sistemas de 32 bits y viceversa, sistemas de 64 bits con 64 bits.

# chroot /root/linux /bin/bash

Cambiará el PS1 de la consola que será la primera señal de que estamos en otro sistema. Aparecemos sobre la raíz del sistema. Podemos en este punto cargar nuestro .bashrc haciendo lo siguiente.

# source /root/.bashrc

Pero es opcional y casi que no merece la pena.

Ahora vamos a ejecutar el comando que nos restaurará Grub en el MBR.

# grub-install /dev/hda

Veremos la siguiente salida.

Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

# this device map was generated by anaconda
(hd0)     /dev/hda

Este sistema es una CentOS así que la salida que veais puede variar en otras distribuciones. La primera línea es la que indica que la instalación ha sido correcta, la segunda es un pequeño informe con el mapeo de dispositivos.

Concluida la instalación salimos de la sesión de chroot y desmontamos la partición.

# exit
# umount /root/linux

Los psudos sistemas de ficheros no se pueden desmontar porque están asociados al sistema del LiveCD, es decir, están en uso.

Ya podemos reiniciar a nuestro sistema.

# reboot

Herramientas

Como viene siendo habitual, todo a sido probado y comprobado sobre una CentOS 5.3 y Ubuntu 11.04 en máquinas virtuales de VirtualBox y el CD de rescate el gran TRK 3.4 build 367.

Lanzar Acciones Basado en la Actividad del Sistema

Hoy os quiero presentar una utilidad tan simple como impresionante. Sentinella es una simple interface gráfica con una serie de eventos a monitorizar y una serie de acciones a ejecutar.

Para instalarla, en Debian/Ubuntu.

# apt-get install sentinella

En Fedora

# yum install sentinella

Si miramos la captura, es bastante autoexplicativa:

Sentinella

Sentinella

Podemos monitorizar:

  1. La carga de CPU.
  2. La memoria usada.
  3. El trafico de red.
  4. La fecha y la hora.
  5. El programa escogido.

Así, al escoger una de estas opciones decidimos que condición debe cumplir para la acción.

Las condiciones a cumplir son:

  • CPU: Mayor o menor que un tanto por ciento.
  • Memoria: Más o menos que una cantidad en MB.
  • Tráfico de red: Descarga o subida más o menos que una cantidad en KB/s.
  • Fecha y hora: La fecha u hora especificada.
  • El programa escogido muere: Cuando seleccionamos esta opción, nos saldrá una ventana con los procesos en ejecución para elegir uno, si el elegido muere, lanzará la acción.

Las condiciones de CPU, Memoria y Tráfico tienen además un control de tiempo, es decir, debe cumplirse la condición durante este tiempo para que se pase a la acción.

Una vez que la condición se cumple, pasamos a la acción, que enumeramos a continuación.

  1. Apagar.
  2. Reiniciar.
  3. Dormir.
  4. Ejecutar un comando.
  5. Lanzar la alarma. (tiene 3 tipos de alarma)
  6. Terminar el programa.

Algunos ejemplos, podemos apagar el PC configurando que el tráfico de red sea menor que 50KB/s en eth0 indicando que la descarga ha finalizado. Podemos hacer sonar la alarma cuando la carga de CPU sea menor que 20% indicando que el ya está rippeado el DVD para subirlo al Torrent. Podemos controlar que el Transmission funciona colocandolo en el menu de “El programa elegido muere”. Se me ocurren algunos ejemplos más pero creo que está bastante claro el uso. Una interface sencilla y bien estructurada hará de esta pequeña pieza de software las delicias de sus usuarios.

Página del proyecto.

Alta Disponibilidad con Apache2 y Heartbeat en Debian Squeeze

A raíz de las últimas entradas en rm-rf.es y systemadmin.es quería probar el demonio de alta disponibilidad (heartbeat) sobre Debian, la entrada sobre Apache que publicó el primero me inspiró a hacer lo que contaba sobre la “distro” de la espiral.

Partimos de la misma configuración, tenemos dos servidores, cluster01 y cluster02 con las IPs 192.168.2.98 y 192.168.2.99 y una IP flotante 192.168.2.100

Configuradas ambas máquinas, instalamos los paquetes necesarios:

# apt-get install apache2

En nuestro caso, para la configuración de Apache editamos /etc/apache2/ports.conf y añadimos la IP flotante a la línea de NameVirtualHost así:

NameVirtualHost 192.168.2.100:80

Para que Apache no se levante al inicio ya que queremos que el que se encargue de esto es Heartbeat escribimos:

# update-rc.d apache2 remove

Y detenemos el servicio:

# /etc/init.d/apache2 stop

A continuación instalamos Heartbeat.

# apt-get install heartbeat

Y configuramos, estos ficheros de configuración se encuentran todos en /etc/ha.d/ y disponemos de plantillas para configurarlos en /usr/share/doc/heartbeat/. Podemos tomar ejemplo para configuraciones más específica.

Para el archivo ha.cf usamos la misma:

logfile /var/log/cluster.log
logfacility local0
warntime 5
deadtime 30
initdead 120
keepalive 2
bcast eth0
udpport 694
auto_failback on
node cluster01
node cluster02

La explicación

  • logfile y logfacility: Fichero de log y nivel.
  • warntime: Heartbeat avisará cuando un nodo falle tras 5 segundos.
  • deadtime: Hearbeat confirmará que un nodo ha caído, 30 segundos.
  • initdead: Tiempo máximo que Heartbeat esperará a que un nodo arranque, 60 segundos.
  • keepalive: Especifica cada cuanto tiempo Heartbeat enviará paquetes para comprobar la disponibilidad de los nodos, 2 segundos.
  • Las dos últimas líneas son las listas de nodos que conforman el cluster.

Para el fichero authkeys que es donde configuramos la comunicación entre los nodos del clúster, también para Debian podemos usar la original:

auth 2
2 sha1 clu$ter-4uth

Le asignamos los permisos para que sólo root tenga acceso.

# chmod 600 /etc/ha.d/authkeys

El último fichero cambia en Debian y es el haresources que queda con este aspecto:

cluster01 IPaddr2::192.168.2.100/24/eth0 apache2

Cambia la forma de escribir la IP flotante que está de una forma más completa y el script de inicio de Apache que en Debian es apache2.

Seguimos la entrada y la propagación se hace ejecutando el siguiente comando:

# /usr/share/heartbeat/ha_propagate

Levantamos el servicio.

/etc/init.d/heartbeat start

Ya está todo configurado, podemos probar a desactivar la interface de cluster01 y ver como al poco tiempo (el que hemos configurado) se levanta cluster02 para seguir sirviendo páginas.

La configuración entre CentOS y Debian es prácticamente la misma, pero tiene los suficientes detalles como para que los escriba aquí para no olvidar como se hace.

Conectarse sin Network Manager

El otro día mi amiga @GemaLM me comentaba que no podía conectarse a Internet porque había perdido la interface y no funcionaba NetworkManager, lo cual la dejaba bastante en la estacada.

Según entendí de sus palabras, en la consola cuando introducía el comando ifconfig veía esto:

No está eth0

No está eth0

Pero esto sólo significa que la inteface no está configurada. Podemos verlo pasando como argumento el nombre de la interface a ifconfig:

eth0 sin configurar

eth0 sin configurar

Vamos a configurarla usando los comandos clásicos de Linux. En primer lugar la dirección IP:

# ifconfig eth0 192.168.2.100 netmask 255.255.255.0
eth0 configurada

eth0 configurada

También le podemos pasar la dirección de broadcast, pero para redes de clase C no es necesario, tampoco es necesario la máscara de red, ya que el comando sabe calcularla.

A continuación añadimos una ruta por defecto para la salida de nuestra red. Esto es, la puerta de enlace, el gateway, la pasarela o como quieras llamarlo.

# route add -net 0.0.0.0 gw 192.168.2.1 netmask 255.255.255.0
Gateway

Gateway

En este punto tenemos red, podemos comunicar con el resto del mundo, pero necesitamos configurar el servicio de resolución de nombres, para poder acceder a los sitios por su URL, vamos a configurar los que proporciona Google.

# echo -e "nameserver 8.8.8.8 \nnameserver 8.8.4.4\n" > /etc/resolv.conf
Añadir el DNS

Añadir el DNS

Ya ya podemos probar que toda es correcto:

ping

ping

Esto funcionara hasta que reiniciemos la máquina, que perderá la información introducida. Para hacer los cambios permanentes en CentOS usamos la herramienta system-config-network como se muestra en las siguientes capturas:

System Config Network 1

System Config Network 1


System Config Network 2

System Config Network 2


System Config Network 3

System Config Network 3


System Config Network 4

System Config Network 4

La opción del DNS no necesitamos tocarla ya que añadimos las direcciones manualmente en un paso anterior.

En Debian, no conozco ninguna aplicación que haga esto, así que tendremos que editar el fichero de configuración a mano, debemos dejarlo con este aspecto:

# vim /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
	address 192.168.2.100
	netmask 255.255.255.0
	network 192.168.2.0
	broadcast 192.168.2.255
	gateway 192.168.2.1
	dns-nameservers 8.8.8.8 8.8.4.4

Por supuesto, si usamos direcciones dinámicas en nuestra LAN todo el proceso es mucho más sencillo, para tomar una IP en nuestra interface hacemos:

# dhclient eth0

Y ya está, todos los pasos anteriores se resumen en esto. Este comando viene de serie en todas las distribuciones.

Para hacer los cambios permanentes, en CentOS se marca la opción correspondiente en el asistente y en Debian el fichero quedaría así:

auto eth0
    iface eth0 inet dhcp