SafeChildren Banner

Havoc Oracle Solaris Experts
Mostrando entradas con la etiqueta tips. Mostrar todas las entradas
Mostrando entradas con la etiqueta tips. Mostrar todas las entradas

jueves, 15 de diciembre de 2011

Cómo ver el porcentaje de iNodes Libres y Usados en OpenIndiana

Introducción
Alguna vez os ha pasado encontrar en el syslog el mensaje de "out of inodes", si nunca lo habéis encontrado mejor :D.

El problema viene porque el sistema de ficheros se está quedando -o se ha quedado sin inodes libres- y no puede crear/modificar los archivos que contiene ese FileSystem.

Principalmente me he encontrado con este problema cuando parametrizaba un servidor de cache squid con unos valores muy elevados de L1 y L2 en cache_dir y la unidad no era lo suficientemente grande.

Simplemente deberemos utilizar la opción <-i> del comando </usr/gnu/bin/df> de GNU ya que Solaris no lo incluye, por ejemplo:
havoc@hseries:~$ df -i /
Filesystem         Inodes   IUsed   IFree IUse% Mounted on
rpool/ROOT/solaris 861385   593804  86079 1%    /

Referencias

domingo, 30 de octubre de 2011

Cómo desactivar ACPI en OpenIndiana

Introducción
OpenIndiana incluye soporte para el sistema ACPI, sin embargo, en algunas ocasiones, puede que nuestro sistema no pueda iniciarse correctamente, y debamos desactivarlas.

Para poder desactivar el sistema ACPI debemos utilizar la opción <acpi-user-options=MODO> en nuesto menú de arranque grub en la sección de <kernel>, donde "modo" será uno de los siguientes valores:
  • acpi-user-options=8, Desactiva el nuevo sistema ACPI y deja el sistema en formato "Legacy".
  • acpi-user-options=4, Desactiva el nuevo y sistema "Legacy" aunque permite seguir definiendo los Threads de los micros HyperThread a traves de ACPI.
  • acpi-user-options=2, Desactiva todo el ACPI por completo.
Deberemos utilizar las opciones de mayor a menor -8,4,2- si encontramos problemas en nuestro OpenIndiana.


Por ejemplo, si queremos poner la opción de "desactivado por completo" en la entrada "HSeries", editaremos el archivo /rpool/boot/grub/menu.lst de la siguiente forma:
havoc@h1master:~$ pfexec vi /rpool/boot/grub/menu.lst
title HSeries

findroot (pool_rpool,0,a)
bootfs rpool/ROOT/hseries
kernel$ /platform/i86pc/kernel/$ISADIR/unix -m verbose -B $ZFS-BOOTFS,acpi-user-options=2
module$ /platform/i86pc/$ISADIR/boot_archive
Conclusión
Alguna vez podemos encontrarnos con problemas de arranque de OpenIndiana -sobre todo en VMWare ESX- que se solucionan en la mayoría de los casos poniendo la opción de ACPI a 2

Referencias

lunes, 8 de agosto de 2011

Cómo buscar el profile necesario para ejecutar un comando en RBAC

Introducción
Hemos hablado sobre el RBAC, Modelo de Seguridad en Solaris y Cómo utilizarlo, sin embargo, cuando se está empezando a utilizarlo nos surge una duda: Qué profile asigno para que pueda ejecutar el comando XYZ?

Buscar el Profile más adecuado
Imaginemos por ejemplo que queremos asignar privilegios a un "rol" para que sea capaz de actualizar e instalar paquetes en nuestro Solaris/OpenIndiana.

Sabemos que para ello, necesitamos ejecutar el comando , así que hacemos una búsqueda en el archivo -donde se encuentran declarados los archivos y sus profiles-
havoc@hseries:~$ cat /etc/security/exec_attr | grep "pkg"
Software Installation:solaris:cmd:::/usr/bin/pkg:uid=0
Software Installation:suser:cmd:::/usr/bin/pkginfo:uid=0
Software Installation:suser:cmd:::/usr/bin/pkgmk:uid=0
Software Installation:suser:cmd:::/usr/bin/pkgparam:uid=0
Software Installation:suser:cmd:::/usr/bin/pkgproto:uid=0
Software Installation:suser:cmd:::/usr/bin/pkgtrans:uid=0
Software Installation:suser:cmd:::/usr/sbin/pkgadd:uid=0;gid=bin
Software Installation:suser:cmd:::/usr/sbin/pkgask:uid=0
Software Installation:suser:cmd:::/usr/sbin/pkgchk:uid=0
Software Installation:suser:cmd:::/usr/sbin/pkgrm:uid=0;gid=bin
Como podemos observar, el "Profile" es , así que, simplemente deberemos asignarlo a nuestro "rol" o usuario.

Si queremos asignarlo al "role" haremos lo siguiente:
havoc@hseries:~$ pfexec rolemod -P 'Software Installation' jmsserver
havoc@hseries:~$ pfexec profiles jmsserver
jmsserver:
          Software Installation
          ZFS File System Management
          Basic Solaris User
          All
havoc@hseries:~$ pfexec su - jmsserver
OpenIndiana     SunOS 5.11      oi_148  November 2010
$ pkg rebuild-index

PHASE                                          ITEMS
Indexing Packages                            502/502
Conclusiones
RBAC nos permite tener un control muy preciso sobre los accesos y privilegios de nuestros roles/usuarios. Además, debemos tener en cuenta que podemos definirnos nuestros propios "Profiles" para tener justo lo que queremos.

Referencias
Comandos básicos y no tan básicos de Solaris
Modelo de Seguridad de Solaris/OpenIndiana - Parte 1

domingo, 17 de abril de 2011

Activar Salida por Consola Serie en OpenIndiana/Solaris 11

Introducción
Si queremos hacer que nuestro OpenIndiana/Solaris utilice nuestro puerto serie como salida en vez de la tarjeta gráfica, por ejemplo en servidores, simplemente deberemos incluir la opción "console=ttya" en nuestra entrada "kernel" del archivo <menu.lst> de GRUB.

Debemos recordar que si tenemos ZFS como sistema de archivos, el archivo <menu.lst> se encontrará en <POOL/boot/grub>, por ejemplo, en mi caso el nombre del POOL es "rpool".
root@h100:/rpool/boot/grub# zpool status
  pool: rpool
 state: ONLINE
 scan: resilvered 4,10G in 0h1m with 0 errors on Sat Apr 16 13:30:56 2011
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c2d0s0  ONLINE       0     0     0
            c3d1s0  ONLINE       0     0     0

errors: No known data errors
Editaremos el archivo "menu.lst", e incluiremos la opción "console=ttya" teniendo en cuenta que debemos incluir un "," para separar la opción.
root@h100:/# vi /rpool/boot/grub/menu.lst
 title ASEngine Enterprise Platform
 findroot (pool_rpool,0,a)
 bootfs rpool/ROOT/solaris-1
 kernel$ /platform/i86pc/kernel/$ISADIR/unix -B $ZFS-BOOTFS,console=ttya
 module$ /platform/i86pc/$ISADIR/boot_archive
:wq
Ahora, la próxima vez que iniciemos nuestro OpenIndiana, la salida se producirá por nuestro puerto de serie 1 -ttya- y, por lo tanto, podremos acceder con nuestro programa favorito, por ejemplo <minicom>

Conclusión
No ha sido difícil activar nuestra salida de consola por puerto serie, y ya podemos gestionar de forma remota -y rápida- nuestro OpenIndiana.

Referencias

jueves, 3 de marzo de 2011

Cómo saber el project de un proceso concreto

Introducción
En alguna ocasión hemos necesitado saber en que project se encuentra nuestro proceso de Solaris, para ello, simplemente utilizaremos la opción <-o> del comando <ps> que nos permite obtener el formato de salida que queramos.

Por ejemplo, para ver los procesos del usuario <appserver> mostrando su PID, Comando y Project utilizaremos el siguiente comando:
root@h1000:/# ps -fu appserver -o pid,args,project
  PID COMMAND                          PROJECT
 1672 /usr/jdk/instances/jdk1.6.0/bin  asengine.appserver

Referencias

martes, 25 de enero de 2011

Cómo Crear un FileSystem en Memoria utilizando TMPFS

Introducción
Vamos a ver cómo podemos utilizar el FileSystem TMPFS para crear un sistema de ficheros en Memoria en Solaris.

Ya hemos hablado en otras ocasiones sobre el sistema TMPFS y su relación con la swap en Solaris, vimos Cómo limitar el tamaño de /tmp en Solaris, sin embargo, hoy vamos a ver cómo podemos utilizarlo para crearnos un sistema de ficheros muy rápido.

Para ello, imaginando que nuestro directorio de montaje es </var/memory_fs> y que queremos asignarle un tamaño de 60Mb, haremos lo siguiente
itily@openzooey:/$ pfexec /usr/sbin/mount -F tmpfs -o size=60m -O swap /var/memory_fs
itily@openzooey:/$ pfexec df -h /var/memory_fs
Filesystem       size   used  avail capacity  Mounted on
swap             60M     0K    60M     0%    /var/memory_fs
Y ya podemos trabajar con nuestro sistema de ficheros en memoria de forma normal.

Par desmontarlo, simplemente haremos un <umount> como siempre
itily@openzooey:/$ pfexec /sbin/umount /var/memory_fs
Por último, si queremos que cada vez que nuestro sistema se inicie monte de forma automática el FileSystem, editaremos el archivo </etc/vfstab>
itily@openzooey:~$ pfexec vi /etc/vfstab
 swap   -  /var/memory_fs  tmpfs   -       yes     size=60m
:wq

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

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

miércoles, 23 de junio de 2010

Activar Java NIO en Tomcat6

Introducción
Una de las características más esperadas que introdujo la versíon 1.4 de Java fue un nuevo sistema de IO adaptado a los sistemas modernos. Esto permitía adaptar el formato de entrada/salida a las nuevas características de las CPUs -principalmente MultiThread- haciendo que las peticiones fuesen "no bloqueantes" y por lo tanto "sean manejadas por threads".  No voy a entrar en mucho detalle sobre cuáles son las diferencias -ya que pienso que es un tema de programación- pero sí que voy a explicar por qué nos aplica en términos de sistemas:
  • No permite escalar más y utilizar mejor los threads de las CPUs. De esta forma, tendremos menos cambios de contexto y por lo tanto mejor rendimeinto
  • Uso de Socket Asíncronos. De esta forma, seremos capaces de soportar más peticiones concurrentes en nuestros servidores de aplicaciones.
  • Podemos usar Resource Control. De esta forma, los límites y uso de recursos están mejor controlados en el sistema.
Sin embargo, no ha sido hasta la versión 6 de Tomcat cuando hemos podido empezar a utilizar esta nueva configuración.


Configuración de Apache Tomcat 6.x
Para activar el funcionamiento NIO en Tomcat 6, siemplemente editaremos el archivo de configuración <CATALINA_HOME/conf/server.xml> y modificaremos el valor de la propiedad:
protocol="HTTP/1.1"
por
protocol="org.apache.coyote.http11.Http11NioProtocol"
Por ejemplo, podemos añadir un nuevo "connector" en el puerto 8585 que use el formano NIO de la siguiente forma:
    <!-- NIO Connector With Compression -->
    <Connector
        maxThreads="256"
        enableLookups="false"
        protocol="org.apache.coyote.http11.Http11NioProtocol"
        keepAliveTimeout="5000"
        maxKeepAliveRequests="1000"
        port="8585"
        connectionTimeout="20000"
        compression="on"
        bufferSize="8192"
        redirectPort="8443"
        URIEncoding="UTF-8"
    />
Conclusiones
Como hemos visto, cambiar al nuevo sistema de IO (NIO) que nos proporciona Java a partir de la versión 1.4.2 es realmente sencillo. En las próximas entregas veremos si -como dicen en Sun- es un sistema revolucionario y proporciona un rendimiento superior en sistemas con mucha carga.

Referencias

jueves, 10 de junio de 2010

Sincronizar el reloj mediante NTP en OpenSolaris

Introducción
La sincronización del reloj mediante NTP en OpenSolaris sigue el mismo procedimiento que Sincronización de Reloj mediante NTP en Solaris, por ello, simplemente vamos a hacer un repaso rápido de cómo hacerlo.

Vamos a utilizar el pool ntp de Europa para configurar nuestros servidores, sin embargo, podemos utilizar cualquier servidor NTP público/privado que queramos.
itily@matxinsalto:~$ pfexec vi /etc/inet/ntp.conf
   server 0.europe.pool.ntp.org
   server 1.europe.pool.ntp.org
   server 2.europe.pool.ntp.org
   server 3.europe.pool.ntp.org
:wq
itily@matxinsalto:~$ pfexec svcadm enable ntp
itily@matxinsalto:~$ pfexec svcs ntp
STATE          STIME    FMRI
online         18:49:41 svc:/network/ntp:default
itily@matxinsalto:~$ dmesg | tail -2
May 24 18:49:41 matxinsalto ntpd[926]: [ID 702911 daemon.notice] ntpd 4.2.5p172@1.1845-o Tue Feb 16 02:30:48 PST 2010 (1)
May 24 18:49:41 matxinsalto ntpd[928]: [ID 702911 daemon.notice] proto: precision = 0.398 usec

martes, 8 de junio de 2010

Herramientas de Test de Solaris - AMT Common Criteria Security

Introducción
En Solaris disponemos de diferentes herramientas que nos proporciona información sobre el estado del hardware. Hoy vamos a hablar de AMT <Abstract Machine Test>

# amt

AMT Test Program -- 64 bit application
================


Test 1- stack Side Boundary Test
TEST 1 PASSED


Test 2- Data Side Boundary Test.
PASS: Successful read/write in data area.
TEST 2 PASSED


Test 3- Text Area Not Writeable
Verify that a write to the text space does not cause a write to the executable
file from which it came, or to another process which shares that text.
PASS: Caught the segmentation fault, meaning we can't write to text area.
TEST 3 PASSED


Test 4- Memory Not Shared After Write
Verify that anonymous memory initially shared by two processes (e.g. after a
fork) is not shared after either process writes to it.
TEST 4 PASSED


Test 5- Memory Allocation is Not Shared
Verify that newly allocated memory in one of two processes created by forking
does not result in newly allocated memory in the other.
Parent address of hole before child change: 0010D130
Child end of hole before change:  0010D130
Child end of hole after change: 0010F130
Parent address of hole after child change: 0010D130
PASS: Hole is same size in parent.
TEST 5 PASSED

TESTS SUCCEEDED

Referencias

viernes, 4 de junio de 2010

Instalar ISC DHCP en Solaris 10

Introducción
En esta ocasión vamos a ver Cómo Instalar un Servidor DHCP Paso a Paso en Solaris 10. Tener en cuenta que Solaris cuenta con un servidor DHCP, sin embargo, vamos a utilizar el que nos proporciona ISC ya que es muy ligero y sencillo de configurar, además, es el servidor DHCP "de facto" en FreeBSD.

Compilación de ISC DHCP
Lo primero que debemos hacer es decargarnos el código fuente desde la web de ISC, en nuestro caso vamos a utilizar la versión 4.1.1-P1 que no tiene dependencias con BIND. Lo configuraremos con las opciones <paranoia> y con un <prefix> personalizado para que se instale en el directorio </opt/dhcpd>
$ wget http://ftp.isc.org/isc/dhcp/dhcp-4.1.1-P1.tar.gz
$ gtar zxpf dhcp-4.1.1-P1.tar.gz
$ cd dhcp-4.1.1-P1
$ ./configure --prefix=/opt/dhcpd --enable-paranoia
$ make
# make install
Instalación
Vamos a crear un usuario llamado <dhcp>, grupo <dhcpd> y project para el grupo <group.dhcpd>
# groupadd dhcpd
# useradd -g dhcpd -s /bin/false -d /dev/null -g dhcpd dhcpd
# projadd -c 'DHCP Project' group.dhcpd
Creación de la base de datos de concesiones y PID
Debemos crear el archivo que contendrá las concesiones creadas, ya que ISC DHCP no lo creará, en nuestro caso vamos a utilizar el directorio </var/dhcpd> para almacenar el pid y la base de datos. Estos parámetros son configurables como veremos más adelante
# mkdir /var/dhcpd
# chown dhcpd:dhcpd /var/dhcpd
# chomod 700 /var/dhcpd
# touch /var/dhcpd/dhcpd.leases
Configuración del Servidor ISC DHCP
El archivo de configuración se encuentra en <$DHCP_HOME/etc/dhcpd.conf> y su estructura es muy sencilla. Todas las líneas de configuración deben acabar con <;>, sino el servidor no se iniciará y nos indicará que hay un error en el archivo de configuración.
Dentro de él tendremos la sección "global" -que será todo el archivo- y diferentes "subsecciones" identificadas como:
_nombre_ {
 option ...  ;
 option ...  ;
}
Tenemos el archivo de configuración con varios ejemplos que podemos utilizar para comenzar con nuestro propio diseño, por ello, vamos a realizar una copia -por si acaso- y siempre podremos verificar la sintaxis del archivo de configuración
# cat dhcpd.conf > dhcp.conf.ORIGINAL
Simplemente modificaremos los siguientes parámetros del archivo
option domain-name "test.com";
option domain-name-servers ns1.test.com, ns2.test.com;
authoritative;
log-facility local5;
A continuación declararemos el rango DHCP que queremos ofrecer, para ello, debemos crear una subsección por cada uno de los rangos, en nuestro ejemplo, para el rango 192.168.25.0
subnet 192.168.25.0 netmask 255.255.255.0 {
  range 192.168.25.5 192.168.25.200;
  option domain-name-servers ns1.internal.test.com;
  option domain-name "internal.test.com";
  option routers 192.168.25.254;
  option broadcast-address 192.168.25.255;
  default-lease-time 600;
  max-lease-time 7200;
}
Si queremos añadir soporte para que nuestro DHCP exporte el archivo de configuración del proxy, deberemos incluir en la sección global -después de <authoritative>- las siguientes entradas
# PAC Support
option local-pac-server code 252 = text;
option local-pac-server "http://URL_del_proxy/proxy.pac";
Configuración SysLog
Hemos definido como parámetro <log-facility local5> para ello, vamos a declararlo en nuestro syslog
# vi /etc/syslog.conf
  # DHCP Log
  local5.debug                                    /var/log/dhcpd.log
 :wq
# touch /var/log/dhcpd.log
# chmod 600 /var/log/dhcpd.log
# chown root:sys /var/log/dhcpd.log
# svcadm restart system-log
Configurar el servicio mediante Solaris SMF
He creado los archivo de <manifest y method> para estos servicios o podéis crear los vuestos  si queréis, podéis descargar Manifest para ISC DHCP Solaris 10 SMF y el Method ISC DHCP Solaris 10 SMF
# cd /lib/svc/method
# /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/isc-dhcp-solaris/svc/isc-dhcp_4
# chown root:sys isc-dhcp_4
# chmod 555 isc-dhcp_4
# /var/svc/manifest/network
# /usr/sfw/bin/wget http://blog.sfchildren.com/blogger/isc-dhcp-solaris/svc/isc-dhcp_4.xml
# chown root:sys  isc-dhcp_4.xm
# chmod 444 isc-dhcp_4.xml
# svccfg
svc:> validate isc-dhcp_4.xml
svc:> import isc-dhcp_4.xml
svc:> quit
# svcs isc-dhcp_4
STATE          STIME    FMRI
disabled       12:38:48 svc:/network/isc-dhcp_4:default_32bits
# svcadm enable isc-dhcp_4
# svcs isc-dhcp_4
STATE          STIME    FMRI
online         12:40:08 svc:/network/isc-dhcp_4:default_32bits
Conclusión
El servidor DHCP de ISC nos permite una puesta en marcha muy rápida, y es muy sencillo de administrar. Además al incluirlo dentro del framework de SMF podemos gestionarlo de forma sencilla igual que otro servicio más.

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