Inicio / Blog's y documentación / Blogs / jmedina

El script /etc/init.d/xendomains es el encargdo de iniciar y detener automaticamente las maquinas virtuales al iniciar o apager el sistema.

Existe un bug en el script xendomains que forma parte de paquete xen-utils-3.2, el problema es que cuando trata de iniciar las maquinas virtuales automaticamente o al tratar de detenerlas al apagar o reiniciar el sistema manda algunos errores en la pantalla referentes a un mal encomillado en las sentencias test del script.

Cuando inicia el sistema se ven errores similares a este:

Starting auto Xen domains: ushldap.cfgcut: cut: No such file or directory
/etc/init.d/xendomains: line 196: test: =: unary operator expected
 *   [done]

NOTA: A pesar de los mensajes de error la maquina si es iniciada correctamente.

Y cuando se apaga o reinicia la maquina se ven errores como este:

Shutting down Xen domains:cut: cut: No such file or directory
/etc/init.d/xendomains: line 313: test: =: unary operator expected
Domain-0(save).Error: 'xm save' requires between 2 and 3 arguments.

Usage: xm save [-c] <Domain> <CheckpointFile>
................
/etc/init.d/xendomains: line 271: test: =: unary operator expected
.Domain ushldap terminated
cut: cut: No such file or directory
/etc/init.d/xendomains: line 271: test: =: unary operator expected
.All domains terminated
/etc/init.d/xendomains: line 305: 11063 Terminated watchdog_xm shutdown
/etc/init.d/xendomains: line 305: 11083 Terminated watchdog_xm shutdown 1
*   [done]

NOTA: A pesar de los mensajes de error las maquinas si se apagan correctamente, pero no se guarda el estado de la maquina.

A continuación les muestro un procedimiento que use para corregir el problema:

Crear un respaldo del archivo /etc/init.d/xendomains

# cd /etc/init.d/

# cp xendomains xendomains.org

Ahora descargamos el parche para corregir el script

# wget http://verde.e-compugraf.com/jm-confs/xen/hardy.xendomains.diff \
> -O xendomains.diff

Antes de aplicar el parche podemos verificar que se vaya a aplicar correctamente utilizando el modo --verbose y --dry-run del comando patch:

# patch -p0 --verbose --dry-run < xendomains.diff
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|--- xendomains.orig    2009-01-29 12:57:45.000000000 -0600
|+++ xendomains 2009-01-29 15:09:53.000000000 -0600
--------------------------
Patching file xendomains using Plan A...
Hunk #1 succeeded at 63.
Hunk #2 succeeded at 80.
Hunk #3 succeeded at 183.
Hunk #4 succeeded at 193.
Hunk #5 succeeded at 268.
Hunk #6 succeeded at 310.
done

Si el resultado es similar entonces podemos aplicar el parche

# patch -p0 --verbose < xendomains.diff
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|--- xendomains.orig    2009-01-29 12:57:45.000000000 -0600
|+++ xendomains 2009-01-29 15:09:53.000000000 -0600
--------------------------
Patching file xendomains using Plan A...
Hunk #1 succeeded at 63.
Hunk #2 succeeded at 80.
Hunk #3 succeeded at 183.
Hunk #4 succeeded at 193.
Hunk #5 succeeded at 268.
Hunk #6 succeeded at 310.
done

Ahora podemos probar que el script funcione correctamente

# invoke-rc.d xendomains start
Starting auto Xen domains: ushldap.cfg *   [done]

También podemos ver el status de las maquinas:

# invoke-rc.d xendomains status
Checking for xendomains: ushldap *   [running]

Y por último verificar que las maquinas se apagan correctamente y se guarda el estado de la misma

# invoke-rc.d xendomains stop
Shutting down Xen domains: ushldap(save)...
/etc/init.d/xendomains: line 187: 11988 Terminated watchdog_xm save
/etc/init.d/xendomains: line 305: 11988 Terminated watchdog_xm save
*   [done]

Les dejo aquí como archivo adjunto el parche

hardy xendomains diff - No tienes permiso para ver este objeto.

Cuando instalamos maqunas virtuales (DomU) en Ubuntu Hardy mediante xen-tools nos encontraremos que en los logs de los DomU podremos encontrar mensajes como estos:

==> auth.log <==
Jan 22 13:38:08 malazha sshd[22596]: pam_env(sshd:setcred):

 Unable to open env file: /etc/default/locale: No such file or directory


Este es un problema relacionado con los modulos de autenticación PAM, que por default cuando un usuario hace login automaticamente se le asigna un locale predeterminado.

Esto es debido a que cuando se instalan maquinas virtuales con xen-tools en el proceso de insalación no se generaron correctamente las locales,

Para solucionar este problema simplemente creamos el archivo /etc/default/locale con el siguiente contenido:

LANG="en_US.UTF-8"

Despues de crear el archivo ya no veremos más esos molestos mensajes en los logs o en los reportes enviados por LogWatch.

NOTA: En este caso se pone en inglés gringo con codificación UTF-8 (Unicode).

Adicionalmente puede generar otras locales, por ejemplo quiere generar las locales para Español de México con UTF-8:

# locale-gen es_MX.UTF-8

En nuestra casa u oficina tenemos una conexión a Internet ADSL o por Cable, ahi mismo tenemos un servidor el cual diariamente ejecuta LogWatch para generar reportes de los logs de sistema y los envía al administrador por correo electrónico a una cuenta externa, por ejemplo: elmeildeladmin@hotmail.com.
El problema aquí es que las direcciones IP que asigna nuestro ISP (Telmex) aparecen listadas en las listas negras de SPAM más usadas, por lo tanto, la mayoría de los dominios a quienes enviemos correo rechazarán nuestros correos (incluyendo hotmail) por proveenir de una direccion IP bloqueada.
Nosotros le podemos dar la vuelta al problema antes mencionado si utilizamos como servidor de salida a un servidor SMTP externo, por ejemplo en el servidor mail.dominioexterno.com ya nos crearon una cuenta y nos asignaron una contraseña para poder utilizarlo y hacer el relay, el problema aquí es que algunos proveedores de Internet (ISP) tiene bloqueada la salida del puerto 25 (incluyendo Telmex/Infinitum), puerto que por default utiliza el protocolo SMTP. Para darle la vuelta a este problema, algunos administradores configuran un puerto adicional para el envío de correo o Submission, la mayoría de las veces utilizan el puerto TCP/587 como puerto alterno.
Configuraremos Postfix para que los correos salientes los envíe a traves de un servidor externo mail.dominioexterno.com en el cual ya tenemos una cuenta que nos permitirá el envío.
La cuenta para envío es:
Usuario SMTP: jorge@dominioexterno.com
Contraseña: 4llom3t0r3l4y
El servidor externo se llama mail.dominioexterno.com y este servidor usa Autenticación SMTP (SMTP-AUTH) para autorizar el relay a los clientes.
Instalamos postfix, lo podemos hacer desde nuestro manejador de paquetes de la distribución. En Debian/Ubuntu instalamos el paquete postfix:

# aptitude install postfix

Despues agregamos las siguientes lineas al archivo /etc/postfix/main.cf.

# vim /etc/postfix/main.cf
# Configuraciones para hacer relay por mail.dominioexterno.com en el puerto 587
# Especificamos la dirección del servidor y el puerto
relayhost = [mail.dominioexterno.com]:587

### Opciones de autenticación y seguridad para el cliente SMTP###

# Habilitamos la autenticación SASL para el cliente SMTP
smtp_sasl_auth_enable = yes

# Especificamos los metodos de seguridad para la autenticación
# del cliente SMTP
smtp_sasl_security_options = noanonymous

# Especificamos el archivo de mapas donde se encuentra la información
# para autenticarse al servidor mail.dominioexterno.com.
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

Guardamos el archivo main.cf y despues creamos el archivo /etc/postfix/sasl_passwd.

# vim /etc/postfix/sasl_passwd
[mail.dominioexterno.com]:587    jorge@dominioexterno.com:4llom3t0r3l4y

Guardamos el archivo y generamos el mapa:

# postmap /etc/postfix/sasl_passwd

Reiniciamos postfix:

# /etc/init.d/postfix restart

Probamos enviar un correo desde la consola:

# mail elmeildeladmin@hotmail.com

En los logs (/var/log/mail.log o /var/log/maillog) veremos:

postfix/pickup[4663]: BD7D82056: uid=0 from=<root>
postfix/cleanup[4671]: BD7D82056: message-id=<20081126182501.BD7D82056@server.dominiointerno.com>
postfix/qmgr[4667]: BD7D82056: from=<root@server.dominiointerno.com>, size=325, nrcpt=1 (queue active)
postfix/smtp[4673]: BD7D82056: to=<elmeildeladmin@hotmail.com>,
relay=mail.dominioexterno.com[61.65.151.233]:587, delay=0.4, delays=0.03/0.01/0.26/0.1, dsn=5.0.0
status=bounced (host mail.dominioexterno.com[61.65.151.233]:587 said: 554 <elmeildeladmin@hotmail.com>:
Relay access denied (in reply to RCPT TO command))

En este mensaje vemosque el servidor mail.dominioexterno.com no permite el relay a elmeildeladmin@hotmail.com, esto es debido a que el servidor mail.dominioexterno.com requiere que la autenticación sea establecida por un canal seguro, para eso el servidor cliente postfix debe de enviar el comando STARTTLS al servidor mail.dominioexterno.com para que se le permita el relay.
Para que el ciente SMTP utilice TLS agregaremos estas otas lineas al archivo main.cf

# El cliente smtp se autentica al servidor relay usando TLS (STARTTLS)
smtp_use_tls = yes
# No permitimos metodo de autenticación anonima para el cliente smtp/tls
smtp_sasl_tls_security_options = noanonymous

Reiniciamos postfix y al tratar de enviar de nuevo el correo veremos esto en los logs:

postfix/pickup[4768]: 8135E2056: uid=0 from=<root>
postfix/cleanup[4776]: 8135E2056: message-id=<20081126183105.8135E2056@server.dominiointerno.com>
postfix/qmgr[4772]: 8135E2056: from=<root@server.dominiointerno.com>, size=328, nrcpt=1 (queue active)
postfix/smtp[4778]: certificate verification failed for mail.dominioexterno.com[61.65.151.233]:587:
untrusted issuer /C=MX/ST=Mexico/L=Mexico DF/O=DOMINIOEXTERNO/CN=mail.dominioexterno.com/emailAddress=postmaster@dominioexterno.com
postfix/smtp[4778]: 8135E2056: to=<elmeildeladmin@hotmail.com>,
relay=mail.dominioexterno.com[61.65.151.233]:587, delay=1.2, delays=0.03/0.04/0.92/0.25, dsn=2.0.0,
status=sent (250 Ok: queued as 6336C27EC3B)
postfix/qmgr[4772]: 8135E2056: removed

Como podemos ver, ahora, despues de que postfix trata de validar el certificado del servidor mail.dominioexterno.com, el servidor ya nos permite hacer el relay y envia el correo al destinatario final.
Espero que este truco les sirva, incluso he usado gmail para enviar correos por los servidors de google :)
Saludos.

Una de mis tareas en el trabajo es crear documentación, la documentación que generamos la creamos utilizando DocBook/XML, los archivos fuente de la documentación son archivos en texto plano con sentencias XML.

Ya que varias personas estan editando y revisando la documentación, y queremos tener control sobre las versiones, la documentación esta almacenada en un repositorio SVN (Subversion)

Aquí veremos como configurar nuestro repositorio SVN para que envie un correo el ectronico de notificación a los miembros del projecto cada vez que se hace un commit.

Subversion permite la ejecución de algún script antes o despues de hacer un commit, en nuestro caso configuraremos nuestro repositorio para que ejecute un script que envía por correo una notificación avisando sobre el cambio que se realizo y también puede incluir el diff.

En el servidor tenemos un repositorio llamado Documentacion_Linux en el directorio /home/svn/.

Entramos al directorio /home/svn/Documentacion_Linux/hooks/

$ cd /home/svn/Documentacion_Linux/hooks

Y creamos el archivo post-commit con el siguiente contenido:

#!/bin/sh

REPO_NAME=Documentacion_Linux
REPO_PATH=/home/svn/${REPO_NAME}
REV=`cut -c1-2 ${REPO_PATH}/db/current`
REPO_MAIL_MEMBERS="miembro1@example.com miembro2@example.com miembro3@example.com"

/usr/share/subversion/hook-scripts/commit-email.pl $REPO_PATH $REV \
-s "Actualizacion en SVN: $REPO_NAME" \
${REPO_MAIL_MEMBERS}

Guardamos el archivo y le damos permisos de ejecución:

$ chmod +x post-commit

En este script utilizamos algunas variables para indicar el directorio del repositorio y también obtenemos la última revisión, esta información se pasa como parametro al script /usr/share/subversion/hook-scripts/commit-email.pl, además nos sirven para que sea incluida en el cuerpo del mensaje.

El script commit-email.pl forma parte del paquete subversion-tools, por lo que si no lo tiene instalado instalelo de una vez, por ejemplo con apt:

$ sudo apt-get install subversion-tools

Listo, ahora la proxima vez que algun miembro del proyecto haga un commit, se enviará un correo electronico con un mensaje con el subject algo así:

Actualización en SVN: Documentacion_Linux r65 - /

Y en el cuerpo del mensaje algo así:

Author: jmedina
Date: 2009-01-14 17:39:14 -0600 (Wed, 14 Jan 2009)
New Revision: 65

Modified:
   configuracion-de-samba-y-smbldap-tools.xml
Log:
Se agrego el ID a la seccion "configuracion de samba".

Modified: configuracion-de-samba-y-smbldap-tools.xml
===================================================================
--- configuracion-de-samba-y-smbldap-tools.xml  2009-01-14 23:24:29 UTC (rev 64)
+++ configuracion-de-samba-y-smbldap-tools.xml  2009-01-14 23:39:14 UTC (rev 65)
@@ -20,17 +20,552 @@
   herramientas smbldap-tools para configurar un Servidor Controlador de
   Dominio usando como fuente de información un directorio LDAP.</para>
 
-  <section>
+  <section id="configuracion-de-samba">

Los correos serán enviados con el servidor de correos local, si desea configurar un servidor de correos local para que envie los correos a traves de el servidor externo de la compañia, quizas porque su proveedor de Internet le asigna una dirección IP dinamica que esta en las listas negras, o porque el ISP bloquea la salida al puerto TCP/25. Si desea ver como realizar este tipo de configuraciones ver el siguiente articulo: Postfix: Como enviar correo a traves de un servidor externo usando SASL y TLS.

Espero que este articulo les sea de utilidad como lo fue para mi.

Si usamos las herramientas xen-tools para la creación de maquinas virtuales, es posible que utilices el metodo bootstrap para hacer la instalación de maquinas Debian/Ubuntu, el metodo bootstrap por default utiliza como fuente de instalación un mirror de debian en Internet, por ejemplo: http://ftp.us.debian.org/debian/, posiblemente nosotros ya tenemos CD de instalación o la imagen ISO del CD por lo que queremos utilizar este medio y así ahorrarnos el ancho de banda que por default usa el metodo bootstrap.

Para poder utilizar un CD como fuente de instalación para xen-tools haremos lo siguiente:

- Montar el CD de Ubuntu:

# mount /dev/hdd /media/cdrom/
mount: block device /dev/hdd is write-protected, mounting read-only

- Comprobamos que el CD este montado:

# mount | grep cd
/dev/scd0 on /media/cdrom type iso9660 (ro)

El CD esta montado en /media/cdrom/

En el caso que desee utilizar una imagen ISO, entonces puede usar algo así:

# mount -o loop /tmp/ubuntu-8.04.1-server-i386.iso /media/cdrom

- Ejecutar el comando xen-create-image para crear el DomU

# xen-create-image --dir=/xen-images --hostname=vmbase --dhcp \
--install-method=debootstrap --dist=hardy --mirror=file://media/cdrom/ \
--passwd
General Information
--------------------
Hostname : vmbase
Distribution : hardy
Partitions : swap 128Mb (swap)
 / 4Gb (ext3)
Image type : sparse
Memory size : 128Mb
Kernel path : /boot/vmlinuz-2.6.24-22-xen
Initrd path : /boot/initrd.img-2.6.24-22-xen
Networking Information
----------------------
IP Address : DHCP [MAC: 00:16:3E:A9:AA:B4]
Creating partition image: /xen-images/domains/vmbase/swap.img
Done
Creating swap on /xen-images/domains/vmbase/swap.img
Done
Creating partition image: /xen-images/domains/vmbase/disk.img
Done
Creating ext3 filesystem on /xen-images/domains/vmbase/disk.img
Done
Installation method: debootstrap
Done
Running hooks
Done
No role scripts were specified. Skipping
Creating Xen configuration file
Done
Setting up root password
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
All done
Logfile produced at:
 /var/log/xen-tools/vmbase.log

- Viendo el archivo de configuración del DomU vmbase:

# grep -vE '^#|^$' /etc/xen/vmbase.cfg
kernel = '/boot/vmlinuz-2.6.24-22-xen'
ramdisk = '/boot/initrd.img-2.6.24-22-xen'
memory = '128'
root = '/dev/xvda2 ro'
disk = [
 'file:/xen-images/domains/vmbase/swap.img,xvda1,w',
 'file:/xen-images/domains/vmbase/disk.img,xvda2,w',
 ]
name = 'vmbase'
dhcp = 'dhcp'
vif = [ 'mac=00:16:3E:A9:AA:B4' ]
on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'restart'
extra = '2 console=xvc0'

NOTA: Los archivos de confguración que genera xen-tools utilizan el parametro file:// dentro del
bloque de configuración disk para indicar la ruta a los dispositivos que usará la maquina virtual,
en Xen 3.2, el parametro file se ha dejado de usar en favor del parametro tap:aio, por ejemplo
para vmbase:

disk = [
 'file:/xen-images/domains/vmbase/swap.img,xvda1,w',
 'file:/xen-images/domains/vmbase/disk.img,xvda2,w',
 ]

Debemos de cambiar file por tap:aio, podemos hacer una busqueda/reemplazo con sed:

# sed -e 's/file/tap:aio/' -i /etc/xen/vmbase.cfg
y podemos comprobar la configuración:
# grep -A3 ^disk /etc/xen/vmbase.cfg
disk = [
 'tap:aio:/xen-images/domains/vmbase/swap.img,xvda1,w',
 'tap:aio:/xen-images/domains/vmbase/disk.img,xvda2,w',
 ]

Si no se cambia el parametro file, entonces, al tratar de arrrancar un domU veremos un mensaje algo así:

# Error: Device 51713 (vbd) could not be connected.

 losetup /dev/loop2 /xen-images/domains/vmbase/swap.img failed

- Arrancando el DomU vmbase

# xm create -c vmbase.cfg
Using config file ./vmbase.cfg;.
Started domain vmbase
 [ 0.000000] Linux version 2.6.24-22-xen (buildd@vernadsky) (gcc version 4.2.3

 (Ubuntu 4.2.3-2ubuntu7))

 #1 SMP Mon Nov 24 21:30:37 UTC 2008 (Ubuntu 2.6.24-4.6-generic)

...
...
 * Mounting local filesystems...                   [ OK ]
 * Activating swapfile swap...                      [ OK ]
 * Checking minimum space in /tmp...        [ OK ]
 * Configuring network interfaces...            [ OK ]
 * Starting system log daemon...                [ OK ]
 * Starting kernel log daemon...                  [ OK ]
 * Running local boot scripts (/etc/rc.local) [ OK ]
Ubuntu 8.04.1 vmbase xvc0
vmbase login: root
Password:
Linux vmbase 2.6.24-22-xen #1 SMP Mon Nov 24 21:30:37 UTC 2008 i686
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/
root@vmbase:~#

- Verificando en el Dom0 que el domU este iniciado:

# xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 1893 2 r----- 1701.6
vmbase 8 128 1 -b---- 10.3

Si desea instalar la DomU utilizando volumens LVM debe de utilizar este comando:

# xen-create-image --fs=ext3 --size=4GB --swap=256Mb --lvm=VGData01 \
--hostname=ushldap --dhcp --install-method=debootstrap --dist=hardy \
--mirror=file://media/cdrom/ --passwd

General Information
--------------------
Hostname       :  ushldap
Distribution   :  hardy
Partitions     :  swap            256Mb (swap)
                 /               4GB   (ext3)
Image type     :  full
Memory size    :  128Mb
Kernel path    :  /boot/vmlinuz-2.6.24-22-xen
Initrd path    :  /boot/initrd.img-2.6.24-22-xen

Networking Information
----------------------
IP Address     : DHCP [MAC: 00:16:3E:D4:D7:DF]


Creating swap on /dev/VGData01/ushldap-swap
Done

Creating ext3 filesystem on /dev/VGData01/ushldap-disk
Done
Installation method: debootstrap
Done
Running hooks
Done
No role scripts were specified.  Skipping

Creating Xen configuration file
Done
Setting up root password
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
All done
Logfile produced at:
        /var/log/xen-tools/ushldap.log

Con el comando anterior se creo una maquina virtual y automaticamente creará los volumens logicos ushldap-swap y ushldap-disk en el Volume Group VGData01.

Este es mi blog personal en Compugraf, el objetivo es que sirva como una bitácora con experiencias, tips, noticias relacionadas al software libre y GNU/Linux. Me pueden contactar en:

E-mail: jmedina[aRR0Ba]e-compugraf.com

IM (MSN/Gtalk): jmedina[aRR0Ba]e-compugraf.com

Mis Galerias

Lun Mar Mié Jue Vie Sáb Dom
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31