jueves, 29 de diciembre de 2011

Centos 5:Xen PCI Passthrough USB

   Hola, existen ocaciones donde necesitamos que nuestra maquina virtual pueda hacer uso de puertos como el USB, en mi caso de nuevo necesito que mi hvm pueda yo conectarle una memoria USB para que un software especifico funcione.

   El sistema que maneja recursos humanos que es muy usando en la empresas grandes llamado Tress hace uso de una memoria USB tipo HASP como candado de seguridad.

   Entonces si deseamos virtualizar el servidor donde se ejecuta el Tress necesitamos este opcion disponible en nuestra HVM.

   Pase varias semanas batallando esto, ya que uno se enfrenta a distintos obstaculos, entre ellas la mas critica y dificil que encontre:
  • Falta de documentacion por parte de los fabricantes tanto de placas madres como de procesadores.
   Por que comento esto de los fabricantes de placas madres?, he logrado esto con 2 placas distintas:
Una tipo desktop:
MoBo: SABERTOOTH+990FX
Procesador: AMD Athlon II 640
   Dicen los de soporte de la MoBo que si esta habilitada la opcion, pero nunca la encontre, me comunique con ellos y dicen que no pueden arreglar el BIOS.

  AMD esta en las mismas, la doc no dice nada de este dato.

   Para no perder el chip me fui por la que sigue:
MoBo:Asus M4A89TD PRO/USB3
Procesador: AMD Athlon II 640
   En esta si aparece la opcion en el BIOS para habilitar esta funcion, probe Xen 4.1.1 de gitco y gracias a el cielo que Xen me dio el mensaje esperado:

(XEN) I/O virtualisation enabled
(XEN) I/O virtualisation for PV guests disabled
   Ya con el simple hecho de que nos de este mensaje ya es ventaja, no me interesa que mi PV no pueda ya que no tengo nada en ellas que lo requiera, bien en la 1er placa actualice el BIOS hasta la ultima version y nada de nada asi que no quice perder mas mi tiempo, por ello mejor me fui por la segura.

  Esto me funciono en Centos 5.x, Xen 3.4.1,4.1 sin problemas, algo que note es que solo la v 1.1 del USB fue soportada, y las versiones de windows:
  • XP Pro xp3
  • Windows 7 Pro
   Otro detalle fue que windows 7, probe varias memorias USB y algunas si funcionaron otras no, pero lo que mas llamo la atencion que la memoria HASP que un programa llamado LabelView de www.teklynx.com no funciono.
   Pero mi plan era que el software llamado: Darwin de www.vanguardiatec.com funcionara y.... funciono, usa igual que el anterior una memoria HASP USB, entonces en este momento lo estan usando usando sin problemas.

   Ahora la siguiente tarea que encontre fue, puedo virtualizar windows 2003(sin problemas) y que tenga soporte de USB?

   En este caso ya no estamos hablando de un equipo tipo desktop, aqui ya es una placa servidor, siempre estas van a tener mejor electronica que una desktop por ello las separan.

Este es el equipo de SuperMicro:

SuperServer 5026T-TB
   Siempre hemos sido amantes de esta marca, no le pide nada a Dell, HP, IBM, es mas economica y se codea con ellos, la diferencia que aun en Mexico no existe una distribucion directa, todo viene de USA.

   Haste eso que el soporte es excelente y no tienes pasar por una PBX  que hace una infinidad de preguntas y siempre estan dispuestos a ayudarte.
   El procesador es una Intel Xeon E5649 con memoria ECC 1333Mhz.

   Dice la doc de Xen que tanto el MoBo como el CHIP deben tener soporte para que esta operacion funcione, por parte de la MoBo habia soporte, la doc de Intel como todas las demas, hasta AMD carece de informacion detallada.

   Me comunique via char con el soporte de Intel, y el hizo lo mismo que uno del ambito haria antes de preguntar, leer la documentacion del chip, ahi no venia nada al respecto, espere un poco y me dice "No tiene soporte", ok gracias.

   Entonces, ya era cuestion de probar por mi cuenta, por que en la lista de Xen, alguien comento que tenia algunos servidores con el chips de la familia 5600 y aparecia que si le aparecia el mensaje en su consola de:

(XEN) I/O virtualisation enabled
Pero no mostraba que chips, por ello no quedo otra que mancharme las manos.

Entonces ya fue mucho rollo, vamos a ver como habilitar esto en Xen:

NOTA1: Este procedimiento es igual para todos los chips o MoBo.
NOTA2: Xen 4.x no necesita el paso 1, ya viene por default.

1; Si usan Xen anterior a 4.x deben habilitar la opcion en su kernel asi:

kernel /xen.gz-3.4.3 dom0_max_vcpus=2 dom0_vcpus_pin dom0_mem=1024MB iommu=1

Xen 4.x ya lo tiene.

Reiniciar el server.

2; Asegurarse antes de nada que aparezca el mensaje esperado cuando ejecuten el comando: xen dmesg.
(XEN) I/O virtualisation enabled
Si no aparece esto, ni le sigan.

2; Detectar la direccion de nuestro puerto USB.

   Aqui estoy hablando de un puerto USB, pero aplica a los puertos que desean enviar, video, paralelo, etc, etc.

   Ahora como puedo yo saber cual es la direccion de una puerto USB especifico?

Existe un comando poco usado llamado:

udevmonitor

   Este comando lo que hace es monitorear los puertos para ver en consola que estamos conectando, cuando conectamos una memoria USB aparece esto en pantalla:

UEVENT[1325036667.645024] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2
UEVENT[1325036667.645051] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2/usbdev1.3_ep00
UEVENT[1325036667.645235] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2/1-2:1.0
UEVENT[1325036667.645245] add@/class/scsi_host/host5
UEVENT[1325036667.645251] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2/1-2:1.0/usbdev1.3_ep01
UEVENT[1325036667.645257] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2/1-2:1.0/usbdev1.3_ep82
UEVENT[1325036667.645264] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2/1-2:1.0/usbdev1.3_ep83
UEVENT[1325036667.645270] add@/class/usb_device/usbdev1.3
UDEV  [1325036667.656886] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2
UDEV  [1325036667.764765] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2/usbdev1.3_ep00
UDEV  [1325036668.179955] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2/1-2:1.0
UDEV  [1325036668.389248] add@/class/scsi_host/host5
UDEV  [1325036668.400871] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2/1-2:1.0/usbdev1.3_ep82
UDEV  [1325036668.400884] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2/1-2:1.0/usbdev1.3_ep83
UDEV  [1325036668.400891] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2/1-2:1.0/usbdev1.3_ep01
UDEV  [1325036668.546698] add@/class/usb_device/usbdev1.3
UEVENT[1325036672.644024] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2/1-2:1.0/host5/target5:0:0/5:0:0:0
UEVENT[1325036672.644042] add@/class/scsi_disk/5:0:0:0
UEVENT[1325036672.770313] add@/block/sdg
UEVENT[1325036672.770326] add@/class/scsi_device/5:0:0:0
UEVENT[1325036672.770333] add@/class/scsi_generic/sg7
UDEV  [1325036672.894515] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2/1-2:1.0/host5/target5:0:0/5:0:0:0
UDEV  [1325036673.105483] add@/class/scsi_disk/5:0:0:0
UDEV  [1325036673.108784] add@/class/scsi_generic/sg7
UDEV  [1325036673.314546] add@/class/scsi_device/5:0:0:0
UDEV  [1325036673.399994] add@/block/sdg


Vamos buscar nuestro puerto:

UEVENT[1325036667.645024] add@/devices/pci0000:00/0000:00:1a.7/usb1/1-2

Ahora vamos a compararlo con el listado de Centos:

lspci


00:00.0 Host bridge: Intel Corporation 5520/5500/X58 I/O Hub to ESI Port (rev 22)
00:01.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 1 (rev 22)
00:03.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 3 (rev 22)
00:05.0 PCI bridge: Intel Corporation 5520/X58 I/O Hub PCI Express Root Port 5 (rev 22)
00:07.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 7 (rev 22)
00:09.0 PCI bridge: Intel Corporation 5520/5500/X58 I/O Hub PCI Express Root Port 9 (rev 22)
00:14.0 PIC: Intel Corporation 5520/5500/X58 I/O Hub System Management Registers (rev 22)
00:14.1 PIC: Intel Corporation 5520/5500/X58 I/O Hub GPIO and Scratch Pad Registers (rev 22)
00:14.2 PIC: Intel Corporation 5520/5500/X58 I/O Hub Control Status and RAS Registers (rev 22)
00:14.3 PIC: Intel Corporation 5520/5500/X58 I/O Hub Throttle Registers (rev 22)
00:16.0 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:16.1 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:16.2 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:16.3 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:16.4 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:16.5 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:16.6 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:16.7 System peripheral: Intel Corporation 5520/5500/X58 Chipset QuickData Technology Device (rev 22)
00:1a.0 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #4
00:1a.1 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #5
00:1a.2 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #6
00:1a.7 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #2
00:1c.0 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 1
00:1c.1 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Port 2
00:1d.0 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #1
00:1d.1 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #2
00:1d.2 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #3
00:1d.7 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #1
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 90)
00:1f.0 ISA bridge: Intel Corporation 82801JIR (ICH10R) LPC Interface Controller
00:1f.2 IDE interface: Intel Corporation 82801JI (ICH10 Family) 4 port SATA IDE Controller #1
00:1f.3 SMBus: Intel Corporation 82801JI (ICH10 Family) SMBus Controller
00:1f.5 IDE interface: Intel Corporation 82801JI (ICH10 Family) 2 port SATA IDE Controller #2
06:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection
07:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection
08:01.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1010 66MHz  Ultra3 SCSI Adapter (rev 01)
08:04.0 VGA compatible controller: Matrox Graphics, Inc. MGA G200eW WPCM450 (rev 0a)


   Ya dimos y confirmamos que es la direccion que necesitamos.

3; Habilitar el modulo pciback en el kernel.

   Este modulo ni RedHat ni Centos lo tienen compilado en el kernel,xen para ello tenemos 2 opciones:

A) Agregarlo
B) Compilar el kernel xen y habilitarlo.

   Yo me voy por la mas rapida la A, para esto tenemos que hacer lo siguente.

1.1 Esconder del Host el puerto requerido, ya tenemos la direccion que necesitamos, para esto modificamos el archivo modprobe.conf que esta en  /etc y agregamos esta linea a el final:

options pciback hide=(00:1a.7)

Salvamos y salimos, como podran ver es la direccion que obtuvimos anteriormente cuando ejecutamos udevmonitor.

1.2 Agregamos el modulo a nuestro modulo initrd para que cada que reinicie lo cargue antes de darnos la consola del poder.

Nos vamos a el folder boot:

cd /boot

NOTA 3: Por seguridad hacer una copia del initrd actual por si algo sale mal:

cp initrd-$(uname -r).img initrd-$(uname -r).img-default

Ahora si a agregar el modulo:

mkinitrd -f --preload=pciback /boot/initrd-$(uname -r).img $(uname -r)

   Como podran ver hemos agregado el modulo pciback para que cuando arranque el kernel lo tenga listo, asi cuando ejecute el modprobe.conf ya pueda el esconder nuestro puerto y quede libre para nuestra hvm, de lo contrario el host se negara  a soltar el puerto.

1.3 Decirle a Xen que puerto el va a tomar control para entregar a la HVM que lo necesite.

   Para esto vamos a buscar otro dato que necesitamos de nuestro hw, ya tenemos la direccion del puerto, pero Xen requiere otro mas de ese puerto, y este lo obtenemos ejectando el comando lspci -n, buscamos nuestro hw id y buscamos este dato:

lspci -n

00:00.0 0600: 8086:3405 (rev 22)
00:01.0 0604: 8086:3408 (rev 22)
00:03.0 0604: 8086:340a (rev 22)
00:05.0 0604: 8086:340c (rev 22)
00:07.0 0604: 8086:340e (rev 22)
00:09.0 0604: 8086:3410 (rev 22)
00:14.0 0800: 8086:342e (rev 22)
00:14.1 0800: 8086:3422 (rev 22)
00:14.2 0800: 8086:3423 (rev 22)
00:14.3 0800: 8086:3438 (rev 22)
00:16.0 0880: 8086:3430 (rev 22)
00:16.1 0880: 8086:3431 (rev 22)
00:16.2 0880: 8086:3432 (rev 22)
00:16.3 0880: 8086:3433 (rev 22)
00:16.4 0880: 8086:3429 (rev 22)
00:16.5 0880: 8086:342a (rev 22)
00:16.6 0880: 8086:342b (rev 22)
00:16.7 0880: 8086:342c (rev 22)
00:1a.0 0c03: 8086:3a37
00:1a.1 0c03: 8086:3a38
00:1a.2 0c03: 8086:3a39
00:1a.7 0c03: 8086:3a3c
00:1c.0 0604: 8086:3a40
00:1c.1 0604: 8086:3a42
00:1d.0 0c03: 8086:3a34
00:1d.1 0c03: 8086:3a35
00:1d.2 0c03: 8086:3a36
00:1d.7 0c03: 8086:3a3a
00:1e.0 0604: 8086:244e (rev 90)
00:1f.0 0601: 8086:3a16
00:1f.2 0101: 8086:3a20
00:1f.3 0c05: 8086:3a30
00:1f.5 0101: 8086:3a26
06:00.0 0200: 8086:10d3
07:00.0 0200: 8086:10d3
08:01.0 0100: 1000:0021 (rev 01)
08:04.0 0300: 102b:0532 (rev 0a)


   Ahi lo tenemos, el dato que requiere Xen es: 8086:3a3c.

   Abrimos el archivo de Xen llamado /etx/xen/xend-pci-permissive.sxp

   Y nos queda asi:

###############################################################################
(unconstrained_dev_ids
     #('0123:4567:89AB:CDEF')
('8086:3a3c')
)


   Viendo su archivo van a notar la diferencia, dice el doc que no es necesario, pero a mi me ha funcionado asi y no he tenido problema con mi HVM ni host.

1.4 Agregar el puerto a la configuracion de nuestra HVM, en este caso Windows XP:
pci = ["00:1a.7"]
   Esto lo agregamos a el final del archivo.

4; Reiniciar servidor y a probar.

5; Arracamos nuestra maquina virtual, ya que este lista, le conectamos el USB y tenemos esto:

Imagen 1: Mostrando contenido del USB.

 Imagen 2: Controlador de USB en Windows.

Imagen 3: Device Manager de Windows.

   No he tenido exito con USB 2.0, pero para lo que lo he necesitado que son las HASP USB Keys me ha funcionado sin problemas.

OS probados y funcionando:
Windows XP Profesional
Windows 2003 Standard Edition
Windows 7 Profesional
Saludos.

martes, 22 de noviembre de 2011

Centos 5: Migrar MySQL 5.1 de Windows a Linux.

 Hola, me encontre con un problema cuando quise migrar una base de datos corriendo MySQL 5.1.x en Windows XP y la trate de migrar a MySQL 5.1 corriendo Centos 5.7.

 La base de datos que me interesa es tipo InnoDB, entonces la manera tradicional es atraves del comando mysqldump asi:

  mysqldump -f --opt --single-transaction nombre-bd > nombre-bd.sql -u root -h windowsxp-ip -p

  Para regresarla:

  mysql nombre-bd < nombre-bd.sql -p

 Todo esto hecho desde el mismo servidor centos.

  Bien ya tenemos nuestra bd, ahora es cuestion de reconfigurar nuestra app que este caso se ejecuta bajo Windows atraves de un ODBC, hecho lo anterior era cuestion de ejecutar el programa.

   Pero para mi sorpresa no funciono, el programa empezo a marcar errorres, el odbc decia que todo bien, su test sin problemas, que estaba pasando?

  Los logs son benditos, me vi en la necesidad de prender el log mysql, reinicie el servicio y a leer el log.

   Lo que sucedia era que la app mandaba los querys a la base de datos en mayusculas, recordar que Unix/Linux son sensibles a las minusculas/mayusculas, siempre han operado asi.

  Cuando yo corria el mismo query en la consola de mysql el me decia que encontraba la tabla dada, ahi venia el problema, MySQl windows cuando creo la  base de datos la tablas las nombro con Myusculas-Minusculas, cuando mysqldump restaura las tablas en Centos lo hace todo con minusculas ya que asi opera el por default.

 Y esto llevo a que la app tronara, lo que hice fue modificar un parametro general de MySQL en centos este:

lower_case_table_names = 1

Por default es 0, lo que hace este parametro es que cuando compara los nombres no verifica si son mayusculas, minusculas, etc, una reiniciada a el servidor, y listo, la app empezo a funcionar.

El parametro va en: /etc/my.cnf.

Saludos!!!


miércoles, 26 de octubre de 2011

Windows 7: Como grabar en C: y otros directorios del sistema

 Me tope con una app que segun los de soporte me decian que el problema que tenia era que tenia problemas de permisos.

Ahora bien, hice lo necesario, aplique los permisos a el folder como ellos me indicaron y aun asi la aplicacion se rehuzo a instalarse.

De ahi, la persona de soporte me comento que iba a decirme como instalar la app a mano, segui sus instrucciones y nada.

Despues me dijo que iba a revisar con su maquina para ver el problema, me mando un correo y me dijo que haya con el la app funciono, probo en windows 7 32/64 y que todo bien, que el problema era la falta de permisos en mi maquina.

Entonces le pregunte, bien si dices que son por falta de permisos, dime donde los tengo que aplicar? Y claro que ni el sabia donde.

Analizando la app, es una hecha en vb6 aun, los dlls mas nuevos son del 2008, los demas son viejos.

El problema radica en que la app trata de instalar esos DLL en el folder C:\Windows\system32\ y claro que no le permite grabar los archivos.

La app fue hecha para buscar los DLL en system32 y no para correrlos localmente en el folder donde esta el ejecutable como el queria hacerle.

Bien, entonces descomprimi el folder, entre a el archivo CAB que tiene los DLL, y trate de copear todos los DLL a el system32 de mi Windows 7, BOOM, no dejo grabar ninguno.

Empece a investigar el problema, y note que mi usuario que se dice estar en el grupo de "Administrators" no lo es, Microsoft trata de engañarnos haciendonos creer que si lo somos, pero al final vivimos en el engaño.

Leyendo otros foros, habia uno donde nos indican esto, y existe una manera de habilitar el usuario "Administrator" que por default esta deshabilitado por seguridad.

 Figura 1. Cuenta de Administrator.

Por default como indica la Figura 1, la cuenta esta deshabilitada.

Figura 2. Caracteristicas de la cuenta.


Ya solo, le quitan la palomita para habilitarla, Apply - Ok y listo.

Notaran que la flecha ya no aparece en el usuario, por seguridad esta cuenta si es la de Administrator que teniamos en XP/2000, la que usamos es una de usuario normal con privilegios extras.

Se deslogean y les aparecera la cuenta para logearse, no tiene password por default.

Una recomendacion que les hago, esta cuenta usenla para hacer aquellas cosas que su usuario normal no se los permite en mi caso:

Grabar archivos en el C:\windows\system32\ como los DL por ejemplo.

Ya lo hice, una vez terminada mi tarea, deshabilito de nuevo la cuenta y entro con mi usuario normal, ya que con el si puedo hacer todas mis labores excepto grabar los DLL de mi aplicacion X.

No abusen de esta cuenta, usenla cuando en realidad tengan problemas, esta forma de trabajar de Windows 7 no es mala, desgraciadamente ellos no proporcionan la informacion real, el foro donde lei todo esto ahi viene infinidad de gente que tuvo problemas parecidos a el mio, y varios de ellos indican que hasta hablaron con personas de soporte y aun asi ni ellos mismos lograron solucionar el problema, ni modo asi nos quieren tener y aparte nos cobran.

Recordar que la cuenta por default no tiene password, por ello usenla y cierrenla.

NOTA: Algo que note cuando entre con el usuario Administrator es que los compartidos dejaron de operar, no me he metido mas a fondo pero en cuanto regrese con mi usuario normal los compartidos volvieron a trabajar.

Saludos!!!

lunes, 24 de octubre de 2011

Centos 5.x: Xen arrancar DomU al iniciar sistema

Existe una manera que me ha funcionado, la configuracion de las vm's se localiza en /etc/xen/, dentro de ese directorio hay otro de nombre auto.

Bien, para poder arracar mis vm's cada que por alguna razon necesito reiniciar Dom0(actualizaciones) es crear un soft link hacia ese folder para DomU, ejemplo:

ln -s /etc/xen/vm-1 /etc/xen/auto/vm-1

Listo, prueben y veran que su vm-1 arrancan cada que reinicien su dom0, saludos!!!

Xen 3.1/Xen 3.4.

jueves, 13 de octubre de 2011

MySQL 5.1: Reparar tablas MyISAM con mysqlcheck


Bacula se nego a funcionar, la db es MySQL 5.1, el log de bacula es:

12-Oct 19:47 bacula-dir JobId 12396: Fatal error: sql_create.c:870 Lock Filename table Query failed: LOCK TABLES Filename write, batch write, Filename as f write: ERR=Table './bacula/Filename' is marked as crashed and last (automatic?) repair failed
 

Bueno, tenemos que reparar nuestras tablas, mysql nos proporciona varios comandos, entre ellos podemos tratar de compactar la bd completo o bien usar el comando: mysqlcheck para ver el estatus de las tablas y si necesitaramos reparar alguna tipo MYISAM esta el comando myisamchk.

NOTA: Recomendacion de MySQL, si van a reparar tablas es
altamente recomendable que el servicio este apagado por seguridad, de lo contrario atenganse a las consecuencias si algo sale mal, ya que si un usuario esta tratando de ingresar datos, aunque la tabla ya no se lo permita pero puede estar abierto el aputador a el archivo y luego el comando myisamchk tambien trata de hacer modificaciones, nomas imaginense que puede pasar?.


mysqlcheck

 
Si lo ejecutan solo, les va a dar todo su arsenal de parametros que soporta.

Bacula tiene varias tablas, todas son usando el engine: myisam.

Ahora vamos empezar por revisar la bd y que nos diga que tablas necesitan reparacion:

/var/lib/mysql/bacula/
 
 -rw-rw---- 1 mysql mysql       8710 Jun 27 00:28 BaseFiles.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:28 BaseFiles.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:28 BaseFiles.MYI
-rw-rw---- 1 mysql mysql       8604 Jun 27 00:28 CDImages.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:28 CDImages.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:28 CDImages.MYI
-rw-rw---- 1 mysql mysql       8764 Jun 27 00:28 Client.frm
-rw-rw---- 1 mysql mysql       1904 Jun 27 00:28 Client.MYD
-rw-rw---- 1 mysql mysql       3072 Jun 27 00:28 Client.MYI
-rw-rw---- 1 mysql mysql       8732 Jun 27 00:28 Counters.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:28 Counters.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:28 Counters.MYI
-rwxr-xr-x 1 mysql mysql         65 Nov 26  2010 db.opt
-rw-rw---- 1 mysql mysql       9290 Jun 27 00:28 Device.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:28 Device.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:28 Device.MYI
-rw-rw---- 1 mysql mysql       8806 Jun 27 00:28 File.frm
-rw-rw---- 1 mysql mysql 1756959048 Oct 12 22:34 File.MYD
-rw-rw---- 1 mysql mysql  777433088 Oct 12 22:34 File.MYI
-rw-rw---- 1 mysql mysql       8602 Jun 27 00:34 Filename.frm
-rw-rw---- 1 mysql mysql   69038080 Oct 12 18:15 Filename.MYD
-rw-rw---- 1 mysql mysql   75943936 Oct 12 19:10 Filename.MYI
-rw-rw---- 1 mysql mysql       8676 Jun 27 00:34 FileSet.frm
-rw-rw---- 1 mysql mysql       5104 Sep 14 19:20 FileSet.MYD
-rw-rw---- 1 mysql mysql       2048 Sep 26 06:28 FileSet.MYI
-rw-rw---- 1 mysql mysql       9618 Jun 27 00:34 Job.frm
-rw-rw---- 1 mysql mysql       9618 Jun 27 00:34 JobHisto.frm
-rw-rw---- 1 mysql mysql     167324 Jun 27 00:34 JobHisto.MYD
-rw-rw---- 1 mysql mysql      20480 Jun 27 00:34 JobHisto.MYI
-rw-rw---- 1 mysql mysql       8916 Jun 27 00:34 JobMedia.frm
-rw-rw---- 1 mysql mysql     423325 Oct 12 22:34 JobMedia.MYD
-rw-rw---- 1 mysql mysql     304128 Oct 12 22:34 JobMedia.MYI
-rw-rw---- 1 mysql mysql     334004 Oct 12 22:34 Job.MYD
-rw-rw---- 1 mysql mysql      39936 Oct 12 22:34 Job.MYI
-rw-rw---- 1 mysql mysql       8676 Jun 27 00:34 Location.frm
-rw-rw---- 1 mysql mysql       8881 Jun 27 00:34 LocationLog.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:34 LocationLog.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:34 LocationLog.MYI
-rw-rw---- 1 mysql mysql          0 Jun 27 00:34 Location.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:34 Location.MYI
-rw-rw---- 1 mysql mysql       8660 Jun 27 00:34 Log.frm
-rw-rw---- 1 mysql mysql    5677120 Oct 12 22:34 Log.MYD
-rw-rw---- 1 mysql mysql     732160 Oct 12 22:34 Log.MYI
-rw-rw---- 1 mysql mysql      10453 Jun 27 00:34 Media.frm
-rw-rw---- 1 mysql mysql      11108 Oct 12 22:34 Media.MYD
-rw-rw---- 1 mysql mysql       4096 Oct 12 22:34 Media.MYI
-rw-rw---- 1 mysql mysql       8652 Jun 27 00:34 MediaType.frm
-rw-rw---- 1 mysql mysql        100 Jun 27 00:34 MediaType.MYD
-rw-rw---- 1 mysql mysql       2048 Jun 27 00:34 MediaType.MYI
-rw-r--r-- 1 root  root        6372 Jun 27 00:19 out.txt
-rw-rw---- 1 mysql mysql       8594 Jun 27 00:34 Path.frm
-rw-rw---- 1 mysql mysql       8600 Jun 27 00:34 PathHierarchy.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:34 PathHierarchy.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:34 PathHierarchy.MYI
-rw-rw---- 1 mysql mysql   16394220 Oct 12 19:17 Path.MYD
-rw-rw---- 1 mysql mysql   25443328 Oct 12 19:17 Path.MYI
-rw-rw---- 1 mysql mysql       8658 Jun 27 00:34 PathVisibility.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:34 PathVisibility.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:34 PathVisibility.MYI
-rw-rw---- 1 mysql mysql       9699 Jun 27 00:34 Pool.frm
-rw-rw---- 1 mysql mysql        240 Oct  9 23:17 Pool.MYD
-rw-rw---- 1 mysql mysql       3072 Oct 12 18:15 Pool.MYI
-rw-rw---- 1 mysql mysql       8656 Jun 27 00:34 Status.frm
-rw-rw---- 1 mysql mysql        640 Jun 27 00:34 Status.MYD
-rw-rw---- 1 mysql mysql       2048 Jun 27 00:34 Status.MYI
-rw-rw---- 1 mysql mysql       8644 Jun 27 00:34 Storage.frm
-rw-rw---- 1 mysql mysql        120 Jun 27 00:34 Storage.MYD
-rw-rw---- 1 mysql mysql       2048 Jun 27 00:34 Storage.MYI
-rw-rw---- 1 mysql mysql       8678 Jun 27 00:34 UnsavedFiles.frm
-rw-rw---- 1 mysql mysql          0 Jun 27 00:34 UnsavedFiles.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:34 UnsavedFiles.MYI
-rw-rw---- 1 mysql mysql       8570 Jun 27 00:34 Version.frm
-rw-rw---- 1 mysql mysql          7 Jun 27 00:34 Version.MYD
-rw-rw---- 1 mysql mysql       1024 Jun 27 00:34 Version.MYI
 
O bien si analizamos toda la bd debemos darle el usuario/password del root, el nombre de la bd y el sabe donde buscarlo, vamos empezando por esta opcion:
 
bacula]# time mysqlcheck -a  -B bacula -p
Enter password:
bacula.BaseFiles                                   Table is already up to date
bacula.CDImages                                    Table is already up to date
bacula.Client                                      Table is already up to date
bacula.Counters                                    Table is already up to date
bacula.Device                                      Table is already up to date
bacula.File                                        Table is already up to date
bacula.FileSet                                     Table is already up to date
bacula.Filename
Error    : Table './bacula/Filename' is marked as crashed and last (automatic?) repair failed
Error    : Table 'Filename' is marked as crashed and last (automatic?) repair failed
error    : Corrupt
bacula.Job                                         Table is already up to date
bacula.JobHisto                                    Table is already up to date
bacula.JobMedia                                    Table is already up to date
bacula.Location                                    Table is already up to date
bacula.LocationLog                                 Table is already up to date
bacula.Log                                         Table is already up to date
bacula.Media                                       Table is already up to date
bacula.MediaType                                   Table is already up to date
bacula.Path                                        Table is already up to date
bacula.PathHierarchy                               Table is already up to date
bacula.PathVisibility                              Table is already up to date
bacula.Pool                                        Table is already up to date
bacula.Status                                      Table is already up to date
bacula.Storage                                     Table is already up to date
bacula.UnsavedFiles                                Table is already up to date
bacula.Version                                     Table is already up to date
real    0m2.297s
user    0m0.000s
sys     0m0.000s
 
Con el parametro -a le pedimos que revise rapidamente los estatus de cada tabla de la bd, es rapido y nos dice la condicion de la tabla. Me gusta ver el tiempo que tardan las tareas en ejecutarse, nos indica la condicion de nuestro equipo en lo personal cuando se trata de bd siempre deseo saber este dato.

Ahora vamos solictando mas detalle, que no revise el estatus si no que abra cada tabla y le realice una revision normal.

 
time mysqlcheck  --check -B bacula -p
Enter password:******
bacula.BaseFiles                                   OK
bacula.CDImages                                    OK
bacula.Client                                      OK
bacula.Counters                                    OK
bacula.Device                                      OK
bacula.File                                        OK
bacula.FileSet                                     OK
bacula.Filename
warning  : Table is marked as crashed and last repair failed
warning  : 1 client is using or hasn't closed the table properly
warning  : Size of indexfile is: 75943936      Should be: 14383104
error    : Size of datafile is: 69038080         Should be: 69038956
error    : Corruptbacula.Job                                         OK
bacula.JobHisto                                    OK
bacula.JobMedia                                    OK
bacula.Location                                    OK
bacula.LocationLog                                 OK
bacula.Log                                         OK
bacula.Media                                       OK
bacula.MediaType                                   OK
bacula.Path                                        OK
bacula.PathHierarchy                               OK
bacula.PathVisibility                              OK
bacula.Pool                                        OK
bacula.Status                                      OK
bacula.Storage                                     OK
bacula.UnsavedFiles                                OK
bacula.Version                                     OK
 
real    1m19.222s
user    0m0.000s
sys     0m0.000s
 
Ahi esta la tabla que esta danada de nuevo.

Pero que tal si ejecutamos la misma consulta pero agregamos el parametro -e que significa, revisa las tablas 100% sin importar el tiempo que tardes ("extendida").


 
time mysqlcheck  --check -e  -B bacula -p
Enter password:
bacula.BaseFiles                                   OK
bacula.CDImages                                    OK
bacula.Client                                      OK
bacula.Counters                                    OK
bacula.Device                                      OK
bacula.File                                        OK
bacula.FileSet                                     OK
bacula.Filename
warning  : Table is marked as crashed and last repair failed
warning  : 1 client is using or hasn't closed the table properly
warning  : Size of indexfile is: 75943936      Should be: 14383104
error    : Size of datafile is: 69038080         Should be: 69038956
error    : Corrupt
bacula.Job                                         OK
bacula.JobHisto                                    OK
bacula.JobMedia                                    OK
bacula.Location                                    OK
bacula.LocationLog                                 OK
bacula.Log                                         OK
bacula.Media                                       OK
bacula.MediaType                                   OK
bacula.Path                                        OK
bacula.PathHierarchy                               OK
bacula.PathVisibility                              OK
bacula.Pool                                        OK
bacula.Status                                      OK
bacula.Storage                                     OK
bacula.UnsavedFiles                                OK
bacula.Version                                     OK
real    2m8.610s
user    0m0.000s
sys     0m0.008s
 
Si ven el tiempo de ejecucion fue un poco mas.
MyIsamChk 

Ya sabemos que tabla esta danada, ahora vamos a tratar de repararla, los archivos que este comando nos pide son los que tienen extension "MYI". asi que vamos a ejecutar el comando de la siguiente manera.

Si saben donde esta el archivo deben darle la ruta de el o bien se meten a el folder donde estan los archivos, en mi caso es:


/var/lib/mysql/bacula

Pero antes de vamos a apagar el servicio en lo que reparamos la tabla, claro esto lo hago ya despues de horas de trabajo, cuando se que a nadie le afecta si el servicio no esta operando.

 
service mysql stop

 
Ahora si, segun el comando tenemos 2 parametros a usar para la reparacion:

-r == repara de manera rapida, la mayor parte del tiempo funciona.
-o == repara al modo antiguo, este siempre funciona, es mas lento pero efectivo.

Yo hago uso del metodo antiguo por ello uso el parametro -o, tengo tiempo, nadie me esta esperando por el servicio asi que lo ejecuto:
 

time myisamchk -o Filename.MYI
- recovering (with keycache) MyISAM-table 'Filename.MYI'
Data records: 1409502
Found block that points outside data file at 69038076
Data records: 1409472

real    0m27.491s
user    0m19.417s
sys     0m0.384s
 

Bien parece que todo esta reparado, ahora si a levantar el servicio de nuevo.
 

service mysql start
 

De nuevo regresamos a el comando mysqlchk para revisar nuestra base de datos:
 

time mysqlcheck --check -e  -B bacula -p
Enter password:
bacula.BaseFiles                                   OK
bacula.CDImages                                    OK
bacula.Client                                      OK
bacula.Counters                                    OK
bacula.Device                                      OK
bacula.File                                        OK
bacula.FileSet                                     OK
bacula.Filename                                    OK
bacula.Job                                         OK
bacula.JobHisto                                    OK
bacula.JobMedia                                    OK
bacula.Location                                    OK
bacula.LocationLog                                 OK
bacula.Log                                         OK
bacula.Media                                       OK
bacula.MediaType                                   OK
bacula.Path                                        OK
bacula.PathHierarchy                               OK
bacula.PathVisibility                              OK
bacula.Pool                                        OK
bacula.Status                                      OK
bacula.Storage                                     OK
bacula.UnsavedFiles                                OK
bacula.Version                                     OK

real    4m56.098s
user    0m0.000s
sys     0m0.000s
 

Listo, asi es como debemos tener nuestras tablas, ahora si a seguir trabajando, saludos!!!

viernes, 7 de octubre de 2011

Centos 5: Virtualizando Windows con Xen 4.x.

Ahora que ya logre que Xen 4.1.1 del repo de Gitco funcionara, es momento de llevar a cabo la instalacion de Windows7 para empezar, necesito correr a este software para instalar una app que solo se puede ejecutar ahi y ademas otras cosas que deben correr en Centos asi que vamos a virtualizar Windows 7 y Centos 5.7.

Este vez le toca a windows 7 Pro, ya que estara bajo un dominio con un PDC Linux por ello no debe ser una version home edition.

Vamos empezando:

1; Sacar la imagen del DVD de instalacion, mi maquinas virtuales estaran almacenadas en la particion:

/opt/

Ahi voy a crear un folder:

cd /opt
mkdir vmwin7
cd vmwin7

Sacamos la imagen:

dd if=/dev/dvdrw of=win7Pro.iso

Tarda un rato, pero con esto tenemos nuestra imagen lista para hacer usadas por Xen.

2; Crear la imagen para ser usada como disco duro virtual, vamos a crear una de unos 65GB, no requiero mas ya hice mis calculos y no es necesario mas.

dd if=/dev/zero of=win7Pro.img oflag=direct bs=1M count=65535

Tambien tarda un rato, ya tenemos nuestros 2 archivos:

-rw-r--r-- 1 root root 68718428160 Oct  7 20:31 win7Pro.img
-rw-r--r-- 1 root root  2564784128 Oct  7 19:01 win7Pro.iso

3; Crear la vm:

La gran ventaja de esto, que a mi en lo personal me agrada es:

a) No requiero tener una instalacion grafica en el server, un servidor solo debe ejecutar los programas necesarios.

b) Atraves de otra maquina puedo llevar a cabo las instalaciones de este tipo, ya que trae soporte para VNC de fabrica.

Que mas necesitamos?

Aqui vamos:

virt-install -n darwin -r 2048 -f /opt/vmwin7/win7Pro.img -b xenbr0 --vnc --vnclisten=192.168.2.48  -v -c /opt/vmwin7/win7Pro.iso

esto recibo de mensajes:

Starting install...
Creating domain...                                                                                                                                                             |    0 B     00:00

(virt-viewer:5331): Gtk-WARNING **: cannot open display:
Domain installation still in progress. You can reconnect to
the console to complete the installation process.

Para Windows XP:

virt-install -n xp1 -r 2048 -f /opt/xp1/winxp.img -b virbr0 --vnc --vnclisten=192.168.2.48 -v -c /opt/xp1/windowsxppro.iso

Para Windows 2003:

virt-install --name win2k3 --ram 2048 --hvm --vcpus=2  --cpuset="auto" --disk path=/vm/win2k3/win2k3.img --network bridge=xenbr0 mac=mac-address --vnc --vnclisten=192.168.2.21  --os-type=windows --os-variant=win2k3 --noautoconsole --cdrom /vm/win2k3/win2k3.iso --video=cirrus

Aqui fuimos mas especificos, es cuestion de jugar con todos los parametros de virt-install, el parametro:

--noautoconsole

Nos sirve para eliminar el mensaje:

(virt-viewer:5331): Gtk-WARNING **: cannot open display:

Vamos revisando que dice xen:

xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  1024     1     r-----    324.5
darwin                                       5  2048     1     -b----     13.7

Algo aparte del DOM-0 esta ejecutandose, como le dije me abriera una conexion a esta instalacion vnv a el IP del server, vamos revisando en otro equipo para ver si es cierto:

Figura 1: Instalacion desde una sesion VNC.

No voy a poner mas imagenes ya que me puede llevar mas tiempo, lo importante es saber como llevar a cabo esto con Xen+Centos.

La 1ra vez reiniciara y no abra manera de que reinicie solo, asi que vamos a crear el archivo de configuracion de Windows 7 en xen, lo voy a llamar vm-darwin y lleva esto:

name = "Darwin"
uuid = ""
memory = 2048
vcpus = 2
cpus = "1,2"
builder = "hvm"
kernel = "/usr/lib/xen/boot/hvmloader"
boot = "c"
pae = 1
acpi = 1
apic = 1
localtime = 0
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "destroy"
device_model = "/usr/lib64/xen/bin/qemu-dm"
sdl = 0
vnc = 1
display = "Darwin:0.0"
vncunused = 1
vnclisten = "192.168.2.48"
vncpassword = ""
keymap = "en-us"
disk = [ "file:/opt/vmwin7/win7Pro.img,hda,w" ]
vif = [ "mac=00:16:36:09:96:b6,bridge=xenbr0,script=vif-bridge" ]
parallel = "none"
serial = "pty"

El dato mas critico es la MAC address, yo tengo un control de ellas, atraves de otras se cual colocarlo, voy a meterme mas de lleno aqui para poner saber como generar este dato, aqui agarre la otra maquina y jugarle, los 2 primero digitos son de entrada.

Ahora lo volvemos arrancar para que continue la instalacion:

xm create /etx/xen/vm-darwin

Como ya le indicamos que cuando reciba un reboot --> reinicie entonces ya el debe hacerlo sin intervencion de nosotros.

Figura 2: Windows 7 Instalado bajo Xen

Ya solo vamos a terminar de configurarlo y listo.

Ya una vez terminado el proceso de instalacion, recordar que como en mi caso no estoy haciendo uso de ningun entorno grafico, le instale rapidamente el servicio VNC para poder administrarlo remotamente y no he tenido problemas hasta el momento.

Para Widows 2008:

virt-install -n win8-2 -r 2048 --hvm --vcpus=2 --cpuset=2-3 --disk path=/opt/win8-2/win8-disk.img --os-type=windows --os-variant=win2k8 -b bridge0 --noautoconsole --vnc --vnclisten=192.168.50.107 -v --cdrom /dev/dvdrw

Aqui estoy usando mi interface bridge0.

Imagen de la instalacion via VNC:

Figura 3: Arranque de instalacion de windows 2008.
Figura 4: Empieza la instalacion de windows 2008.

Esto tenemos en consola:

Starting install...
Creating domain...                                                                                                                                                     |    0 B     00:00
Domain installation still in progress. Waiting for installation to complete.
Domain has shutdown. Continuing.
Starting domain...                                                                                                                                                     |    0 B     00:01
Domain installation still in progress. Waiting for installation to complete.
Domain has shutdown. Continuing.
Guest installation complete... restarting guest.


Como podran ver, ya tenemos a windows 2008 virtualizado tambien, listo.

Ya solo debemos configurar su archivo de arranque para que cada que inicie el servidor cargue esta maquina virtual.
Quedaria en mi caso asi:

name = "Win8-2"
uuid = "6196ef50-71ed-e5e8-6b47-f109c7245139"
memory = 2048
vcpus = 2
cpus = "2,3"
builder = "hvm"
kernel = "/usr/lib/xen/boot/hvmloader"
boot = "c"
acpi = 1
apic = 1
localtime = 0
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "destroy"
device_model = "/usr/lib64/xen/bin/qemu-dm"
sdl = 0
vnc = 1
display = "Win8-2:0.0"
vncunused = 1
vnclisten = "192.168.50.107"
vncpassword = ""
keymap = "en-us"
disk = [ "file:/opt/win8-2/win8-disk.img,hda,w" ]
vif = [ "mac=MI-MAC-ADDRESS,bridge=bridge0,script=vif-bridge" ]
parallel = "none"
serial = "pty"

La 1ra vez habilito VNC, pero una vez configurado RDP ya me olvido de el y solo lo deshabilito.

Listo.

Centos 5: Boot Xen 4.1 Gitco


 Me vi en la necesidad de instalar otra maquina con Xen, cuando se trata de virtualizar me gusta tener software mas actualizado, lo malo que Centos no esta a la vanguardia en esto, y en la rama 6 ya mejoraron las cosas.

 Desgraciadamente no puedo aun moverme a la rama 6 ya que varios de mis servidores estan en la 5.7 y migrar todos seria un poco complicado, y no complicado, con la carga de trabajo no me es facil(tiempo).

  Ahora si deseamos hacer unos de las funciones que nos brinda la version 4.1 de Xen tenemos solo 3 opciones:

1) Hacerlo a mano.
2) Hacer uso de repo externos como Gitco.
3) Usar la version que trae por default Centos si no queremos complicarnos la existencia.

Yo opto por la #2.

Ahora lo que tenemos que hacer es lo siguiente:

a)Deshistalar todo el paquete que no sea de utilidad.

yum remove ...

b)Actualizar nuestro sistema:

yum update

c) Apagar servicios que no sean necesarios, y deshabilitarlos:

service nombre-del-servicio stop
chkconfig nombre-del-servicio off

d) Bajar el repo de Gitco:

cd /etc/yum.repos/
wget http://www.gitco.de/repo/GITCO-XEN4.1.1_x86_64.repo

e) Deshistalar todo lo relacionado a Xen(si ya tenian algo):

yum groupremove Virtualization

NOTA: Yo no uso selinux lo tengo deshabilitado.

Con lo anterior hecho, reiniciamos.

Ya de regreso:

f)La instalacion:

yum groupinstall Virtualization

Por default Centos deja el el kernel normal como arranque, pero yo quiero el otro asi que modifico la prioridad, ademas, Xen tiene un footprint muy pequeo, no requerimos 1TB de memoria, los ultimos benchmark que saque me indicaron que con 1GB de memoria trabaja sin problemas.

Ademas decian que solo requeria un Core del #total que tenemos, pero el benchmark me dijo que deberia dejarle 2 ya que todas mis instalaciones llevan un arreglo de disco, ya sea Raid5/Raid10, el Raid1 no tiene problemas los otros si les beneficia dejarle 2 cores a el DOM-O.

Asi queda mi kernel:


default=0
timeout=5
splashimage=(hd1,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-274.3.1.el5xen)
        root (hd1,0)
        kernel /xen.gz-4.1.1 dom0_max_vcpus=2 dom0_vcpus_pin dom0_mem=1024MB
        module /vmlinuz-2.6.18-274.3.1.el5xen ro root=/dev/VolGroup00/LogVol00 pci=nomsi
        module /initrd-2.6.18-274.3.1.el5xen.img
title CentOS (2.6.18-274.3.1.el5)
        root (hd1,0)
        kernel /vmlinuz-2.6.18-274.3.1.el5 ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.18-274.3.1.el5.img
title CentOS (2.6.18-194.el5)
        root (hd1,0)
        kernel /vmlinuz-2.6.18-194.el5 ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.18-194.el5.img

Si usteds creen que 1 solo core es necesario para su DOM-0, entonces cambian el parametro: dom0_max_vcpus=1.

Con todo lo anterior le pedimos que:

Si tengo un server que me da N numero de cores
Me da M numero de memoria RAM

Que solo me de: 2 cores de mi N numero y que solo le asigne el M cantidad de memoria RAM, asi la demas Xen podra administrarla para sus VM's, de lo contrario Xen tendria que preocuparse en buscar que core ejecutar las tareas tanto del DOM-0 y como de sus DOM-U si no le especificamos estos datos.

Le agregue por ultimo el parametro:

pci=nomsi

Por que Xen no quiso arrancar, segun gitco en el README dice:


IMPORTANT: I cannot ensure the stability of these packages, 
so feel free, if you deploy them on a production environment !

xen3.4.3 (x86_64)   => stable
xen4.1.0 (x86_64)   => stable (in some cases, you need the kernel parameter pci=nomsi)

xen4.1.1 (x86_64)   => stable (in some cases, you need the kernel parameter pci=nomsi)

Asi que eso hice y funciono.
 
Ahora ya tengo un Xen listo para operar:
 

xm info
host                   : impexpo.import.local
release                : 2.6.18-274.3.1.el5xen
version                : #1 SMP Tue Sep 6 20:57:11 EDT 2011
machine                : x86_64
nr_cpus                : 4
nr_nodes               : 1
cores_per_socket       : 4
threads_per_core       : 1
cpu_mhz                : 3000
hw_caps                : 178bf3ff:efd3fbff:00000000:00001710:00802001:00000000:000037ff:00000000
virt_caps              : hvm
total_memory           : 3839
free_memory            : 2766
free_cpus              : 0
xen_major              : 4
xen_minor              : 1
xen_extra              : .1
xen_caps               : xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64
xen_scheduler          : credit
xen_pagesize           : 4096
platform_params        : virt_start=0xffff800000000000
xen_changeset          : unavailable
xen_commandline        : dom0_max_vcpus=2 dom0_vcpus_pin dom0_mem=1024MB
cc_compiler            : gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)
cc_compile_by          : root
cc_compile_domain      : gitco.tld
cc_compile_date        : Sun Sep  4 23:28:19 CEST 2011
xend_config_format     : 4

\ \/ /___ _ __   | || |  / | / |
 \  // _ \ '_ \  | || |_ | | | |
 /  \  __/ | | | |__   _|| |_| |
/_/\_\___|_| |_|    |_|(_)_(_)_|

(XEN) Xen version 4.1.1 (root@gitco.tld) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)) Sun Sep  4 23:28:19 CEST 2011
(XEN) Latest ChangeSet: unavailable
(XEN) Bootloader: GNU GRUB 0.97
(XEN) Command line: dom0_max_vcpus=2 dom0_vcpus_pin dom0_mem=1024MB
(XEN) Video information:
(XEN)  VGA is text mode 80x25, font 8x16
(XEN)  VBE/DDC methods: V2; EDID transfer time: 1 seconds
(XEN) Disc information:
(XEN)  Found 2 MBR signatures
(XEN)  Found 2 EDD information structures
(XEN) Xen-e820 RAM map:
(XEN)  0000000000000000 - 000000000009f400 (usable)
(XEN)  000000000009f400 - 00000000000a0000 (reserved)
(XEN)  00000000000e6000 - 0000000000100000 (reserved)
(XEN)  0000000000100000 - 00000000cffb0000 (usable)
(XEN)  00000000cffb0000 - 00000000cffbe000 (ACPI data)
(XEN)  00000000cffbe000 - 00000000cffe0000 (ACPI NVS)
(XEN)  00000000cffe0000 - 00000000d0000000 (reserved)
(XEN)  00000000ff700000 - 0000000100000000 (reserved)
(XEN)  0000000100000000 - 0000000120000000 (usable)
(XEN) ACPI: RSDP 000FB4E0, 0014 (r0 ACPIAM)
(XEN) ACPI: RSDT CFFB0000, 0040 (r1 060710 RSDT1719 20100607 MSFT       97)
(XEN) ACPI: FACP CFFB0200, 0084 (r2 060710 FACP1719 20100607 MSFT       97)
(XEN) ACPI: DSDT CFFB0450, 99F6 (r1  78LCP 78LCP607       16 INTL 20051117)
(XEN) ACPI: FACS CFFBE000, 0040
(XEN) ACPI: APIC CFFB0390, 007C (r1 060710 APIC1719 20100607 MSFT       97)
(XEN) ACPI: MCFG CFFB0410, 003C (r1 060710 OEMMCFG  20100607 MSFT       97)
(XEN) ACPI: OEMB CFFBE040, 0071 (r1 060710 OEMB1719 20100607 MSFT       97)
(XEN) ACPI: SRAT CFFB9E50, 00E8 (r3 AMD    FAM_F_10        2 AMD         1)
(XEN) ACPI: HPET CFFB9F40, 0038 (r1 060710 OEMHPET  20100607 MSFT       97)
(XEN) ACPI: SSDT CFFB9F80, 088C (r1 A M I  POWERNOW        1 AMD         1)
(XEN) System RAM: 3839MB (3931452kB)
(XEN) Domain heap initialised
(XEN) Processor #0 0:5 APIC version 16
(XEN) Processor #1 0:5 APIC version 16
(XEN) Processor #2 0:5 APIC version 16
(XEN) Processor #3 0:5 APIC version 16
(XEN) IOAPIC[0]: apic_id 4, version 33, address 0xfec00000, GSI 0-23
(XEN) Enabling APIC mode:  Flat.  Using 1 I/O APICs
(XEN) Table is not found!
(XEN) Using scheduler: SMP Credit Scheduler (credit)
(XEN) Detected 3000.291 MHz processor.
 
A trabajar sobre el, saludos!!! 



sábado, 27 de agosto de 2011

Pfsense 2 Squid Deshabilitar Cache


Squid nos permite a nosotros deshabilitar el cache, este es util en sistemas embebidos donde tenemos como medio de almacenamiento una tarjeta de memoria CF de 2 GB.

Si estamos usando el GUI de pfsense tenemos que hacer lo siguiente:

Figura 1. Deshabilitando cache de GUI.

Una vez hecho esto, salvamos y listo. Ahora si desean ver que le paso a nuestra archivo de configuración entonces, vamos a tener estos cambios:

Figura 2. squid.conf con cache deshabilitado.

Como pueden ver ahi esta el parametro dado de alta, su cache.log ya no registrara nada.

Ahora van a ver su archivo log access.log casi puros TCP_MISS:

Figura 3. access.log TCP_MISS.

Saludos!!!

sábado, 2 de julio de 2011

Pfsense 2 OpenVPN Site2Site TLS/SSL

Vamos a ver, esta ultimas semanas hemos estado trabajando duro con Pfsense 2.0RC3 Current i386 para unir 2 redes atraves de una VPN, hay ocaciones donde no es posible alquilar una T1 para este tipo de tareas, no quedaria nada de ganancia para la empresa.

Por ello con los costos que se manejan actualmente en las conexiones tipo ADSL/Cable y las velocidades uno en el area voltea a verlas como una opcion.

Ahora hablando de las VPN, he trabajado con OpenVPN desde la version 1.0 de Pfsense si mal no recuerdo, desde que conoci a este firewall basado en FreeBSD me enfoque de lleno en el, ya que yo conoci a el mundo Unix gracias a FreeBSD y aun maestro(Lic. en Informatica Rene) de redes del Instituto Tecnologico de Tijuana, gracias profe.

Bien, anteriormente teniamos que hacer uso de las herramientas de openvpn que son usa serie de scripts que nos generan los archivos necesarios para tener una comunicacion segura, ya que el tema es: OpenVPN SSL/TLS, el cual se basa en tener una llave privada y una publica con la cual el tunel encriptara/desencriptara los paquetes que por ahi fluyan, esto es termimos basicos.

Ahora con pfsense 2.0 esto a cambiado, ya que el trae atraves de su gui las herramientas necesarias para llevar a cabo la generacion de los archivos antes mencionados.

Vamos a mostrar la red que deseamos unir atraves de openvpn.


Como se podra ver es una red muy comun, ahora esa red que se muestra pareciera que todo esta comunicado pero no, ya que solo muestro que ambas redes tiene una conexion a Internet, pero no hay ningun medio de comunicacion seguro entre ambas.

Por default sabemos que pfsense pide como minimo 2 tarjetas de red:
  • LAN
  • WAN
Son las que se muestran en la figura 1.

No voy a entrar en detalle hacerca openssl, PKI, etc, ya que de eso ahi mucho en Internet.

Vamos ensuciarnos las manos.

Certificados

Que necesitamos?

1; CA.
Common Name: ca.

2; Certificado Servidor.
Common Name: server.

Esto nos va generar en total 4 archivos.
  • ca.crt ===> todos deben ternerlo ==> Secreto (No)
  • ca.key ===> todos deben ternerlo ===> Secreto (Si)
  • server.crt ===> Solo el server debe tenerlo ===> Secreto (No)
  • server.key ===> Solo el server debe tenerlo ===> Secreto (Yes)
Estos son los archivos que va a necesitar el server, ahora tambien tenemos que generar los archivos del cliente y tendremos esto:

1; cliente1.
Common Name: cliente1.

Esto nos va generar en total 2 archivos.
  • cliente1.crt ==> Debe tenerlos tanto el cliente1 como el server ===> Secreto(No).
  • cliente1.key ===> Debe tenerlos tanto el cliente1 como el server ===> Secreto (Si)
Algo que tiene openvpn es que uno puede usar los mismos archivos del cliente en N numero de clientes pero no esto no me agrada, por ello yo prefiero generar para cada uno sus respectivas credenciales.

Dyndns

OpenVPN se basa en la direccion de Internet, pero con un servicio de adsl/cable nuestras direcciones publicas cambian y es dificil para OpenVPN mantener a el dia su operacion. Internet no es nada sin los DNS asi que por ello hago uso del servicio de dyndns y tengo lo siguiente:
  • server . dyndns . org
  • cliente1 . dyndns . org
Una vez dados de alta, debemos configurar el servicio de "Dynamic DNS".

Figura 2: Configurando Dinamic Dyndns.

Figura 3: Estatus de Dinamic Dyndns..

Esto debe hacerse en todos sus servers y clientes, la figura 3 nos debe mostrar nuestra IP en color, si no muestra su IP deben solucionarlo, lo que me ha pasado es que a veces el password lo pongo mal.

Creando credenciales--Cert Manager

1; Creando el CA certificado de Autenticidad.

Figura 4: Creando CA.

Figura 5: Ingresando datos de CA.

Debemos poner atención en los datos que ingresamos y siempre recordar el nombre que se ingresa en "Common Name" debe ser unico.

Y sobre todo el valor que elegimos en la duracion de la llave, ya que si se nos olvida y llega su tiempo la conexion se caera automaticamente, pero a muchos les gusta poner datos muy grandes para nunca preocuparse de cambiarlas, yo estoy usando 365 dias, pero me gusta mas hacer esto cada 180 dias.

Otro campo que deben ustedes juzgar en sus pruebas es el tamaño en bits de la llave, esto tiene una relacion con el CPU, ya que mientras mas grande, mas segura pero esto sacrifica CPU, si van a conectar varias redes aun punto central recordar que el server debe ser un equipo con un buen CPU.

Figura 6: Resultado de la creacion del CA.

Como podran ver ya tenemos el CA del server, con este vamos a firmar todos los certificados que vamos a crear enseguida.


Figura 7: Creacion de certificados.

Figura 8: Creando el certificado del servidor.

Ver la figura 8, hemos basado los datos en los que ingresamos cuando creamos los CA, recordar siempre nuestro "Common Name".

Figura 9: Creando certificado de nuestro cliente.

Figura 10: Listado de certificados creados.

Figura 11: Nuestro CA mostrando los certificados firmados.

Ya tenemos todos nuestros archivos creados, es momento de ir a openvpn a configurar nuestro 1er servidor.

OpenVPN

Vamos mostrando en nuestra red quien sera el server y quien sera el cliente1 para mayor claridad.


Figura 12: Detalle de red con OpenVPN.

La figura 12 muestra claramente donde vamos a iniciar la configuracion, sera en la red marcado como "OpenVPN-server" ahi es donde mi cliente desea entrar a utilizar mis recursos que son impresoras, servidor ERP, servidores de bases de datos, correo, archivos compartidos, etc.

Recordar que en OpenVPN no cambia el diseño servidor-cliente, por cada red que deseamos conectar a nuestro tunel(server) creamos un cliente, empezamos.

Figura 13: Creando el servidor.

Figura 14: Configurando el server.

Nuestro tunel cruzara por la red: 10.0.99.0/24, ninguna de sus redes debe hacer uso de esta red, el server siempre tomas las primera IP de esa red:

Figura 15: Interface del server.

Figura 16: Mostrando el server creado.

Ahora, yo deseo agregar unos parametros para mi cliente importantisimos de lo contrario mi tunel no funcionara bien. Para ello hago uso de la etiqueta que dice "Custom specific override¨.

Figura 17: Agregando parametros adicionales a mi cliente1.

Figura 18: Estatus de la opcion personalizada.

Hasta aqui hemos terminado la configuraciion de nuestro servidor de parte de OpenVPN, lo que sigue es abrir el puerto en el firewall para permitir el acceso a server por parte de los clientes, datos de la conexion:
  • Interface: WAN.
  • Protocolo: UDP.
  • Puerto: 1194 (Default).
Con esto se supone que nuestro servidor debe estar escuchando por peticiones en ese puerto via UDP, vamos a revisar:

Figura19: Server escuchando peticiones.

Lo que sigue es abrir el puerto 1194 en la WAN:

Figura 20: Regla para OpenVPN.

Figura 21: Estatus de la regla.

Algo que hace Pfsense automaticamente es agregar una interface llamada "Openvpn" en las reglas de su firewall y es sencilla "Todo entra y sale", que es lo hace en la v. 1.2.3, la diferencia es que ahora uno ya puede controlarla aun mas por que ya podemos configurar nuestras reglas como en la LAN/WAN,algo que muchos pediamos en las versiones anteriores, por fin se cumplio.

Figura 22: Regla de VPN en el firewall.

Ya con esto podemos recibir a nuestros clientes.

Configuracion de nuestro 1er cliente

Vamos sobre nuestro 1er cliente que desea accesar atraves de OpenVPN de manera segura.

Pero antes de llegar a openvpn, debemos recordar que nuestro cliente necesita ciertas credenciales para entablar esa comunicacion, arriba se los aclare, necesitamos por parte del server:
  • ca.crt
  • ca.key
  • cliente1.crt
  • cliente1.key
Vamos a bajarlos a nuestra computadora, ustedes deciden como llevarlos hasta el server yo uso memorias usb y voy fisicamente a el cliente1 para darselos.

Figura 23: Bajando archivos CA.

Figura 24: Bajando archivos de nuestro cliente.

Una vez que tiene su cliente esos archivos es momento de darselos, para ello deben abrirlos en con algun editor de texto, yo estoy usando WordPad, copeo el contenido y lo pego donde lo necesito:

Figura 25: Agregando CA as cliente1.

Figura 26: Contenido ejemplo de el contenido de las credenciales.

Figura 27: Pegando el contenido en cada campo.

Figura 28: CA dado de alta en nuestro cliente1.

Figuara 29: Dando de alta los certificados del cliente1.

Figura 30: Agregar el contenido donde se indica.

Figura 31: Certificados de cliente1 dados de alta.

Ya tenemos de lado del cliente todo lo necesario, lo que sigue es configurar nuestro openvpn para entablar la comunicacion con nuestro server.

Figura 32: Configurando cliente1.

Figura 33: Configuracion de cliente1.

Figura 34: Finalizacion de cliente1.

Figura 35: Estatus de OpenVPN en el server.

Figura 36: Estatus de OpenVPN en cliente1.

Probando Comunicacion

Ya nuestro tunel esta arriba, nuestro pfsense-cliente estos datos de interface del tunel:

Figura 37: Interface vpn del cliente1.

Ahora el tunel esta creado, pero si ustedes de cualquier lado del tunel tratan de llegar a los clientes no pasaran, porque una cosa es comunicacion entre el tunel 10.0.99.0/24 y otra cosa esa comunicacion entre las redes fisicas 192.168.2.0/24 y 192.168.50.0/24. Entonces la regla del tunel esta libre, ustedes deben abrir a nivel LAN en ambos lados para que fluya la comunicacion entre las 2 redes. En su firewall de lado del server abran una regla que permita todo de su LAN hacia la red 192.168.50.0/24, lo mismo del lado del cliente, una regla LAN que permita el trafico hacia la 192.168.2.0/24, pueden crear hasta un alias si gustan, esto es para pruebas, cuando se vayan a produccion deben permitir solo lo necesario.

Pingeo entre ambos servidores

Figura 38: Pingeo operando en ambos lados.

Figura 39: Pingeo de lado del cliente.

Figura 40: Pingeo de lado del server.

Listo.

Parece que la comunicacion esta operando, espero les sirva a alguien, lo que sigue es ajustar o probar varias tipos de escenarios principalmente lo referente a el tamaño de las llaves, el algoritmo de encriptacion, mientras mas fuerte creemos las llaves o elijamos un algoritmo mas alto recordar que su CPU sera afectado, pero esto sus pruebas se los diran y ustedes tendran que tomar la decision, saludos.

Versiones de pfsense

Figura 41: Version de pfsense para este manual.

Necesitan soporte en Baja California y sus alrededores: pmoreno@bajaopensolutions.com

NOTE: If u want this manual to be translate to English let me know please!!!