jueves, 30 de diciembre de 2010

Importacion XenOpensoure a Xenserver vm windows 2008

Después de pelearme unas horas intentando migrar una máquina virtual Windows 2008 r2 64 bits virtualizada en Xen Opensource hacia un pool de servidores Citrix Xenserver, he encontrado la forma de poder importar los discos correctamente.

Buen el error que me daba era el típico de que no puede importar:
xe vdi-import uuid=3e983e7b-6bd1-405f-a309-13ec2fc26dbf filename=vmwindows.disk.xm
Error code: CLIENT_ERROR
Error parameters:

El tema es curioso ya que originalmente el disco ya es raw:
 qemu-img info vmwindows.disk.xm
image: vmwindows.disk.xm
file format: raw
virtual size: 20G (21474836480 bytes)
disk size: 20G

Si convertimos de raw a raw, luego la podemos importar...
qemu-img convert vmwindows.disk.xm -O raw myserver.img

Desde el servidor XenServer
xe vdi-import --force uuid=3e983e7b-6bd1-405f-a309-13ec2fc26dbf filename=myserver.img

Y sin más problemas, se importa el disco.
Luego da un pantallazo azul cuando se arranca la maquina virtual, entrar a modo a prueba de fallos con conexión de red, instalar las xentools y listos.

miércoles, 29 de diciembre de 2010

Citrix XenServer - Error: Starting VM 'vmachine' on 'dom0server' - Internal error: Failure("The VDI XXX is already attached in RW mode; it can't be attached in RO mode!")

28/12/2010 17:25:47 Error: Starting VM 'vmachine on 'dom0server' - Internal error: Failure("The VDI XXX is already attached in RW mode; it can't be attached in RO mode!") 

Tras ver este error y leer en algunos sitios que cuando sale este error hay que reiniciar el servidor dom0... He encontrado otra solución con menos impacto. En mi caso, tengo otros dom0, en migrar la maquina, tambien fallaba. Con xe-toolstack-restart es suficiente para solventarlo.

Tambien comentar que este error puede venir debido a un fallo con el multipath, no estaría demás reiniciar este servicio y verificar que todos los caminos estan OK.

miércoles, 22 de diciembre de 2010

Citrix XenServer - Importación maquinas virtuales desde Xen Opensource

La migración de una plataforma a otra no es extremadamente complicada si las maquinas virtuales son homogenias y cumplen basicamente estas razones:
  • Haya el menu.lst de grub correctamente configurado.
  • El Kernel dentro de la maquina virtual.
  • La partición donde esta el grub tenga el flag bootable.
En algún caso me he encontrado el siguiente error a la hora de hacer el xe vdi-import 
Error code: CLIENT_ERROR

He buscado por la red pero tampoco he encontrado justificación para este error. Al parecer, pura objeción personal, algun disco de alguna máquina virtual, estaba "corrupto"  pero Xen Opensorce lo arranca igualmente, o si no es corrupto hay algo en el FS que hace que no se pueda importar.

La solución que he encontrado haciendo prueba y error es en el entorno xen opensource añadir un nuevo disco raw con el mismo tamaño y hacer un dd if=/dev/xvda of=/dev/xvdb. Aunque parezca una tonteria, ese nuevo disco sí que se puede importar mediante  xe vdi-import correctamente.


Linux - vlan config red hat

Para crear un dispositivo tipo eth0.115 donde se lleva un trunk al eth0 de N redes, hay que hacer lo siguiente.
Adaptamos el fichero de config relacionado con el adaptador ethX donde le lllega el trunk.

DEVICE=eth0 # use real interface name here
BOOTPROTO=static 
HWADDR=AA:17:31:9C:8D:BC # use real MAC address here 
ONBOOT=no 
TYPE=Ethernet 
IPADDR=0.0.0.0 
NETMASK=255.255.255.0 

Una vez tenemos el interface configurado, creamos el fichero de config del adaptador virtual que switchea con la VLAN. Por ejemplo: eth0.115 /etc/sysconfig/network-scripts/ifcfg-eth0.115 VLAN=yes 
DEVICE=eth0.115 
BOOTPROTO=static 
ONBOOT=yes 
TYPE=Ethernet 
IPADDR=10.1.1.1 
NETMASK=255.255.255.0

Si hacemos el ifup del eth0.115 ya estara funcionando. Para comprobarlo nada mejor que un tcpdump -nei eth0.115 y lanzar un ping hacia esta máquina.

Más info: http://www.mysidenotes.com/2008/01/30/vlan-configuration-on-fedora-core-red-hat-centos/


martes, 14 de diciembre de 2010

Citrix XenServer - Duplicación red management

No se si realmente es un bug o porqué pasa. El problema es que cuando haces join de un servidor a un pool de servidores, si no están los name_label en las networks exactamente como están en el servidor que queremos integrar en el pool, en el momento del join se duplica la network de management.

Para evitar y/o solucionar este problema hay que hacer lo siguiente:
  1. Si ya hemos hecho el join hay que quitaro del pool ("Remove Server form pool")
  2. Mirar los nombres de las redes del pool desde el CLI: xe network-list
  3. Comprovar que las redes de hay en el servidor que queremos integrar tienen el mismo nombre y sino modificarlo desde CLI: xe network-param-set uuid=d93c1e68-4e2c-6f90-db30-2bbfea8c95e3 name-label="Network 0"
  4. Hacer el join

lunes, 29 de noviembre de 2010

Citrix XenServer - Cambiar nombre de los adapadores de red

A mi me ha pasado que en 2 servidores las NIC de cada uno se han nombrado en el mismo orden, coincidiendo así:
NIC0  eth0
NIC1  eth1
NIC2  eth2

Pero en el tercer servidor la NIC1 correspondía a la eth0 y la NIC0 a la eth1. Primero habia pensado en cabiar los udev, peró existe una forma más correcta de hacerlo mediante el CLI.

xe pif-scan host-uuid=
xe pif-list
xe pif-forget uuid=
xe pif-introduce host-uuid= mac= device=eth



Más info: http://fragged.nu/2009/08/re-arrange-network-interface-cards-in-xenserver/

Reiniciamos y listo :)


jueves, 18 de noviembre de 2010

Citrix XenServer - Ubuntu 10.4 xs-tools

XenServer trabaja de dos maneras:
Para Instalar Ubuntu 10.4 lo que se hace es pasar de HVM a PV. Instalamos a partir de Other Media Template y una vez finalizada la instalación + SSH hacemos lo siguiente:

sudo cp /etc/init/tty1.conf /etc/init/hvc0.conf
vim /etc/init/hvc0.conf  #Reemplazamos todo lo que hace referencia a tty1 por hvc0

En mi caso parto ya de una imagen xen opensource con lo cual no necesito cambiar los parametros del kernel. Si hace falta este paso ver el siguiente post: http://www.jansipke.nl/installing-xenserver-tools-on-ubuntu-10-04

Instalamos la xentools
dpkg -i xe-guest-utilities_5.6.0-578_amd64.deb

Reiniciamos
update-rc.d -f xe-linux-distribution remove
update-rc.d xe-linux-distribution defaults

Reiniciamos y ya lo tenemos en PV

miércoles, 17 de noviembre de 2010

Citrix XenServer: Multipath

Por lo visto el multipath que te configura la GUI del xencenter solo configura un camino. Para que vea todos los caminos que tengamos en la cabina hay que ejecutar los siguientes comenados.

sleep 30
iscsiadm -m node -L all
iscsiadm -m session --rescan
/etc/init.d/multipathd restart
multipath -v3
/opt/xensource/sm/mpathcount.py

Tambien se pueden poner en /etc/rc.d/rc.local y asi siempre lo tendremos listo.

lunes, 8 de noviembre de 2010

Sparse copy - Posible ahorro de espacio

Para copiar archivos con la opción sparse, lo podemos hacer con el comando tar.

tar -cSvf fichero.tar.gz fichero
       -S, --sparse
              handle sparse files efficiently

En informática , un archivo disperso es un tipo de archivo informático que intenta utilizar el sistema de archivos del espacio de manera más eficiente cuando los bloques asignados a los archivos son en su mayoría vacías. Esto se logra escribiendo una breve información ( metadatos ) que representan los bloques vacíos en el disco en lugar del actual espacio "vacío" que constituye el bloque, utilizando menos espacio en disco. El tamaño de bloque completo se escribe en el disco como el tamaño real sólo cuando el bloque contiene "real" (no vacío) de datos.
 
 Al leer los archivos dispersos, el sistema de archivos de forma transparente convierte metadatos que representan los bloques vacíos en "real" bloques llenos de cero bytes en tiempo de ejecución. La aplicación no es consciente de esta conversión.

La mayoría de los sistemas de archivos modernos soportan archivos dispersos, incluyendo la mayoría de Unix variantes y NTFS [1] , pero sobre todo no de Apple HFS + . Sparse files are commonly used for disk images , database snapshots, log files and in scientific applications. Los archivos dispersos se utilizan comúnmente para imágenes de disco , base de datos de instantáneas, archivos de registro y en aplicaciones científicas.

Para ver un poco más como funciona, encontré el siguiente link http://www.limited-entropy.com/sparse-files-posible-ahorro-de-espacio

viernes, 5 de noviembre de 2010

Citrix Xen - Bridge Bug

Después de montar dos nodos de Citrix Xen Server, en uno de ellos el bridge que le traía las vlans para las Vms, no le llegaban paquetes de esas Vlans. En el interface sí. Resulta ser un bug. Y se soluciona así:

Enable the epel repo:
rpm -ivh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm


Install ebtables:
yum install ebtables

Install the following filter (replace eth1 with the interface you're using for your VM VLANs):
ebtables -t broute -A BROUTING -p 802.1Q -i eth1 -j DROP

Enable ebtables at startup:

chkconfig --levels 2345 ebtables on

Check the current "broute" table rules:
ebtables -t broute --list

Save the tables for next start
/etc/init.d/ebtables save
 
 

martes, 26 de octubre de 2010

Nagios nrpe error Could not complete SSL handshake

nrpe[12438]: Error: Could not complete SSL handshake. 1
Solución:
editar el fichero /etc/init.d/nrpe

modificar la linia:
/sbin/startproc $NRPE_BIN -c $NRPE_CONFIG -d
y añadir -n
/sbin/startproc $NRPE_BIN -c $NRPE_CONFIG -d -n

lunes, 25 de octubre de 2010

Actualización SLES11 a SLES11 SP1 - XEN HAE

Mirando por la red he encontrado diferentes maneras de actualizar los servidores SLES11 a SP1. Al final he optado por la actualización vía zypper ya que así ahorramos tener que bajar las isos, acceder vía ILO, etc.


Simplemente hay unas consideraciones previas antes de empezar.
  • Tener registrado a Novell el servidor con una clave actual, con todos nuestros productos (HAE, etc..)
  • No ejecutar los siguientes comandos en cadena, mirar detenidamente cada salida.
  • Tener el sistema ya con últimos updates. 
  • En el caso del cluster, el proceso es actualizar nodo a nodo. Ponemos en stanby el nodo, paramos openais y actualizamos. Una vez actualizado levantamos el servicio, migramos servicios y ponemos el siguiente nodo en standby, etc, etc. Enlace de Novell: http://www.novell.com/documentation/sle_ha/book_sleha/data/sec_ha_migration_sle11_sp1.html
#!/bin/bash
zypper ref -s
zypper up -t patch
zypper up -t patch
for item in `cat /etc/products.d/*.prod|grep ''|sed s/\<*.product\>//g |sed s/" "//g`; do zypper in -t product $item;done
suse_register -d 2 -L /root/.suse_register.log
zypper ref -s
zypper lr
zypper dup
más referencias: http://yourlinuxguy.com/?p=588

Una vez finalizado el update, reiniciado, vuelto a instalar updates y reiniciado de nuevo. Mediante yast cluster, se instalara corosync2 y se importará la config antigua del openais.conf finalizamos y arrancamos el servicio:
rcopenais start


lunes, 20 de septiembre de 2010

Critix Xen - Crear repositorio iso local

Entramos en la consola y creamos el directorio donde pondremos las ISOs
mkdir -p /var/opt/xen/iso_import/
isorepo

Creamos el repositorio de ISOs con el siguiente comando
xe sr-create name-label=isorepo type=iso device-config:location=/var/opt/xen/iso_import/isorepo device-config:legacy_mode=true content-type=iso

http://docs.vmd.citrix.com/XenServer/5.0.0/1.0/en_gb/guest.html

martes, 14 de septiembre de 2010

QMAIL - Colas, borrar correos qmHandle

Estado de las colas
# qmail-qstat

Revisamos los correos:
# qmHandle -l|egrep 'To|From'|sort|uniq -c|sort -nr|head
983 From: "TEST"
48 From: MAILER-DAEMON@smtp.test.com

Paramos Qmail:
# svc -d /service/qmail*
# svc -k /service/qmail*

Borramos el correo de test@Btest.es
# qmail-remove -p 'test@Btest.es' -r

Arancamos Qmail:
# svc -u /service/qmail* 

miércoles, 8 de septiembre de 2010

Citrix Xen - Cliente Commvault conectividad nula

Despues de instalar el agente Commvault, des de la consola del servidor, aparecía un error a la hora de chequear la conectividad. 
El problema viene de que Citrix Xen Server incluye un conjunto de políticas de Iptables. 
Para que se pueda conectar el cliente con sus media agents, etc. Hay que re-configurar iptables. Esta se encuentra en /etc/sysconfig/iptables. 
Dentro de :INPUT ACCEPT [0:0] añadimos:
-A INPUT -p tcp --dport 8400 -j ACCEPT
-A INPUT -p tcp --dport 8401 -j ACCEPT
-A INPUT -p tcp --dport 8402 -j ACCEPT-A INPUT -p tcp -s IpMediaAgent -j ACCEPT

martes, 7 de septiembre de 2010

expect - automatizador de tareas

 ¿Como automatizar una sesión de telnet? Con este ejemplo en bash
#!/bin/bash
expect << EOF
set timeout 1
spawn telnet 192.168.1.1
expect "login: "
send "admin\r"
expect "Password: "
send "unpwdchungo\r"
expect "*#"
send "get config | include $1 \r"
expect "*#"
send "exit"
exit
EOF
echo

En este ejemplo nos conectamos a un fw juniper y vemos la config que le pasemos como parametro al script.

ferran@myhost $ ./fw.sh mailserver
fwcapto-> get config | include mailserver
set address "DMZ" "mailserver" 192.168.2.1 255.255.255.0 


lunes, 6 de septiembre de 2010

Hyper-V - Problemas con fecha y hora (Time Synchronization Problems)

Parece que el hipervisor de Microsoft tampoco esta libre de problemas con la sincronizacion de tiempo entre el dom0 y sus domU.

La solución, aquí: 

Active Directory Time Synchronization Problems with Hyper-V

viernes, 3 de septiembre de 2010

Citrix Xen - Tareas bloqueadas

Ayer me encontré que un par de maquinas virtuales se quedaron pilladas  después de reiniciar un Dom0 y no arrancaban en ningún nodo.
Probamos de hacer:
xe vm-shutdown uuid=uuid90990329 force=true

Y nada. Seguian las tareas pendientes. Probamos de "matar" esas tareas
xe task-list
xe task-cancel uuid=uuid-of-the-task

Al parecer, se solucionó reiniciando el toolstack
xe-toolstack-restart

miércoles, 25 de agosto de 2010

QMAIL - de tcp.smtp a tcp.smtp.cdb

QMAIL usa el fichero  /etc/tcp.smtp.cdb  Si se hace un cambio en /etc/tcp.smtp hay que hacer lo siguiente para compilar el cdb:

cat /etc/tcp.smtp | tcprules /etc/tcp.smtp.cdb /tmp/rules

miércoles, 18 de agosto de 2010

gentoo - genkernel modules

Cada vez que compile un nuevo núcleo o recompile el actual, necesitará reinstalar los módulos del núcleo de nVidia. Una forma fácil de seguir la pista de los módulos instalados por los ebuilds (como nvidia-drivers es instalar sys-kernel/module-rebuild. Una vez lo haya instalado, simplemente ejecute module-rebuild populate para llenar su base de datos con una lista de paquetes que deben reconstruirse. Una vez haya terminado de compilar o recompilar un núcleo, simplemente ejecute module-rebuild rebuild para reconstruir los controladores para su nuevo núcleo. 

martes, 17 de agosto de 2010

Openbox & sesiones ssh - ssh-agent ssh-add -

El problema que tenia es que cuando arrancaba el agente de ssh (eval `ssh-agent`) y ssh-add en un terminal, las variables de entorno que hacen referencia a la ubicación de los archivos y pid no eran visibles para otras sesiones de terminal y por lo tanto me pedia de nuevo hacer ssh-add en cada consola.

SSH_AUTH_SOCK=/tmp/ssh-xBlFuc3166/agent.3166; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3167; export SSH_AGENT_PID;

La solución que me ha funcionado en openbox es añadir en el fichero .xinitrc eval `ssh-agent -s` para que qeuede así:

eval `ssh-agent -s`
exec ck-launch-session dbus-launch openbox-session

jueves, 5 de agosto de 2010

Wrapper sobre ncsvc cliente vpn juniper

Nueva forma de conectarme sin usar el cliente de juniper network connect. Un sencillo wrapper que ahorra usar java. Solo es necesario el binario de ncsvc y ejecutar el script como root.


#!/bin/bash
# Wrapper sobre ncsvc.
set +o posix

ok() { echo -ne "\e[32m#\n#\t$1\n#\e[m\n"; }
nk() { echo -ne "\e[31m#\n#\t$1\n#\e[m\n"; exit 1; }

USER="usuario"
HOST="hostvpn.dominio.com"
REALM="sistemas"
[ $HOST ] && [ $REALM ] || nk "Falta especificar HOST y/o REALM en el script."

PATH=$PATH:$(dirname $0)
ok "Verificando binarios wvdial pppd y grep:"
which ncsvc pgrep openssl kill || nk "Faltan binarios!"
[ $(uname -m) = "x86_64" ] && ok ": Se necesita comp. 32 bits. Arch: pacman -S lib32-glibc lib32-gcc-libs lib32-zlib"

pgrep ncsvc > /dev/null && {
ok "Procesos ncscv corriendo, los mato..."
ncsvc -K || for i in `pgrep ncsvc`; do kill -9 $i; done
ok "OK!"
} || {
[ $USER ] || { ok "Usuario: "; read -r USER; }
[ $USER ] || nk "El usuario no puede ser nulo!"
ok "Conectando..."
ncsvc -u $USER -h $HOST -r $REALM -f <(openssl x509 -in <(openssl s_client -connect secure.dominio.com:443 /dev/null | sed -n '1h;1!H;${;g;s/.*\(-----BE.*TE-----\).*/\1/p;}') -outform der)    reset } 
Gracias Oscar por esta solucion :)

miércoles, 4 de agosto de 2010

Powermt Management

Un pequeño script para escanear las HBAs y descubir los targets que hay asignados

lun_scan.sh



#!/bin/sh
#
#/*******************************************************************
# * This file is part of the Emulex Linux Device Driver for *
# * Fibre Channel Host Bus Adapters. *
# * Copyright (C) 2003-2005 Emulex. All rights reserved. *
# * EMULEX and SLI are trademarks of Emulex. *
# * www.emulex.com *
# * *
# * This program is free software; you can redistribute it and/or *
# * modify it under the terms of version 2 of the GNU General *
# * Public License as published by the Free Software Foundation. *
# * This program is distributed in the hope that it will be useful. *
# * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND *
# * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, *
# * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE *
# * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
# * TO BE LEGALLY INVALID. See the GNU General Public License for *
# * more details, a copy of which can be found in the file COPYING *
# * included with this package. *
# *******************************************************************/
#
# scripts/lun_scan Rev : 1.2
# This script is provided by Emulex to use with its 7.x and 8.x linux device
# drivers for Light Pulse Fibre Channel adapters.
#
# This script performs a scan on either specific lpfc HBAs or on all
# lpfc HBAs. When scanning an HBA, all discovered targets, and all
# luns will be probed.
#
#
# USAGE: The script is invoked with at least 1 argument. The arguments
# specify either the SCSI Host numbers corresponding to the specific
# lpfc HBA that are to be scanned, or the keyword "all" which indicates
# that all lpfc HBAs are to be scanned.
#

VERSION="1.2"
OS_REV=`uname -r | cut -c1-3`

usage()
{
echo ""
echo "Usage: lun_scan [ <#> [<#>] | all ]"
echo " where "
echo " <#> : is a scsi host number of a specific lpfc HBA that is to"
echo " be scanned. More than 1 host number can be specified. "
echo " all : indicates that all lpfc HBAs are to be scanned."
echo ""
echo " Example:"
echo " lun_scan all : Scans all lpfc HBAs"
echo " lun_scan 2 : Scans the lpfc HBA with scsi host number 2"
echo " lun_scan 2 4 : Scans the lpfc HBAs with scsi host number 2 and 4"
echo ""
echo " Warning: Scanning an adapter while performing a tape backup should"
echo " be avoided."
echo ""
}

abort_exit() {
echo ""
echo "Error: Cannot find an lpfc HBA instance with scsi host number : $host"
echo "... Aborting lun_scan."
echo ""
exit 2
}

# Validate argument list
if [ $# -eq 0 -o "$1" = "--help" -o "$1" = "-h" ] ; then
usage
exit 1
fi

# Get list of lpfc HBAs to scan
hosts=$*;

if [ ${OS_REV} = 2.4 ]; then
lowhost=0
ha=`ls /proc/scsi/lpfc/? 2> /dev/null | cut -f5 -d'/'`
hb=`ls /proc/scsi/lpfc/?? 2> /dev/null | cut -f5 -d'/'`
hc=`ls /proc/scsi/lpfc/??? 2> /dev/null | cut -f5 -d'/'`
all_hosts="$ha $hb $hc"
lowhost=`echo $all_hosts | sed "s/ .*//"`
else
all_hosts=`ls -1 -d /sys/bus/pci/drivers/lpfc/*/host* | sed -e "s/.*host//"`
fi

# If all option is used get all the lpfc host numbers.
if [ "$hosts" == "all" ] ; then
hosts="$all_hosts"
fi

if [ ${OS_REV} = 2.4 ]; then

for host in $hosts ; do
# Convert host number to lpfc instance number.
instance=`expr $host - $lowhost`

if [ ! -e /proc/scsi/lpfc/$host ] ; then
abort_exit
fi

echo Scanning lpfc$instance, scsi host number : $host;

max_lun=256

targets=`cat /proc/scsi/lpfc/$host | grep 'lpfc*t*' | cut -f2 -d't' | cut -f1 -d' '`

for target in $targets ; do
# Convert target ID to decimal from Hex format
let "dec_target = 0x$target"
echo " Scanning Target Id $dec_target..."
for ((lun=0; lun<$max_lun; lun++)) ; do echo "scsi add-single-device $host 0 $dec_target $lun" >/proc/scsi/scsi
done
done
done

else

for host in $hosts ; do
if [ ! -e /sys/bus/pci/drivers/lpfc/*/host$host ] ; then
abort_exit
fi

echo Scanning lpfc HBA instance with scsi host number : $host;
echo '- - -' > /sys/class/scsi_host/host$host/scan
done

fi

echo ""
Ejecutamos el script:
lun_scan.sh all

Hacemos que powermt vea la nueva lun

powermt check
powermt config
powermt save

Mostramos lo que ve powermt
powermt display dev=all

viernes, 9 de julio de 2010

Firewalling - Ver que firewall corta el paso con hping

Imaginamos un entorno de red complejo donde hay nose, 4 saltos entre nuestra máquina y un servidor. Dentro de estos saltos hay switchs, routers, firewalls, etc... Y queremos ver donde se esta cortando la comunicación por ejemplo el puerto 8080.

Hacemos un traceroute -In 192.168.1.4 para ver los saltos.
traceroute to 192.168.1.4 (192.168.1.4), 30 hops max, 52 byte packets
1 192.168.12.1 1.008 ms 0.540 ms 0.535 ms
2 192.168.23.33 1.670 ms 1.115 ms 1.111 ms
3 192.168.25.3 0.631 ms 1.156 ms 0.598 ms
4 192.168.1.4 1.444 ms 1.343 ms 1.281 ms

Con el comando hping podemos comprobar en que hop no pasamos

hping 192.168.1.4 -p 8080 -St 1
TTL 0 during transit from ip=192.168.12.1 name=router1
TTL 0 during transit from ip=192.168.12.1 name=router1
TTL 0 during transit from ip=192.168.12.1 name=router1

Ok por el hop 1 pasamos, probamos por el segundo
hping 192.168.1.4 -p 8080 -St 2
TTL 0 during transit from ip=192.168.23.33 name=UNKNOWN
TTL 0 during transit from ip=192.168.23.33 name=UNKNOWN

Ok por el hop 2 pasamos, probamos por el tercero
hping 192.168.1.4 -p 8080 -St 3
HPING 192.168.1.4 (eth0 192.168.1.4): S set, 40 headers + 0 data bytes
^C
No contesta. Ya sabemos que el firewall 192.168.25.3 nos corta el paso

martes, 6 de julio de 2010

Añadir nuevo disco iscsi multipath ocfs2

En cada nodo del cluster

Reescanemos en busca de la nueva lun
iscsiadm -m session --rescan

Recargamos multipath
/etc/init.d/multipathd reload

multipath -v3

Verificamos que vemos los caminos hacia la nueva LUN
multipath -ll

Creemos los enlaces uuid
(como no se como se hace automaticamente en Suse, lo hago a mano)
blkid | grep /dev/dm-

En este caso asumo que es /dev/dm-1 con el UUID 325dab18-903a-4aae-8230-a9662294846e
cd /dev/disk/by-uuid
ln -s ../../dm-1 325dab18-903a-4aae-8230-a9662294846e

verificamos que es correcto y ya lo tenemos listo para añadir como dispositivo en el recurso fs del cluster


En un nodo del cluster

Formateamos el nuevo disco

mkfs.ocfs2 -N 16 /dev/dm-2


En el CRM

Añadimos el recurso clone fs:ocf:heartbeat con sus respectivas constraints de localización, colocación y orden y listos. Nuevo pool de espacio libre.

viernes, 2 de julio de 2010

El comando seq - un buen amigo

Imaginemos que tenemos un directorio con 100 ficheros que se llaman server_log1.log, server_log2.log... hasta server_log100.log y nos interesa comprimir del 1 al 90. Con seq es así de fácil:

miramos que hace seq.
[ferran@myhost ferran]$ seq 1 90

1
2

3
..
90

Entonces si hacemos:
for i in `seq 1 90 ` ; do gzip server_log$i.log ; done

Seria como si a manita hiciéramos 90 veces...
gzip server_log1.log
gzip server_log2.log
gzip server_log3.log
..
gzip server_log90.log


viernes, 25 de junio de 2010

Arch linux en Active Directory

Con estos dos howtos está hecho :D

Arch server to Windows domain
http://wiki.archlinux.org/index.php/Arch_server_to_Windows_domain

Unir Linux a un Dominio Active directory
http://gnulinuxcodigo.blogspot.com/2009/12/unir-linux-un-dominio-active-directory.html

Stonith ibmrsa-telnet Suse SLES11

Según el departamento de ingeniería de Novell, el patch que adjunté anteriormente ya se incluye en el Service Pack 1 de SLES11.

Entonces el script queda así:



#!/usr/bin/python

# vim: set filetype=python

#######################################################################

#

# ibmrsa-telnet - External stonith plugin for HAv2 (http://linux-ha.org/wiki)

# Connects to IBM RSA Board via telnet and switches power

# of server appropriately.

#

# Author: Andreas Mock (andreas.mock@web.de)

#

# History:

# 2007-10-19 Fixed bad commandline handling in case of stonithing

# 2007-10-11 First release.

#

# Comment: Please send bug fixes and enhancements.

# I hope the functionality of communicating via telnet is encapsulated

# enough so that someone can use it for similar purposes.

#

# Description: IBM offers Remote Supervisor Adapters II for several

# servers. These RSA boards can be accessed in different ways.

# One of that is via telnet. Once logged in you can use 'help' to

# show all available commands. With 'power' you can reset, power on and

# off the controlled server. This command is used in combination

# with python's standard library 'telnetlib' to do it automatically.

#

# cib-snippet: Please see README.ibmrsa-telnet for examples.

#

# Copyright (c) 2007 Andreas Mock (andreas.mock@web.de)

# All Rights Reserved.

#

# This program is free software; you can redistribute it and/or modify

# it under the terms of version 2 or later of the GNU General Public

# License as published by the Free Software Foundation.

#

# This program is distributed in the hope that it would be useful, but

# WITHOUT ANY WARRANTY; without even the implied warranty of

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

#

# Further, this software is distributed without any warranty that it is

# free of the rightful claim of any third person regarding infringement

# or the like. Any license provided herein, whether implied or

# otherwise, applies only to this software file. Patent licenses, if

# any, provided herein do not apply to combinations of this program with

# other software, or any other product whatsoever.

#

# You should have received a copy of the GNU General Public License

# along with this program; if not, write the Free Software Foundation,

# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.

#

#######################################################################

import sys

import os

import time

import telnetlib

import subprocess


class TimeoutException(Exception):

def __init__(self, value=None):

Exception.__init__(self)

self.value = value



def __str__(self):

return repr(self.value)


class RSABoard(telnetlib.Telnet):

def __init__(self, *args, **kwargs):

telnetlib.Telnet.__init__(self, *args, **kwargs)

self._timeout = 10

self._loggedin = 0

self._history = []

self._appl = os.path.basename(sys.argv[0])


def _get_timestamp(self):

ct = time.time()

msecs = (ct - long(ct)) * 1000

return "%s,%03d" % (time.strftime("%Y-%m-%d %H:%M:%S",

time.localtime(ct)), msecs)



def write(self, buffer):

self._history.append(self._get_timestamp() + ': WRITE: ' + repr(buffer))

telnetlib.Telnet.write(self, buffer)



def expect(self, what, timeout=20):

line = telnetlib.Telnet.expect(self, what, timeout)

self._history.append(self._get_timestamp() + ': READ : ' + repr(line))

if not line:

raise TimeoutException("Timeout while waiting for '%s'." % (what, ))

return line



def login(self, user, passwd):

time.sleep(1)

line = self.expect(['\nlogin : ', '\nusername: '], self._timeout)

self.write(user)

self.write('\r')

line = self.expect(['\nPassword: ', '\npassword: '], self._timeout)

self.write(passwd)

self.write('\r')

line = self.expect(['\nsystem>', '> '], self._timeout)



def reset(self):

self.write('power cycle\r')

line = self.expect(['\nok'], self._timeout)

line = self.expect(['\nsystem>', '> '], self._timeout)



def on(self):

self.write('power on\r')

line = self.expect(['\nok'], self._timeout)

line = self.expect(['\nsystem>', '> '], self._timeout)



def off(self):

self.write('power off\r')

line = self.expect(['\nok'], self._timeout)

line = self.expect(['\nsystem>', '> '], self._timeout)



def exit(self):

self.write('exit\r')



def get_history(self):

return "\n".join(self._history)



class RSAStonithPlugin:

def __init__(self):

# define the external stonith plugin api

self._required_cmds = \

'reset gethosts status getconfignames getinfo-devid ' \

'getinfo-devname getinfo-devdescr getinfo-devurl ' \

'getinfo-xml'

self._optional_cmds = 'on off'

self._required_cmds_list = self._required_cmds.split()

self._optional_cmds_list = self._optional_cmds.split()



# who am i

self._appl = os.path.basename(sys.argv[0])



# telnet connection object

self._connection = None



# the list of configuration names

self._confignames = ['nodename', 'ip_address', 'username', 'password']



# catch the parameters provided by environment

self._parameters = {}

for name in self._confignames:

try:

self._parameters[name] = os.environ.get(name, '').split()[0]

except IndexError:

self._parameters[name] = ''



def _get_timestamp(self):

ct = time.time()

msecs = (ct - long(ct)) * 1000

return "%s,%03d" % (time.strftime("%Y-%m-%d %H:%M:%S",

time.localtime(ct)), msecs)



def _echo_debug(self, *args):

self.echo_log('debug', *args)



def echo(self, *args):

what = ''.join([str(x) for x in args])

sys.stdout.write(what)

sys.stdout.write('\n')

sys.stdout.flush()

self._echo_debug("STDOUT:", what)



def echo_log(self, level, *args):

subprocess.call(('ha_log.sh', level) + args)


def _get_connection(self):

if not self._connection:

c = RSABoard()

self._echo_debug("Connect to '%s'" %

(self._parameters['ip_address'],))

c.open(self._parameters['ip_address'])

self._echo_debug("Connection established")

c.login(self._parameters['username'],

self._parameters['password'])

self._connection = c


def _end_connection(self):

if self._connection:

self._connection.exit()

self._connection.close()


def reset(self):

self._get_connection()

self._connection.reset()

self._end_connection()

self._echo_debug(self._connection.get_history())

self.echo_log("info", "Reset of node '%s' done" %

(self._parameters['nodename'],))

return(0)



def on(self):

self._get_connection()

self._connection.on()

self._end_connection()

self._echo_debug(self._connection.get_history())

self.echo_log("info", "Switched node '%s' ON" %

(self._parameters['nodename'],))

return(0)



def off(self):

self._get_connection()

self._connection.off()

self._end_connection()

self._echo_debug(self._connection.get_history())

self.echo_log("info", "Switched node '%s' OFF" %

(self._parameters['nodename'],))

return(0)



def gethosts(self):

self.echo(self._parameters['nodename'])

return(0)



def status(self):

self._get_connection()

self._end_connection()

self._echo_debug(self._connection.get_history())

return(0)



def getconfignames(self):

for name in ['nodename', 'ip_address', 'username', 'password']:

self.echo(name)

return(0)


def getinfo_devid(self):

self.echo("External Stonith Plugin for IBM RSA Boards")

return(0)



def getinfo_devname(self):

self.echo("External Stonith Plugin for IBM RSA Boards connecting "

"via Telnet")

return(0)

def getinfo_devdescr(self):

self.echo("External stonith plugin for HAv2 which connects to "

"a RSA board on IBM servers via telnet. Commands to "

"turn on/off power and to reset server are sent "

"appropriately. "

"(c) 2007 by Andreas Mock (andreas.mock@web.de)")

return(0)

def getinfo_devurl(self):

self.echo("http://www.ibm.com/Search/?q=remote+supervisor+adapter")



def getinfo_xml(self):

info = """





nodename to shoot



Name of the node which has to be stonithed in case.









hostname or ip address of RSA



Hostname or ip address of RSA board used to reset node.









username to login on RSA board



Username to login on RSA board.









password to login on RSA board



Password to login on RSA board.







"""

self.echo(info)

return(0)

def not_implemented(self, cmd):

self.echo_log("err", "Command '%s' not implemented." % (cmd,))

return(1)


def usage(self):

usage = "Call me with one of the allowed commands: %s, %s" % (

', '.join(self._required_cmds_list),

', '.join(self._optional_cmds_list))

return usage


def process(self, argv):

self._echo_debug("========== Start =============")

if len(argv) < 1:

self.echo_log("err", 'At least one commandline argument required.')

return(1)

cmd = argv[0]

self._echo_debug("cmd:", cmd)

if cmd not in self._required_cmds_list and \

cmd not in self._optional_cmds_list:

self.echo_log("err", "Command '%s' not supported." % (cmd,))

return(1)

try:

cmd = cmd.lower().replace('-', '_')

func = getattr(self, cmd, self.not_implemented)

rc = func()

return(rc)

except Exception, args:

self.echo_log("err", 'Exception raised:', str(args))

if self._connection:

self.echo_log("err", self._connection.get_history())

self._connection.close()

return(1)


if __name__ == '__main__':

stonith = RSAStonithPlugin()

rc = stonith.process(sys.argv[1:])

sys.exit(rc)


jueves, 17 de junio de 2010

Crear eth0 alias ifconfig

Por si necesitas crearte un alias temporal

ifconfig eth0:0 192.168.18.8 netmask 255.255.255.0 up

eth0:0 Link encap:Ethernet direcciónHW 00:21:9b:6c:d6:5a
Direc. inet:192.168.18.8 Difus.:192.168.18.255 Másc:255.255.255.0
ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST MTU:1500 Métrica:1
Memoria:fe9e0000-fea00000

martes, 15 de junio de 2010

VMWARE ESX 4.0 VSphere Update Crash

Tras el último update, dos de los servidores vsphere han fallado al arrancar. El error aparece justo en el momento en que arranca udev. Al parecer esta actualización ha provocado que el UUID de la partición /var/log cambie.

SOLUCIÓN
Entrar con el passwd de root y remontar el filesystem / con rescritura
m
ount -o remount,rw /

Miramos que UUID tiene /var/log en el fichero /etc/fstab
UUID=315f724f-637f-4118-b755-2511f4ff04 /var/log ext3 defaults,errors=panic 1 2
Miramos el nuevo UUID
blkid

Veremos que uno de los UUIDs ha cambiado
/dev/sdv1: UUID="e2ac6711-87c4-45a8-8f2a-fe2e47f6fd3" SEC_TYPE="ext2" TYPE="ext3"
/dev/sdz1: TYPE="ntfs"
/dev/sdab1: TYPE="swap" UUID="a0e811ca-e8dd-4e28-b4b-cabdbe54936f"
/dev/sdab2: UUID="415f724f-637f-4118-b755-251f4ff0b14" SEC_TYPE="ext2" TYPE="ext3"
/dev/sdab5: LABEL="esx-root" UUID="7b52ed6d-c48-4c12-969f-68b66a0550c" SEC_TYPE="ext2" TYPE="ext3"

modificamos la línia del fichero /etc/fstab que hace referencia al montaje de /var/log con el nuevo UUID (si se esta editando con vi, se puede traer la salida del comando blkid haciendo en modo consola [ESC] :.!blkid )

UUID=415f724f-637f-4118-b755-251f4ff0b14 /var/log ext3 defaults,errors=panic 1 2

Guardamos :wq!

Reiniciamos el servidor y ya ha funcionado.



-Después de escribir este post hemos recibido un correo electrónico de vmware con las mismas instrucciones para solucionarlo de forma oficial :)

lunes, 14 de junio de 2010

ionice - modificar prioridad de IO de disco

Este programa establece la clase de planificación io y la prioridad de un programa a la hora de escribir en disco. Linux soporta las siguienes 3 clases:

Idle: Un programa que se ejecuta con prioridad io inactivo, no va a escribir en disco si hay otro programa ha pedido io para un período de gracia definido. El impacto de los procesos de E / S de inactividad en la actividad normal del sistema debe ser cero. Esta clase de planificación, no hace falta ser un argumento de prioridad.

Best effort: Esta es la clase de planificación predeterminada para cualquier proceso que no ha pedido una prioridad io específica. Esta clase tiene un argumento de prioridad de 0-7 (menor número = máxima prioridad). Los programas que se ejecutan en la misma prioridad "Best effort" se sirven en un round-robin.

RealTime: La clase de planificación RT se da acceso por primera vez al disco, independientemente de lo que está ocurriendo en el sistema. Así, la clase RT necesita ser utilizado con cierto cuidado, ya que otros procesos pueden "morir de hambre".

-c
La clase de planificación. 1 para tiempo real, 2 para "mejor esfuerzo", 3 de inactividad.
-n
Los datos de clase de planificación. Esto define la clase de datos, si la clase acepta un argumento. Por tiempo real y mejor esfuerzo, 0-7 es un dato válido.
-p
Ir a un proceso pid para cambiar un proceso ya se está ejecutando. Si este argumento no se da, ionice ejecutará el programa en la lista con los parámetros especificados.

Ejemplos:
# ionice -c3 -p89
Sets process with PID 89 as an idle io process.
# ionice -c2 -n0 bash
Runs 'bash' as a best-effort program with highest priority.
# ionice -p89
Returns the class and priority of the process with PID 89.
Ejemplo practico para backups de discos de xen sobre particion ocsf2
sudo ionice -c 3 cp -r /xenstore/maquina1.raw /backup/xenstore

de esta forma que sólo se procesará la entrada y salida cuando el sistema esté libre y no tendremos problemas en entornos cluster.

nrpe vmware 4.0

rpm -ivh http://www.mand4la.info/stuff/nagios/rh7x/fping-2.4-1.b2.0.rh7.rf.i386.rpm
rpm -ivh http://www.mand4la.info/stuff/nagios/rh7x/perl-Net-SNMP-5.2.0-1.0.rh7.rf.noarch.rpm
rpm -ivh http://www.mand4la.info/stuff/nagios/rh7x/nagios-plugins-1.4-2.0.rh7.rf.i386.rpm

jueves, 10 de junio de 2010

Xen Cluster DomU constraints

Es necesaria una política para hacer que este recurso domU sea dependiente del recurso clon de filesystem (partición ocfs2), ya que son verdaderamente dependientes: no se puede arrancar una maquina virtual si la partición ocfs2 no esta montada.

No tiene influencia alguna sobre otros recursos (p.ej. DomU) del cluster que este funcionando, y es inocuo cargarlo en el cluster mientras funciona.

La razón por la cual se utiliza un score de 0 esta explicitada es básicamente para evitar un reinicio automatico de algunos recursos http://www.gossamer-threads.com/lists/linuxha/users/52913.

Tambien se aplica a SLES11 HAE: ver http://forums.novell.com/novell-product-support-forums/suse-linux-enterprise-server-sles/sles-configure-administer/390708-pacemaker-problem.html y http://developerbugs.linux-foundation.org/show_bug.cgi?id=2153.

En resumen: “hay una diferencia entre order="0" y order="infinity" para los recursos primitives dependiendo de los clones.

Con order="infinity", el recurso primitive se reinicia si cualquier instancia de clone se reinicia.
Con order="0", el recurso primitive se reinicia solamente si la instancia local se reinicia. (asumiendo que las reglas de collocation estan definidas tambien.)

Consideraba que esto era un bug, pero quizas alguien tiene una situación donde este comportamiento es deseable y necesitabamos alguna forma de expresar esto en la configuración.” Lars Marowsky-Brée

Saludos Philippe, muy útil tu documentación :)

Stonith ibmrsa-telnet Suse SLES11

Tras probar a fondo la anterior entrada, descubrí que Stohith seguia sin funcionar correctamente. Los filesystem compartidos seguían bloqueados hasta el join del nodo caido. Buscando, mucho, encontré un patch que al parecer me esta dando buenos resultados, por fin. A la espera aun de la respuesta oficial de Novell ya que este parche no es "oficial". El parche es el siguiente:

--- /usr/lib64/stonith/plugins/external/ibmrsa-telnet 2010-03-25 22:26:21.476805235 +0100
+++ /tmp/ibmrsa-telnet.new 2010-03-25 22:26:08.597800250 +0100
@@ -88,29 +88,29 @@
return line

def login(self, user, passwd):
- self.write("\r")
- line = self.expect(['^login : ', '^username: '], self._timeout)
+ time.sleep(1)
+ line = self.expect(['\nlogin : ', '\nusername: '], self._timeout)
self.write(user)
self.write('\r')
- line = self.expect(['^Password: ', '^password: '], self._timeout)
+ line = self.expect(['\nPassword: ', '\npassword: '], self._timeout)
self.write(passwd)
self.write('\r')
- line = self.expect(['^system>', '^> '], self._timeout)
+ line = self.expect(['\nsystem>', '> '], self._timeout)

def reset(self):
self.write('power cycle\r')
- line = self.expect(['^ok'], self._timeout)
- line = self.expect(['^system>', '^> '], self._timeout)
+ line = self.expect(['\nok'], self._timeout)
+ line = self.expect(['\nsystem>', '> '], self._timeout)

def on(self):
self.write('power on\r')
- line = self.expect(['^ok'], self._timeout)
- line = self.expect(['^system>', '^> '], self._timeout)
+ line = self.expect(['\nok'], self._timeout)
+ line = self.expect(['\nsystem>', '> '], self._timeout)

def off(self):
self.write('power off\r')
- line = self.expect(['^ok'], self._timeout)
- line = self.expect(['^system>', '^> '], self._timeout)
+ line = self.expect(['\nok'], self._timeout)
+ line = self.expect(['\nsystem>', '> '], self._timeout)

def exit(self):
self.write('exit\r')
@@ -154,7 +154,7 @@
time.localtime(ct)), msecs)

def _echo_debug(self, *args):
- subprocess.call("ha_log.sh debug '%s'" % ' '.join(args), shell=True)
+ self.echo_log('debug', *args)

def echo(self, *args):
what = ''.join([str(x) for x in args])
@@ -164,7 +164,7 @@
self._echo_debug("STDOUT:", what)

def echo_log(self, level, *args):
- subprocess.call("ha_log.sh %s '%s'" % (level,' '.join(args)), shell=True)
+ subprocess.call(('ha_log.sh', level) + args)

def _get_connection(self):
if not self._connection:
@@ -172,6 +172,7 @@
self._echo_debug("Connect to '%s'" %
(self._parameters['ip_address'],))
c.open(self._parameters['ip_address'])
+ self._echo_debug("Connection established")
c.login(self._parameters['username'],
self._parameters['password'])
self._connection = c

Parchearlo contra el ibmrsa-telnet original de sles11 (/usr/lib64/stonith/plugins/external/
ibmrsa-telnet)

Extraido de: http://www.gossamer-threads.com/lists/engine?do=post_attachment;postatt_id=4604;list=linuxha

http://www.gossamer-threads.com/lists/linuxha/pacemaker/62991

martes, 8 de junio de 2010

Oracle BD: Añadir espacio a un Tablespace

Nos conectamos al servidor Oracle por ssh con el usuario oracle y ejecutamos:
 $ sqlplus "/ as sysdba"
Vemos el estado actual de los datafiles de dicho tablespace que queremos ampliar

select t.name "TABLESPACE" , d.status, d.bytes, d.name "DATAFILE" from v$tablespace t, v$datafile d
where t.ts#=d.ts# and t.name='NombreTablespace'
;

 TABLESPACE STATUS BYTES      DATAFILE
---------- ------ ---------- --------------------------------------------------
EXEMPLE ONLINE 524288000 /opt/local/oradata/prova/campus01.dbf
EXEMPLE ONLINE 1048576000 /opt/local/oradata/prova/campus02.dbf
EXEMPLE ONLINE 524288000 /opt/local/oradata/prova/campus02.dbf
EXEMPLE ONLINE 524288000 /opt/local/oradata/prova/campus03.dbf
EXEMPLE ONLINE 1048576000 /opt/local/oradata/prova/campus05.dbf
EXEMPLE ONLINE 1048576000 /opt/local/oradata/prova/campus04.dbf
Tenemos dos opciones ampliar el tablespace con un resize o añadiendo un datafile

SQL>alter database datafile '/opt/local/oradata/prova/campus01.dbf' resize 4096 M; 

O bien:

SQL>alter tablespace CAMPUS add datafile '/opt/local/
oradata/prova/campus06.dbf' size 4096 M;

viernes, 4 de junio de 2010

Stonith ibmrsa-telnet Suse SLES11

Después de actualizar los nodos del cluster a la última con el repositorio de Novell, los recursos STONITH por ILO de los servers IBM me han dejado de funcionar. El error era:

Jun 2 15:56:13 solsones crmd: [18334]: info: do_lrm_rsc_op: Performing key=81:39:0:09220bbe-7fe2-43ac-84df-6aec5643fdb8 op=STONITH_iLO_RSA_cerdanya_start_0 )
Jun 2 15:56:13 solsones lrmd: [18331]: info: rsc:STONITH_iLO_RSA_cerdanya:35: start
Jun 2 15:56:13 solsones lrmd: [11794]: info: Try to start STONITH resource : Device=external/ibmrsa-telnet
Jun 2 15:56:13 solsones external/ibmrsa-telnet[11795]: debug: ========== Start =============
Jun 2 15:56:13 solsones external/ibmrsa-telnet[11795]: debug: cmd: getconfignames
Jun 2 15:56:13 solsones external/ibmrsa-telnet[11795]: debug: STDOUT: nodename
Jun 2 15:56:13 solsones external/ibmrsa-telnet[11795]: debug: STDOUT: ip_address
Jun 2 15:56:13 solsones external/ibmrsa-telnet[11795]: debug: STDOUT: username
Jun 2 15:56:14 solsones external/ibmrsa-telnet[11795]: debug: STDOUT: password
Jun 2 15:56:14 solsones external/ibmrsa-telnet[11843]: debug: ========== Start =============
Jun 2 15:56:14 solsones external/ibmrsa-telnet[11843]: debug: cmd: status
Jun 2 15:56:14 solsones external/ibmrsa-telnet[11843]: debug: Connect to 192.168.138.30
Jun 2 15:56:34 solsones stonithd: [18329]: WARN: external_STONITH_iLO_RSA_cerdanya_star process (PID 11842) timed out (try 1). Killing with signal SIGTERM (15).
Jun 2 15:56:35 solsones stonithd: [11842]: info: external_run_cmd: Calling '/usr/lib64/stonith/plugins/external/ibmrsa-telnet status' returned 15
Jun 2 15:56:35 solsones stonithd: [11842]: CRIT: external_status: 'ibmrsa-telnet status' failed with rc 15
Jun 2 15:56:35 solsones stonithd: [18329]: WARN: start STONITH_iLO_RSA_cerdanya failed, because its hostlist is empty
Jun 2 15:56:35 solsones lrmd: [18331]: debug: stonithRA plugin: provider attribute is not needed and will be ignored.
Jun 2 15:56:35 solsones external/ibmrsa-telnet[11950]: debug: ========== Start =====


Tras reportarlo a Novell, he probado con el paquete heartbeat de centos heartbeat-stonith-2.1.3-3.el5.centos.x86_64.rpm he sacado el script ibmrsa-telnet de este rpm y ha funcionado correctamente.
(ver el la siguiente entrada ya que luego da problemas...
http://ferranserafini.blogspot.com/2010/06/stonith-ibmrsa-telnet-suse-sles11_10.html )