SafeChildren Banner

Havoc Oracle Solaris Experts

lunes, 31 de mayo de 2010

Instalar IPFilter en OpenSolaris

Introducción
Ya hemos visto con anterioridad Cómo Instalar IPFilter en Solaris 10 paso a paso, ahora vamos a ver cómo instalar IPFilter en una zona de OpenSolaris, simplemente deberemos utilizar la herramienta <pkg> con el paquete <ipfilter>.

Esto, nos descargará los archivos necesarios y nos permitirá gestionarlo desde el framework SMF, a partír de aquí el proceso de Instalación y Configuración de IPFilter será igual que en Solaris 10
root@zrouter-ext:~# pkg install ipfilter
DOWNLOAD                                  PKGS       FILES    XFER (MB)
Completed                                  1/1       51/51      1.0/1.0

PHASE                                        ACTIONS
Install Phase                                  99/99
root@zrouter-ext:~# svcs ipfilter
STATE          STIME    FMRI
disabled        9:57:09 svc:/network/ipfilter:default
Conclusiones
El proceso de instalación es similar al de Solaris, con la única salvedad que para poder instalar los binarios debemos de instalarlos utilizando el comadno <pkg>

Referencias

viernes, 28 de mayo de 2010

Instalar Java JDK en OpenSolaris

Introducción
Por defecto, nuestras instalaciones de OpenSolaris vienen con el JRE de Java -el Runtime- pero no el JDK -necesario para Tomcat, por ejemplo-

Para ello, deberemos instalar los paquetes <jdk> y <jdk64> -para 64bits- utilizando el comando <pkg>
root@appserver:~# pkg install jdk
DOWNLOAD                                  PKGS       FILES    XFER (MB)
Completed                                  3/3   1334/1334    70.7/70.7 

PHASE                                        ACTIONS
Install Phase                              1717/1717 
root@appserver:~# pkg install jdk64
DOWNLOAD                                  PKGS       FILES    XFER (MB)
Completed                                  2/2       94/94      7.4/7.4 

PHASE                                        ACTIONS
Install Phase                                153/153 
root@appserver:~# which java
/usr/bin/java
root@appserver:~# java -d64 -version
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)

Conclusiones
OpenSolaris nos ofrece una forma muy sencilla de gestionar los paquetes, pero "siempre debemos estar conectados" y por lo tanto, "puede" que en alguna ocasión nos traiga algún problema.

Por ello, debéis recordar que OpenSolaris es "Solaris" y siempre podemos utilizar la forma tradicional de instalación de paquetes -utilizando <pkgadd> que no requiere de conexión a Internet


Referencias



martes, 25 de mayo de 2010

Instalar MemCached (32bits) en OpenSolaris

Introducción
Ya hemos visto anteriormente Cómo Instalar Memcached (32bits) en Solaris 10, sin embargo, ahora vamos a ver cómo podemos instalarlo sobre OpenSolaris.

La verdad es que el proceso de instalación es muy similar -no en vano OpenSolaris es Solaris- y sólo debemos tener en cuenta algunas cosas.

Si instalamos MemCached desde el binario para Solaris 10 que os preparé, y queremos hacer la instalación sobre una zona creada en OpenSolaris utilizando el instalador de texto, es probable que las bibliotecas de ejecución de GCC <GCC Runtime> no se encuentren instaladas, y eso nos haga aparecer un <Not Found> en la consulta del comando <ldd>.

Vamos a ver cómo podemos instalar memcached en OpenSolaris paso a paso utilizando el binario de MemCached 1.4.5 para Solaris 10 x86
root@appserver:/# cd /opt
root@appserver:/opt# wget http://blog.sfchildren.com/blogger/memcached/binary/memcached-1.4.5-SOLARIS-X86.tar.gz
root@appserver:/opt# gzip -dc memcached-1.4.5-SOLARIS-X86.tar.gz | tar xvpf -
x memcached/32, 0 bytes, 0 tape blocks
x memcached/32/include, 0 bytes, 0 tape blocks
x memcached/32/include/memcached, 0 bytes, 0 tape blocks
x memcached/32/include/memcached/protocol_binary.h, 14855 bytes, 30 tape blocks
x memcached/32/share, 0 bytes, 0 tape blocks
x memcached/32/share/man, 0 bytes, 0 tape blocks
x memcached/32/share/man/man1, 0 bytes, 0 tape blocks
x memcached/32/share/man/man1/memcached.1, 5304 bytes, 11 tape blocks
x memcached/32/run, 0 bytes, 0 tape blocks
x memcached/32/bin, 0 bytes, 0 tape blocks
x memcached/32/bin/memcached, 97104 bytes, 190 tape blocks
x memcached/libevent, 0 bytes, 0 tape blocks
x memcached/libevent/32, 0 bytes, 0 tape blocks
x memcached/libevent/32/include, 0 bytes, 0 tape blocks
x memcached/libevent/32/include/event-config.h, 8243 bytes, 17 tape blocks
x memcached/libevent/32/include/evrpc.h, 16358 bytes, 32 tape blocks
x memcached/libevent/32/include/event.h, 37776 bytes, 74 tape blocks
x memcached/libevent/32/include/evhttp.h, 11561 bytes, 23 tape blocks
x memcached/libevent/32/include/evdns.h, 18900 bytes, 37 tape blocks
x memcached/libevent/32/include/evutil.h, 5529 bytes, 11 tape blocks
x memcached/libevent/32/bin, 0 bytes, 0 tape blocks
x memcached/libevent/32/bin/event_rpcgen.py, 45502 bytes, 89 tape blocks
x memcached/libevent/32/share, 0 bytes, 0 tape blocks
x memcached/libevent/32/share/man, 0 bytes, 0 tape blocks
x memcached/libevent/32/share/man/man3, 0 bytes, 0 tape blocks
x memcached/libevent/32/share/man/man3/evdns.3, 11563 bytes, 23 tape blocks
x memcached/libevent/32/share/man/man3/event.3, 17705 bytes, 35 tape blocks
x memcached/libevent/32/lib, 0 bytes, 0 tape blocks
x memcached/libevent/32/lib/libevent_core.la, 891 bytes, 2 tape blocks
x memcached/libevent/32/lib/libevent_core-1.4.so.2.1.3, 98224 bytes, 192 tape blocks
x memcached/libevent/32/lib/libevent.la, 856 bytes, 2 tape blocks
x memcached/libevent/32/lib/libevent_extra-1.4.so.2.1.3, 188612 bytes, 369 tape blocks
x memcached/libevent/32/lib/libevent.so symbolic link to libevent-1.4.so.2.1.3
x memcached/libevent/32/lib/libevent-1.4.so.2.1.3, 233872 bytes, 457 tape blocks
x memcached/libevent/32/lib/libevent_core.a, 127760 bytes, 250 tape blocks
x memcached/libevent/32/lib/libevent_core.so symbolic link to libevent_core-1.4.so.2.1.3
x memcached/libevent/32/lib/libevent_core-1.4.so.2 symbolic link to libevent_core-1.4.so.2.1.3
x memcached/libevent/32/lib/libevent_extra.so symbolic link to libevent_extra-1.4.so.2.1.3
x memcached/libevent/32/lib/libevent.a, 290116 bytes, 567 tape blocks
x memcached/libevent/32/lib/libevent_extra.la, 898 bytes, 2 tape blocks
x memcached/libevent/32/lib/libevent-1.4.so.2 symbolic link to libevent-1.4.so.2.1.3
x memcached/libevent/32/lib/libevent_extra.a, 226568 bytes, 443 tape blocks
x memcached/libevent/32/lib/libevent_extra-1.4.so.2 symbolic link to libevent_extra-1.4.so.2.1.3
x memcached/README, 2348 bytes, 5 tape blocks
x memcached/svc, 0 bytes, 0 tape blocks
x memcached/svc/memcached_1, 3874 bytes, 8 tape blocks
x memcached/svc/memcached_1.xml, 5129 bytes, 11 tape blocks
root@appserver:/opt# ls -ltr
total 5
drwxr-xr-x   3 root     root           3 May 25 11:01 www
-rw-r--r--   1 root     root      602334 May 25 12:22 memcached-1.4.5-SOLARIS-X86.tar.gz
drwxr-xr-x   5 root     root           6 May 25 12:22 memcached
root@appserver:/opt# rm memcached-1.4.5-SOLARIS-X86.tar.gz

Verificación de Dependencias
Debemos comprobar que tenemos todas las dependencias instaladas, para ello vamos a utilizar el comando <ldd> y veremos si el enlazador no ha podido encontrar alguna <so>.
NOTA: En función de la arquitectura que tengamos -x86, SPARC- se mostrarán unos archivos u otros, esto no importa mientras no aparezcan referencias <inválidas o no encontradas> En nuestro caso, no se ha encontrado el runtime de GCC -ya que se compiló con GCC-, por eso aparece libgcc_s.so.1 => (File not found)
root@appserver:/opt# cd memcached/32/bin
root@appserver:/opt/memcached/32/bin# ldd memcached
        libumem.so.1 =>  /lib/libumem.so.1
        libnsl.so.1 =>   /lib/libnsl.so.1
        libsocket.so.1 =>        /lib/libsocket.so.1
        libevent-1.4.so.2 =>     /opt/memcached/libevent/32/lib/libevent-1.4.so.2
        libpthread.so.1 =>       /lib/libpthread.so.1
        libc.so.1 =>     /lib/libc.so.1
        libmp.so.2 =>    /lib/libmp.so.2
        libmd.so.1 =>    /lib/libmd.so.1
        libscf.so.1 =>   /lib/libscf.so.1
        librt.so.1 =>    /lib/librt.so.1
        libresolv.so.2 =>        /lib/libresolv.so.2
        libgcc_s.so.1 =>         (file not found)
        libuutil.so.1 =>         /lib/libuutil.so.1
        libgen.so.1 =>   /lib/libgen.so.1
        libsmbios.so.1 =>        /usr/lib/libsmbios.so.1
        libm.so.2 =>     /lib/libm.so.2
Ya hemos visto que nos hace falta el runtime de GCC, por lo tanto, vamos a instalarlo utilizando el comando <pkg install SUNWgccruntime>. 
root@appserver:/# pkg install SUNWgccruntime
DOWNLOAD                                  PKGS       FILES    XFER (MB)
Completed                                  1/1       34/34      1.9/1.9

PHASE                                        ACTIONS
Install Phase                                115/115
Volvemos a comprobar las dependencias, y vemos que ya se ha resulto el problema del runtime de GCC
root@appserver:/# cd /opt/memcached/32/bin/
root@appserver:/opt/memcached/32/bin# ldd memcached
        libumem.so.1 =>  /lib/libumem.so.1
        libnsl.so.1 =>   /lib/libnsl.so.1
        libsocket.so.1 =>        /lib/libsocket.so.1
        libevent-1.4.so.2 =>     /opt/memcached/libevent/32/lib/libevent-1.4.so.2
        libpthread.so.1 =>       /lib/libpthread.so.1
        libc.so.1 =>     /lib/libc.so.1
        libmp.so.2 =>    /lib/libmp.so.2
        libmd.so.1 =>    /lib/libmd.so.1
        libscf.so.1 =>   /lib/libscf.so.1
        librt.so.1 =>    /lib/librt.so.1
        libresolv.so.2 =>        /lib/libresolv.so.2
        libgcc_s.so.1 =>         /usr/sfw/lib/libgcc_s.so.1
        libuutil.so.1 =>         /lib/libuutil.so.1
        libgen.so.1 =>   /lib/libgen.so.1
        libsmbios.so.1 =>        /usr/lib/libsmbios.so.1
        libm.so.2 =>     /lib/libm.so.2
Instalación de MemCached utilizando SVC
Vamos a copiar los archivos para SVC que tenemos en <$MEMCACHED_HOME/svc> -method y manifest- en sus ubicaciones correspondientes. Posteriormente añadiremos el grupo <memcache>, usuario <memcache> y project <user.memcache> definidos en nuestro archivo manifest
root@appserver:/opt/memcached/svc# cp memcached_1 /lib/svc/method
root@appserver:/opt/memcached/svc# groupadd memcache
root@appserver:/opt/memcached/svc# useradd -g memcache -s /bin/bash -d /export/home/memcache -m memcache
80 blocks
root@appserver:/opt/memcached/svc# projadd -G memcache -U memcache -c 'MemCached Project' user.memcache
root@appserver:/opt/memcached/svc# cp memcached_1.xml /var/svc/manifest/application/cache/memcached_1
root@appserver:/opt/memcached/svc# cd /var/svc/manifest/application/cache/memcached_1
root@appserver:/var/svc/manifest/application/cache/memcached_1# svccfg
svc:> validate memcached_1.xml
svc:> import memcached_1.xml
svc:> quit
root@appserver:/var/svc/manifest/application/cache/memcached_1# svcs memcached_1
STATE          STIME    FMRI
disabled       12:34:52 svc:/application/cache/memcached_1:memcached_default32bits
root@appserver:/var/svc/manifest/application/cache/memcached_1# svcadm enable memcached_1
root@appserver:/var/svc/manifest/application/cache/memcached_1# svcs memcached_1
STATE          STIME    FMRI
online         12:42:58 svc:/application/cache/memcached_1:memcached_default32bits
Conclusión
La verdad es que el proceso de instalación sobre OpenSolaris es idéntico a Solaris, además con el uso de los comandos de instalación <pkg> nos simplifica la resolución de dependencias.

Referencias

lunes, 24 de mayo de 2010

Crear un archivo de un tañano en concreto

Introducción
Muchas veces para poder realizar pruebas de rendimiento necesitamos tener archivo con tamaños concretos, por ejemplo para medir la latencia de nuestros servidores Apache HTTP con JMeter.

Para ello, podemos utilizar varios comandos, aunque yo principalmente utilizo dos: <dd> y <mkfile>.

Vamos a crear un archivo de <8Mb> utilizando primero <dd> y luego <mkfile>. El formato del comando <dd> es el siguiente:
dd if={device_origen} of={destino} bs={tamaño de bloque} count={número de veces}
Por lo tanto, si queremos crear un archivo de 8Mb, podemos tener un BlockSize (bs) de 8k y realizar la operación 1024 veces. Vamos a utilizar el device </dev/zero> que nos va a crear un archivo lleno de "ceros".

# time dd if=/dev/zero of=test.dd bs=8k count=1024
1024+0 registros dentro
1024+0 registros fuera

real    0m0.082s
user    0m0.006s
sys     0m0.043s
Pero si queremos que esté lleno de contenido variable podemos utilizar el device </dev/random> para que nos generes secuencias pseudo aleatorias, por ejemplo,
# time dd if=/dev/random of=test.dd_random count=1024
0+1024 registros dentro
0+1024 registros fuera

real    1m52.687s
user    0m0.012s
sys     1m50.498s

Podemos comprobar con un visor octal <od> como al crear el archivo con el device </dev/zero> está lleno de ceros -como es lógico- pero, cuando hacemos lo mismo con el archivo creado utilizando el device </dev/radom> nos ha creado un archivo completamente distinto.

Esto será muy importante cuando utilicemos servicios de compresión -por ejemplo mod_gzip, mod_defalte- ya que comprimirá prácticamente al 99% el archivo creado con </dev/zero> haciéndonos creer que el rendimiento será muy superior al real.

# od -c test.dd
0000000  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
40000000
# od -c test.ddrandom |head -3
0000000 017 260   Ò   -   ;   Р  à  ¿   x   N   < 230   ü 217   a   e
0000020   O   æ 254       k   û   ö   c   4   û 257   -   à  {   þ 271
0000040   Æ   Ù   l 243   Ü   ê   å   å   ] 217   f   >   l   C   É   q
Y si comprimimos los archivos utilizando <gzip> y su máxima compresión <-9>, veremos lo que os he comentado,
# ls -l
total 2048
-rw-r--r--   1 root     root      524288 may 20 11:42 test.dd
-rw-r--r--   1 root     root      524288 may 20 11:13 test.ddrandom
# gzip -9 test.ddrandom
# gzip -9 test.dd
# ls -l
total 1056
-rw-r--r--   1 root     root         551 may 20 11:42 test.dd.gz
-rw-r--r--   1 root     root      524400 may 20 11:13 test.ddrandom.gz
Como vemos, el archivo que hemos creado utilizando <dd if=/dev/zero> comprimido tiene un tamaño de 551 bytes y el creado con <dd if=/dev/random> no solo no ha sido comprimido, sino que ha aumentado de tamaño -por las cabeceras de GZIP-

Por el contrario, si no tenemos intención de utilizar sistemas de compresión, o queremos hacer métricas de uso de disco, podemos utilizar el comando <mkfile> con el siguiente formato
mkfile {tamaño}{unidad} {nombre archivo}
Donde unidad será k para Kb, m para Mb. Por ejemplo, para crear el mismo archivo de 8Mb, utilizaremos el siguiente comando.
# time mkfile 8m test.mkfile

real    0m0.049s
user    0m0.003s
sys     0m0.037s
# od -c test.mkfile
0000000  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
40000000
Como vemos, <mkfile> genera un archivo utilizando como device </dev/zero> al igual que <dd> pero de una forma más sencilla


Referencias

jueves, 20 de mayo de 2010

Cómo mostrar archivos en octal

Introducción
Vamos a ver cómo podemos mostrar archivos utilizando la base octal para ello, vamos a utilizar el comando <od> que viene en el paquete de Solaris <SUNWtoo>

Este comando Octal Dump nos permitirá mostrar el contenido en formato octal de los archivos, utilizando el siguiente formato
$ od -c {archivo}
También podemos utilizar <stdin> como archivo de entrada, por ejemplo
# echo "Hola Mundo" | od -c
0000000   H   o   l   a       M   u   n   d   o  \n
0000013

Referencias

lunes, 17 de mayo de 2010

Gestión y Husos Horarios en PostgreSQL

Introduccion
Hace un tiempo hablábamos de los Husos Horarios en Oracle, hoy toca el turno a PostgreSQL. Vamos a ver como podemos gestionar las fechas con los desplazamientos en nuestra base de datos PostgreSQL.

Vamos a repetir los mismos ejemplos que hicimos con Oracle, para ver las diferencias y comprobar, que -aunque parezca extraño- en PostgreSQL es mucho mas sencillo.

Definición del TimeZone
En PostgreSQL definiremos nuestro TimeZone en el archivo de configuración <$PGDATA/postgres.conf> utilizando la variable <timezone>, sin embargo, si no tenemos asignado un valor, por defecto cogerá el valor de la variable de entorno TZ

$ echo $TZ
Europe/Madrid
Por lo tanto, nuestro <dbtimezone> será <Europe/Madrid> en mi caso.

Obtener los TimeZones
postgres=# SELECT DISTINCT name FROM pg_timezone_names ORDER BY 1;
               name              
----------------------------------
 Africa/Abidjan
 Africa/Accra
 Africa/Addis_Ababa
 Africa/Algiers
 Africa/Asmara
 Africa/Asmera
 Africa/Bamako
...
... continúa ...
...
Obtener la Fecha/Hora del Sistema con TimeZone
Podemos obtener la Fecha y Hora del Sistema con desplazamiento utilizando <now()> o &CURRENT_TIMESTAMP>, en ambos caso el resultado es el mismo.
postgres=# SELECT current_timestamp;
              now             
-------------------------------
 2010-05-17 20:27:39.573957+02
(1 fila)

postgres=# SELECT now();
              now             
-------------------------------
 2010-05-17 20:27:46.809705+02
(1 fila)

Mostrar el Desplazamiento Horario de un TimeZone en concreto
Por ejemplo, si queremos saber cuál es el desplazamiento de US/Arizona
postgres=# SELECT utc_offset FROM pg_timezone_names WHERE name = 'US/Arizona';
 utc_offset
------------
 -07:00:00
(1 fila)
Mostrar una Fecha y Hora con otro TimeZone
Por ejemplo, si queremos saber que Fecha y Hora es <US/Arizona>, utilizaremos el modificador <AT TIME ZONE 'timezone'>, veamos un ejemplo.
postgres=# SELECT now() AT TIME ZONE 'US/Arizona' as Hora_Arizona;
        hora_arizona       
----------------------------
 2010-05-17 11:35:07.475627
(1 fila)

Diferencias con Oracle
La mayor diferencia con Oracle la encontramos con fechas incorrectas, por ejemplo, <2010-03-28 01:10:00 +0100>. Esta hora en España no es válida -ya que a las 02:00h son las 03:00h.
Esto en Oracle produce un error ORA-01878, sin embargo en PostgreSQL se realiza la corrección y nos muestra la hora correcta sin mostrar error alguno, veamos un ejemplo
postgres=# SELECT '2010-03-28 02:10:00'::TIMESTAMP WITH TIME ZONE;                                                                                                                                             timestamptz      
------------------------
 2010-03-28 03:10:00+02
(1 fila)
postgres=# SELECT '2010-03-28 02:10:00 +0200'::TIMESTAMP WITH TIME ZONE;
      timestamptz      
------------------------
 2010-03-28 01:10:00+01
(1 fila)

Conclusiones
Realmente el manejo de Husos horarios en PostgreSQL es muy sencillo, y con la ventaja de esa gestión automática de las horas incorrectas. Además, podemos crearnos alias o funciones que simulen las mismas de Oracle -si nos apetece-

Referencias

viernes, 14 de mayo de 2010

Configurar Mas Tarjetas de Red en VirtualBox

Introducción
En VirtualBox podemos gestionar cuatro (4) tarjetas de Red utilizando el interface gráfico, sin embargo, disponemos de un total de ocho (8) tarjetas de Red -emuladas- disponibles.

Para ello, deberemos utilizar los comandos de <VBoxManage> para poder añadir, eliminar, modificar parámetros desde la  línea de comandos.


Gestionar la Configuración utilizando VBoxManage
Para poder ver la configuración actual de la máquina virtual utilizaremos la opción <showvminfo _vm_name_>, por ejemplo, suponiendo que nuestra máquina virtual se llame SafeChildren Appliance, haremos:

$ ./VBoxManage showvminfo "SafeChildren Appliance"
Sun VirtualBox Command Line Management Interface Version 3.1.6
(C) 2005-2010 Sun Microsystems, Inc.
All rights reserved.

Name:            SafeChildren Appliance
Guest OS:        OpenSolaris (64 bit)
UUID:            fc59e47f-e83a-49ee-908e-7dcf1e54d4a2
Config file:     /Users/itily/Library/VirtualBox/Machines/SafeChildren Appliance/SafeChildren Appliance.xml
Hardware UUID:   fc59e47f-e83a-49ee-908e-7dcf1e54d4a2
Memory size:     2048MB
VRAM size:       6MB
Number of CPUs:  2
Synthetic Cpu:   off
CPUID overrides: None
Boot menu mode:  message and menu
Boot Device (1): DVD
Boot Device (2): HardDisk
Boot Device (3): Not Assigned
Boot Device (4): Not Assigned
ACPI:            on
IOAPIC:          on
PAE:             on
Time offset:     0 ms
Hardw. virt.ext: on
Hardw. virt.ext exclusive: off
Nested Paging:   on
VT-x VPID:       on
State:           powered off (since 2010-04-30T12:21:39.000000000)
Monitor count:   1
3D Acceleration: off
2D Video Acceleration: off
Teleporter Enabled: off
Teleporter Port: 0
Teleporter Address:
Teleporter Password:
Storage Controller Name (0):            Controlador IDE
Storage Controller Type (0):            PIIX4
Storage Controller Instance Number (0): 0
Storage Controller Max Port Count (0):  2
Storage Controller Port Count (0):      2
Storage Controller Name (1):            Controlador de disquete
Storage Controller Type (1):            I82078
Storage Controller Instance Number (1): 0
Storage Controller Max Port Count (1):  1
Storage Controller Port Count (1):      1
Controlador IDE (0, 0): /Users/itily/Library/VirtualBox/HardDisks/SafeChildren Appliance.vdi (UUID: 007e4925-cf11-426b-9b78-385878feb2f1)
Controlador IDE (1, 0): Empty
Controlador de disquete (0, 0): Empty
NIC 1:           MAC: 080027831CA3, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 2:           MAC: 080027B5E8FD, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 3:           MAC: 080027CB82E5, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 4:           MAC: 080027E447C8, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 5:           MAC: 0800277292EE, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 6:           MAC: 080027B8D241, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 7:           disabled
NIC 8:           disabled

UART 1:          disabled
UART 2:          disabled
Audio:           disabled
Clipboard Mode:  Bidirectional
VRDP:            disabled
USB:             disabled
USB Device Filters:
Shared folders: 
Guest:
Statistics update:                   disabled


Como vemos, tiene soporte hasta NIC 8 -como ya hemos comentado- pero no podremos gestionarlas desde el interface gráfico. Ahora si queremos añadir una nueva tarjeta virtual haciendo bridge sobre la tarjeta física en0 haremos lo siguiente:

$ ./VBoxManage modifyvm "SafeChildren Appliance" --nic7 bridged --cableconnected7 on --nictype7 82540EM --macaddress7 auto  --bridgeadapter7 'en0: Ethernet'
Sun VirtualBox Command Line Management Interface Version 3.1.6
(C) 2005-2010 Sun Microsystems, Inc.
All rights reserved.

Si ahora volvemos a mostrar la configuración de la máquina veremos cómo ya tenemos activada la nueva tarjeta NIC 7 -he dejado sólo la parte de las NICs-

$ ./VBoxManage showvminfo "SafeChildren Appliance" 
Sun VirtualBox Command Line Management Interface Version 3.1.6
(C) 2005-2010 Sun Microsystems, Inc.
All rights reserved.


NIC 1:           MAC: 080027831CA3, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 2:           MAC: 080027B5E8FD, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 3:           MAC: 080027CB82E5, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 4:           MAC: 080027E447C8, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 5:           MAC: 0800277292EE, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 6:           MAC: 080027B8D241, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 7:           MAC: 080027EC1471, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 8:           disabled


Por último, si queremos deshabilitar una tarjeta, deberemos indicar el tipo <none>, por ejemplo:

$ ./VBoxManage modifyvm "SafeChildren Appliance" --nic7 none
Sun VirtualBox Command Line Management Interface Version 3.1.6
(C) 2005-2010 Sun Microsystems, Inc.
All rights reserved.

$ ./VBoxManage showvminfo "SafeChildren Appliance"
Sun VirtualBox Command Line Management Interface Version 3.1.6
(C) 2005-2010 Sun Microsystems, Inc.
All rights reserved.

NIC 1:           MAC: 080027831CA3, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 2:           MAC: 080027B5E8FD, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 3:           MAC: 080027CB82E5, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 4:           MAC: 080027E447C8, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 5:           MAC: 0800277292EE, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 6:           MAC: 080027B8D241, Attachment: Bridged Interface 'en0: Ethernet', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps
NIC 7:           disabled
NIC 8:           disabled


Conclusiones
La potencia del CLI de <VirtualBox> nos permite no sólo cambiar configuraciones, sino gestionar por completo la máquina virtual. Esto,  es de gran ayuda cuando no contamos con acceso al X11.

Referencias

lunes, 10 de mayo de 2010

Redirección de puertos utilizando SSH

Introducción
En esta ocasión vamos a ver Cómo podemos redireccionar puertos utilizando SSH. Lo primero que nos preguntamos es, ¿para qué? Bueno, la verdad es que para mucho, pero principalmente es para securizar protocolos inseguros por definición.

Me explico un poco mejor, si tenemos un servicio -por ejemplo POP3- cuyo protocolo no se diseñó con la seguridad en mente, y por lo tanto la transmisión de datos se hace en "texto plano" -si, es cierto que puedo poner SSL sobre POP3, pero vamos a imaginar que no- así que lo que hacemos es:

Establecer una conexión segura a través de SSH y luego, hacer que en esa conexión segura, se produzca un redirección de puertos.

OpenSSH
Fuente: http://www.e-ghost.deusto.es/docs/articulo.ssh.html

Básicamente el formato del comando es el siguiente:
ssh -L puertoLocal:host_a_resolver:puertoRemoto usuario@host

  • Puerto Local: Hace referencia al <puerto local> en el que nuestro SSH escuchará. Si ponemos un puerto inferior a 1024, deberemos ejecutar el comando como <root>
  • Host a Resolver: Hace referencia al <nombre dns> que nuestro "servidor" remoto resolverá
  • Puerto Remoto: Puerto al que nuestro "servidor" se conectará
Además, debemos tener la opción <AllowTcpForwarding> a <yes> en el archivo de configuración de Solaris </etc/ssh/sshd_config>

Veamos un ejemplo para tenerlo más claro. Supongamos que tenemos un servidos que tiene un servicio POP3, pero no tiene SSL y queremos "conectarnos de forma segura". A este servidor <mx1.test.com> podemos acceder mediante ssh

Desde una máquina remota <en nuestro caso será Makito>, haremos que el puerto 9000 sea un tunel al puerto 110 del servidor de correo, por ejemplo:
makito:~ itily$ ssh -L 9000:localhost:110 user@mx1.test.com
Abrimos otro terminal y comprobamos que ahora tenemos el puerto 9000 a la escucha
makito:~ itily$ netstat -an|grep 9000
tcp4       0      0  127.0.0.1.9000         *.*                    LISTEN
tcp6       0      0  ::1.9000               *.*                    LISTEN
tcp6       0      0  ::1.51434              ::1.9000               TIME_WAIT
Y si nos conectamos con un simple telnet podemos ver, que realmente nos hemos conectado al servidor de correo POP3

makito:~ itily$ telnet localhost 9000
Trying ::1...
Connected to localhost.
Escape character is '^]'.
+OK <70008.1273507610@mx1.test.com>
^]
telnet> quit
Connection closed.
Vale, tal vez ahora no os parezca algo muy potente, pero ... vamos a ver algo que os puede interesar. 

Conectar a MemCached de forma segura
Ya hemos visto Cómo Instalar MemCached en Solaris, pues bien, MemCached utiliza un protocolo ASCII, o binario, pero en ningún caso utiliza control de acceso y menos encriptación. Así que, no debemos permitir el acceso a ningún host que no sea realmente el que debe acceder para almacenar/leer datos. 

Pero qué sucede con los Sistemas de Monitorización como Nagios? Bien, la verdad es que podemos habilitar Procedimientos para la monitorización de sistemas con Nagios de forma segura pero, también podemos hacer un tunel con ssh para poder lanzar estadísticas, no?

Si yo ejecuto el siguiente comando -asumiendo que mi Servidor de MemCached está en el puerto 11211 a la escucha-
makito:~ itily$ ssh -L 9001:localhost:11211 memcached.test.com
Y desde otro terminal
makito:~ itily$ telnet localhost 9001
Trying ::1...
Connected to localhost.
Escape character is '^]'.
stats
STAT pid 19155
STAT uptime 1153381
STAT time 1273509365
STAT version 1.4.5
STAT pointer_size 32
...
END
quit
Connection closed by foreign host.
Conclusiones
Puede que nos interese conocer el sistema de PortForwarding de ssh para situaciones donde necesitemos una conexión segura, pero o bien el protocolo o la configuración no nos lo permite.

Referencias

jueves, 6 de mayo de 2010

Cómo rotar archivos de log con LogAdm en Solaris 10

Introducción
Solaris tiene una utilidad llamada <logadm> que se encarga de rotar los archivos de log que nosotros tengamos configurados en el archivo </etc/logadm.conf>

Aunque inicialmente podemos realizar las configuraciones sobre el mismo archivo no es recomendable y deberemos utilizar el comando <logadm> para gestionar las entradas.

El formato del comando <logadm> es el siguiente:
logadm [-options] logname...
Y en opciones tenemos -principalmente- las siguientes
  • -a command. Ejecuta el comando <command> después de realizar la rotación. Esta opción es muy útil, por ejemplo para llamar a $APACHE_HOME/bin/apachectl graceful
  • -c. Ejecuta la rotación mediante un <copy> y luego trunca el original. Esto nos permite que si tenemos un proceso con descriptores abiertos al log, no perderá las referencias ya que el archivo no es eliminado
  • -C count. Mantiene sólo un número de copias <count> de log, cuando llega a ese número, comienza a sobreescribir de forma cíclica
  • -e mail_address. Envía un correo con los errores a la dirección de correo <mail_address>
  • -p period. Rota después de un periodo de tiempo <period>. Podemos definir el periodo utilizando d para días, h para horas, w para semanas, m para meses e y para años. Por ejemplo, si queremos que rote cada 12h, deberemos utilizar <-p 12h>. Existe una opción especial llamada <now> que rota siempre el archivo de log.
  • -s size. Rota cuando el archivo es superior al tamaño definido en <size>. Pdemos definir el tamaño utilizando b para bytes, k para Kb, m para Mb y G para Gb
  • -w. Escribe la entrada en el fichero de configuración
  • -v. Escribe pos stdout lo que está procesando el comando
  • -z count. Comprime los archivos rotados dejando <count> sin comprimir, es decir, si ponemos count con valor 0, todos los archivos rotados estarán comprimidos.
Por defecto, durante la instalación de Solaris, se crea una entrada en el Crontab de root que llama a <logadm> todos los días a las 03:10h. Si quieres más información puedes ver el post sobre Cómo Editar y Gestionar el Crontab en Solaris

# crontab -l
  #ident  "@(#)root       1.21    04/03/23 SMI"
  #
  # The root crontab should be used to perform accounting data collection.
  #
  #
  10 3 * * * /usr/sbin/logadm
Esta entrada podemos editarla y ponerla a nuestro antojo para tener la rotación, por ejemplo, a las 00:00h y así tener logs diarios.

Además -y ya concluye la teoría- si no utilizamos ninguna regla de rotación Solaris utilizará <-s1b -p1w> por defecto, es decir, rotar si es mayor de 1 byte y una semana
 
Rotar Logs de Apache utilizando <logadm>
Vamos a rotar los logs de Apache HTTP, queremos que rote diariamente, guarde 7 copias y que comprima las 6 últimas. Vamos a asumir que nuestro $APACHE_HOME=/opt/www/apache-1.3.41
# logadm -w /opt/www/apache-1.3.41/logs/www.sfchildren.com-error_log -C 7 -p 1d -z 1 -a '/opt/www/apache-1.3.41/bin/apachectl graceful'
# tail -1 /etc/logadm.conf
/opt/www/apache-1.3.41/logs/www.sfchildren.com-error_log -C 7 -a '/opt/www/apache-1.3.41/bin/apachectl graceful' -p 1d -z 1

Rotar Log de PostgreSQL con <copy and truncate>
# logadm -w /var/log/postgres/server.log -C 5 -c -p 1d -z 0
# tail -1 /etc/logadm.conf
/var/log/postgres/server.log -C 5 -c -p 1d -z 0
Si ejecutamos el comando <logadm> con la opción <-v> -para ver que procesa-, y comprobamos que al utilizar la opción <-c> ha hecho un <cp y truncate>

# logadm -v
   # cargando /etc/logadm.conf
   # procesando nombre de registro: /var/log/postgres/server.log
   #     usando plantilla predeterminada: $archivo.$n
   mkdir -p /var/log/postgres # verify directory exists
   cp -fp /var/log/postgres/server.log /var/log/postgres/server.log.0 # rotate log file via copy (-c flag)
   cp -f /dev/null /var/log/postgres/server.log # truncate log file (-c flag)
   touch /var/log/postgres/server.log
   chown 101:90 /var/log/postgres/server.log
   chmod 600 /var/log/postgres/server.log
   #     registrando fecha de rotación Thu May  6 07:54:49 2010 para /var/log/postgres/server.log
   # escribiendo cambios en /etc/logadm.conf
# ls -l /var/log/postgres/server.log*
-rw-------   1 postgres postgres       0 may  6 09:54 /var/log/postgres/server.log
-rw-------   1 postgres postgres 10160774 may  6 09:24 /var/log/postgres/server.log.0

Conclusión
El comando <logadm> nos permite gestionar de forma sencilla la rotación de logs de nuestro Solaris, además tiene un sistema de gestión sencillo e intuitivo

Referencias

martes, 4 de mayo de 2010

Instalación de Open Solaris Paso a Paso

Introducción
Ya hemos visto Cómo Instalar Solaris Paso a Paso, en esta ocasión vamos a ver cómo instalar OpenSolaris utilizando su instalado basado en Texto -OpenSolaris Text Install-. Este tipo de instalación nos va a permitir tener un sistema mucho más limitado en cuanto a paquetes y no dependemos de un interface gráfico para su instalación.

Descarga de ISO
Lo primero que debemos hacer es descargarnos la ISO del instalador desde OpenSolaris, en nuestro caso vamos a utilizar la ISO para x86

Creación Máquina VirtualBox
Al igual que hicimos para Solaris, vamos a utilizar VirtualBox para realizar nuestra instalación de OpenSolaris, por ello, no voy a entrar en mucho detalle de cómo crear la maquina virtual y sus discos.

Vídeo Instalación Paso a Paso de OpenSolaris



Para los que prefiráis, podéis descargar el video de Instalación de OpenSolaris Paso a Paso en VirtualBox -grande-


Referencias