SafeChildren Banner

Havoc Oracle Solaris Experts

miércoles, 28 de julio de 2010

Instalar Apache ActiveMQ en Solaris

Introducción
ActiveMQ es el servidor JMS de Apache. La instalación requiere de la versión Java 1.5, como mínimo, e incorpora un administrador Web <Admin Console> que nos permitirá monitorizar nuestro servidor y realizar algunas tareas sencillas.

Realmente este no es el sitio para <programar en Java utilizando JMS>, pero si que haremos una instalación y configuración del servicio utilizando SMF.


Instalación de Apache ActiveMQ
Lo primero que debemos hacer es comprobar que tenemos los requisitos principales, es decir, JDK 1.5 o superior, si fuese así aquí tenéis Cómo Instalar Java 6 en Solaris 10 en 64bits.
$ which java
/opt/www/jdk1.6.0/bin/java
$ which javac
/opt/www/jdk1.6.0/bin/javac
$ javac -fullversion
javac full version "1.6.0_11-b03"
$ java -fullversion
java full version "1.6.0_11-b03"
$ java -d64 -fullversion
java full version "1.6.0_11-b03"
Recordar que la opción <-d64> es para ejecutar la máquina en 64bits, además la opción <-version> también nos proporcionará los datos necesarios
$ java -d64 -version
java version "1.6.0_11"
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot(TM) 64-Bit Server VM (build 11.0-b16, mixed mode)
Una vez verificado que tenemos una versión superior a la 1.5, procederemos a descargar el tar.gz y descomprimirlo en un directorio, por ejemplo en mi caso MQ_HOME será </opt/www/activemq5>

Descarga del Binario de ActiveMQ
Desde la página de Apache podemos descargar la versión que deseemos, pero en mi caso vamos a utilizar la 5.3.2 -que es la última stable-, podeís utilizar el link Página de Descarga ActiveMQ y seleccionar la que prefirais.

UPDATED: Si quieres utilizar la nueva versión 5.4.x, revisa el post de Problemas con ActiveMQ 5.4 en Solaris 10

Creación Usuario, Group y Project
Como siempre vamos a crear un grupo y usuario para poder ejecutar ActiveMQ de forma controlada y utilizaremos un project para gestionar sus recursos.
En nuestro ejemplo, utilizaremos activemq para usuario y group y como project group.activemq, además, como hemos dicho antes, nuestro $MQ_HOME será </opt/www/activemq>
# groupadd activemq
# useradd -g activemq -s /bin/bash -d /export/home/activemq -m -c 'ActiveMQ User' activemq
64 bloques
# projadd -c 'Active MQ JMS Server' -U activemq group.activemq
# cd /opt/www/
# /usr/sfw/bin/wget http://www.eu.apache.org/dist/activemq/apache-activemq/5.3.2/apache-activemq-5.3.2-bin.tar.gz
.. omitimos los mensajes ...
# ls -l apache-activemq-5.3.2-bin.tar.gz
-rw-r--r--   1 root     root     33091364 abr 27 00:25 apache-activemq-5.3.2-bin.tar.gz
# /usr/sfw/bin/gtar zxpf apache-activemq-5.3.2-bin.tar.gz
# mv apache-activemq-5.3.2 activemq5
# chown -R activemq:activemq activemq5
# chmod 750 activemq5

Configuración de Resource Control
Vamos a crear una configuración un poco generalista para nuestro servidor, aunque es recomendable que monitoriceis y la adapteis a vuestras necesidades. 
# projmod -sK 'process.max-file-descriptor=(priv,4096,deny)' group.activemq
# projmod -sK 'task.max-lwps=(priv,100,none),(priv,250,deny)' group.activemq
# projmod -sK 'project.max-tasks=(priv,10,none),(priv,25,deny)' group.activemq
# projmod -sK 'project.cpu-shares=(privileged,175,none)' group.activemq
# projects -l group.activemq
group.activemq
        projid : 110
        comment: "Active MQ JMS Server"
        users  : activemq
        groups : (none)
        attribs: process.max-file-descriptor=(priv,4096,deny)
                 project.cpu-shares=(privileged,175,none)
                 project.max-tasks=(priv,10,none),(priv,25,deny)
                 task.max-lwps=(priv,100,none),(priv,250,deny)
Configuración del servicio mediante Solaris SMF
He creado los archivos manifest y method para Apache ActiveMQ 5.x que podéis descargaros -si no os apetece crearos unos- desde aquí: Manifest Solaris SMF para Apache Active MQ 5.x y Method Solaris SMF para Apache Active MQ 5.x.

Como siempre, he creado dos instancias <default_32bits> y <default_64bits> para que podáis decidir cual ejecutar.

Recordar, que no se pueden ejecutar ambas simultáneamente a menos que asignemos diferentes archivos de configuración.
# cd /var/svc/manifest/application/web
# /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/activemq/solaris-svc/activemq_5.xml
# svccfg
svc:> validate activemq_5.xml
svc:> import activemq_5.xml
svc:> quit
# cd /lib/svc/method
# /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/activemq/solaris-svc/activemq5
# svcs activemq_5
STATE          STIME    FMRI
disabled       18:11:57 svc:/application/web/activemq_5:default32bits
disabled       22:16:50 svc:/application/web/activemq_5:default64bits
# svcadm enable activemq_5:default64bits
# svcs activemq_5
STATE          STIME    FMRI
disabled       18:11:57 svc:/application/web/activemq_5:default32bits
online         22:17:21 svc:/application/web/activemq_5:default64bits




Conclusiones
Hemos visto como podemos instalar de forma sencilla el servidor Apache Active MQ, a partir de ahora, podemos configurar nuestro servidor para adaptarlos a nuestras necesidades.



Referencias

viernes, 23 de julio de 2010

Cómo saber que procesos están utilizando el dispositivo

Introducción
En alguna ocasión al intentar desmontar una unidad Solaris nos ha devuelto el siguiente mensaje:

# umount /mnt
umount: /mnt ocupado
Esto significa que algún proceso está utilizando el dispositivo, pero, a simple vista no sabemos cuál es. Para ello disponemos del comando </usr/sbin/fuser> que nos proporciona dicha información, su formato es:
# fuser filename
La respuesta del comando será de la siguiente forma:
file:  pid{c|m|n|o|r|t|y} pid_n{c|m|n|o|r|t|y}
Donde 
  • c Indica que el proceso está utilizando file como current directory
  • m Indica que el proceso tiene mapeado file con nmap
  • n Indica que el proceso tiene un lock no bloqueante
  • o Indica que el proceso tiene  un descriptor de fichero a file
  • r Indica que el proceso tiene file como su directorio root
  • t Indica que el proceso tiene file como su text file
  • y Indica que el proceso usa file como su control de terminal
Ejemplo de uso
Para ilustrarlo mejor, por ejemplo, vamos a crear un nuevo sistema de ficheros siguiendo el post de Cómo Gestionar Archivos como Block Devices utilizando lofiadm y posteriormente cambiaremos nuestro current directory al punto de montaje para que no nos permitan desmontar la unidad.
# mkfile 50m /tmp/sfchildren.ufs
# lofiadm -a /tmp/sfchildren.ufs
/dev/lofi/1
# newfs /dev/rlofi/1
... omitimos los mensajes ...
# mount -F ufs /dev/lofi/1 /mnt
# cd /mnt
# umount /mnt
umount: /mnt ocupado
# fuser -u /mnt
/mnt:      286c(root)     201c(root)
# ps -ef|egrep "286|201"|grep -v grep|grep -v ps
    root   201   177   0 10:51:50 console     0:00 bash


Referencias

miércoles, 21 de julio de 2010

Gestión de Archivos como Block Devices usando lofiadm

Introducción
En post anteriores veíamos Cómo montar un archivo ISO en Solaris utilizando lofiadm, en esta ocasión vamos a ver otras utilidades de este comando.

lofiadm nos permite utilizar un archivo "normal" como un dispositivio de bloques, y por lo tanto, nos va a dar lo posibilidad de Crear archivos de tamaño concreto y construir un sistema UFS. 
# mkfile 30m  /tmp/sfchildren
# lofiadm -a /tmp/sfchildren
/dev/lofi/1
# newfs -b 8192 /dev/lofi/1
/dev/rlofi/1: no se encontró el tipo de soporte. Se procederá con los parámetros determinados por el sistema.
newfs: construir un nuevo sistema de archivos /dev/rlofi/1: (y/n)? y
/dev/rlofi/1:   61404 sectores en 102 cilindros de 1 pistas, 602 sectores
        30,0MB en 7 grupos de cilindros (16 c/g, 4,70MB/g, 2240 i/g)
copias de seguridad super-bloque (para fsck -F ufs -o b=#) en:
 32, 9664, 19296, 28928, 38560, 48192, 57824,

# mount -F ufs /dev/lofi/1 /mnt
# df -h /mnt
Sistema de archivos  tamaño usados aprovechar capacidad Montado en
/dev/lofi/1             28M   1,0M    24M     5%    /mnt
Ver los Loopback Devices creados
Si queremos ver qué loopback devices tenemos creados, simplemente deberemos ejecutar el comando <lofiadm> sin argumentos, y nos mostrará el <block device> y el archivo, por ejemplo

# lofiadm
Block Device             File
/dev/lofi/1              /tmp/sfchildren
Eliminar  loopback devices
Una vez hemos finalizado de usar los loopback devices, simplemente deberemos eliminarlos de nuestro sistema llamando a <lofiadm> con la opción <-d>, por ejemplo, para eliminar nuestro </dev/lofi/1>
# lofiadm
Block Device             File
/dev/lofi/1              /tmp/sfchildren
# lofiadm -d /dev/lofi/1
# lofiadm
Block Device             File
Conclusiones
lofiadm nos permite crear block devices desde archivos y con esto nos podemos crear nuestros propios sistemas de archivos UFS que asignados a las zonas, nos permiten un mayor control -aunque perdemos rendimiento-
Esto nos puede ayudar a migraciones o empaquetar nuestras zonas de forma que utilizando archivos como devices copiarlos de un sitio a otro de forma sencilla


Referencias

lunes, 19 de julio de 2010

Cómo Montar ISO en Solaris

Introducción
En Solaris disponemos de un comando para administrar archivos como dispositivos de bloques, este comando es <lofiadm> y nos va a permitir montar un archivo ISO como un dispositivo de bloques y poder montarlo.

Para ello, simplemente ejecutaremos <lofiadm> con la opción <-a> y posteriormente, montarlo con normalidad
# lofiadm -a /custom/sfchildren.iso
/dev/lofi/1
# mount -F hsfs -o ro /dev/lofi/1 /mnt
Y para finalizar, simplemente desmontaremos la unidad montada y eliminaremos el dispositivo loopback que hemos creado "/dev/lofi/1"
# umount /mnt
# lofiadm -d /dev/lofi/1
Si intentamos hacerlo dentro de una zona no global, Solaris nos mostrará el siguiente mensaje de error
# lofiadm -a /custom/sfchildren.iso
lofiadm: /dev/lofictl: No existe tal archivo o directorio

Referencias

viernes, 16 de julio de 2010

Cómo poner varios valores a un propiedad de Resource Control

Introducción
Hemos visto durante muchas ocasiones como el uso de <projects> en Solaris nos permite un ajuste fino de los recursos, sin embargo, en esta ocasión vamos a ver cómo podemos utilizar varios parámetros en nuestro valor de Resource Control con el objeto de monitorizar el uso de los recursos.

Vimos Cómo Gestionar Configuraciones Dinámicas Utilizando Projects -y en la Segunda Parte de Cómo Gestionar Configuraciones Dinámicas hablábamos de cómo activar el sistema de monitorización-. Partiendo de esto, vamos a ver cómo podemos utilizar estas opciones para realizar un seguimiento a nuestros valores.

El formato del valor de una propiedad de Resource Control es el siguiente:
propiedad=(permiso,valor,acción)
Por ejemplo, podemos tener el siguiente valor
task.max-lwps=(priv,1K,deny)
Esta configuración deniega la creación de más de 1000 procesos ligeros -Threads-, sin embargo, no nos notifica cuándo se está acercando. Para ello, utilizaremos como acción el valor <none> y activaremos el seguimiento en <syslog> utilizando <rctladm>. El formato será el siguiente:
propiedad=(permiso,valor,none),(permiso,valor,none),...,(permiso,valor,deny)
Veamos un ejemplo, queremos que cuando nuestra task cree más de 500 threads escriba un mensaje en nuestro syslog y por lo tanto, estemos avisados.
# projmod -sK 'task.max-lwps=(priv,500,none),(priv,1K,deny)'
# rctladm -e syslog task.max-lwps
# rctladm task.max-lwps
task.max-lwps               syslog=notice  [ count ]
De esta forma, podemos establecer niveles de warning antes de realizar la acción deny en nuestro sistema y tener un mayor control sobre el consumo de recursos.

Referencias

miércoles, 14 de julio de 2010

Cómo cambiar parámetros Max User Process y Max Pid en Solaris

Introducción
En Solaris el valor de <max user processes> ( $ ulimit -u ) se define en el archivo de configuración </etc/system> como <maxuprc>, sin embargo, debemos tener en cuenta algunos conceptos.

Si intentamos modificar su valor con el comando <ulimit -u _nuevo_valor>, Solaris mostrará el siguiente error, ya que no es posible modificarlo mediante este comando.
# ulimit -u
29950
# ulimit -u 2000
bash: ulimit: max user processes: cannot modify limit: Argumento no válido
Para poder modificar este valor -el de maxuprc-, debemos tener en cuenta que su valor por defecto es:
max_nprocs - reserved_procs
Por lo tanto, debemos conocer los valores de los siguientes parámetros:
  • maxusers. Antiguamente definía el número máximo de usuarios, en la actualidad se utiliza para establecer los valores a las principales estructuras internas de Solaris. Su valor será igual al número de MB de memoria del sistema sin exceder nunca el valor de 4096.
  • reserved_procs. Número de procesos reservados para el UID 0 (root). Esto nos permitirá tener espacio para en caso de sufrir un exceso de procesos de usuarios, conectarnos a la consola y destruirlos. Su valor será 5 y sin exceder MAXINT. Mi recomendación es que pongáis un valor de (5xNº de Zonas) + 10
  • pidmax. Número máximo de PID que puede ser asignado. Su valor por defecto es 30.000 y puede ser desde 256 hasta 999.9999 sin exceder MAX_NPROCS
  • max_nprocs. Número máximo de procesos que se pueden crear en el sistema. Este valor se utiliza para crear las estructuras de cache UFS, HAT y Semáforos. Su valor por defecto es <10 + (16 x maxusers)>  y sin exceder de PIDMAX
Por lo tanto, como nuestra intención es incrementar el valor de máximo número de procesos de usuarios a 55.000, realizaremos los siguientes cambios  en el archivo </etc/system>. Recuerda hacer una copia para poder arrancar con otro </etc/system> por si algo falla
# cp /etc/system /etc/system.low
# vi /etc/system
 set pidmax=90000
 set maxusers = 4096
 set reserved_procs = 35
 set maxuprc = 55000
 set max_nprocs = 89965
:wq!
# touch /reconfigure
# reboot -- -r
Después de iniciar la máquina, podemos comprobar los nuevos valores, utilizando el comando <ulimit -u>
$ ulimit -a
core file size        (blocks, -c) unlimited
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
open files                    (-n) 4096
pipe size          (512 bytes, -p) 10
stack size            (kbytes, -s) 8192
cpu time             (seconds, -t) unlimited
max user processes            (-u) 55000
virtual memory        (kbytes, -v) unlimited
Referencias

lunes, 12 de julio de 2010

Cómo ver valores parámetros del Kernel en Solaris

Introducción
Hay veces que necesitamos conocer los valores que tenemos asignados a nuestros parámetros de kernel en Solaris -principalmente para tunear el sistema-.

Para ello, podemos utilizar el depurador <mdb> con la opción <-k> que fuerza al kernel a entrar en modo debug y por lo tanto, nos permitirá hacerle consultas. Estas consultas deben hacerse desde la Zona Global

El formato será el siguiente
# echo nombre/D | mdb -k
Por ejemplo, para consultar el valor de <maxuprc> haremos lo siguiente:
# echo maxuprc/D | mdb -k
maxuprc:
maxuprc:        29950

Recordar, que si intentamos hacerlo sobre una Zona NoGlobal, se producirá el siguiente error:
# echo maxuprc/D | mdb -k
mdb: failed to open /dev/ksyms: No such file or directory


Referencias

jueves, 8 de julio de 2010

Cómo Iniciar Solaris con otro /etc/system

Introducción
En alguna ocasión hemos sufrido algún problema con nuestro </etc/system> -o bien se "ha dañado", o lo hemos editado mal- y esto hace que nuestro Solaris no se inicie.

Sin embargo, tenemos una opción en el comando <boot> que nos permite Iniciar Solaris de forma Interactiva, y de esta forma, se nos preguntará por cada una de las opciones de arranque.

Esto, además de salvarnos de algún apuro puede servirnos para experimentar con diferentes parámetros en nuestra máquina de forma sencilla.

Vamos a imaginar que queremos probar el comportamiento de nuestro Solaris al modificar el parámetro <fsflush> pero, no queremos tener una forma sencilla de rollback, así que simplemente crearemos una copia de nuestro </etc/system> y editaremos los parámetros que queramos modificar.

Ahora, en el proceso de boot, utilizaremos la opción <-a> para que se nos pregunte por el kernel, módulos y system. Si por algún motivo, hemos perdido el </etc/system>, podemos utilizar </dev/null> para que Solaris cree uno vacío y poder iniciar el sistema
ok boot -a
.
.
Rebooting with command: boot -a
Boot device: /pci@1f,0/pci@1,1/ide@3/disk@0,0:a 
File and args: -a
Enter filename [kernel/sparcv9/unix]: (INTRO para aceptar)
Enter default directory for modules [/platform/SUNW,Ultra-5_10/kernel
     /platform/sun4u/kernel /kernel /usr/kernel]: (INTRO para aceptar)
Name of system file [etc/system]: etc/system.dos
SunOS Release 5.10 Version S10_60 64-bit
Copyright (c) 1983-2004 by Sun Microsystems, Inc. All rights reserved
Use is subject to license terms.
root filesystem type [ufs]: (INTRO para aceptar)
Enter physical name of root device
[/pci@1f,0/pci@1,1/ide@3/disk@0,0:a]: (INTRO para aceptar)
configuring IPv4 interfaces: hme0.
Hostname: osiris
The system is coming up.  Please wait.
checking ufs filesystems


Conclusión
El uso del Inicio Interactivo nos puede salvar de alguna que otra, aunque, lo más recomendable siempre es tener una buena copia de seguridad, sobre todo, cuando tocamos archivos críticos para el arranque.

Referencias

martes, 6 de julio de 2010

Cómo ver el tamaño de página actual en Solaris 10

Introducción
En muchas ocasiones hacemos referencia al número de páginas -libres u ocupadas- del sistema, pero, el tamaño de las mismas depende de la arquitectura y de nuestra parametrización.

Para poder saber el tamaño actual de página, utilizaremos el comando <pagesize> que nos mostrará en el valor configurado en <bytes>
# /usr/bin/pagesize
8192
Si utilizamos el argumento <-a>, el comando nos mostrará todos los tamaños de página que este hardware es capáz de gestionar
# /usr/bin/pagesize -a
8192
65536
524288
4194304
33554432
268435456
Referencias