SafeChildren Banner

miércoles, 22 de septiembre de 2010

Instalación de PostgreSQL en OpenIndiana - Parte 1

Introducción
Ya hemos visto Cómo Instalar PostgreSQL en Solaris 10 utilizando los binarios que nos proporciona PostgreSQL, sin embargo, en esta ocasión vamos a ver Cómo Instalar PostgreSQL 9.0 en OpenIndiana

Desde la página de PostgreSQL, podemos descargarnos la versión ya compilada para Solaris 10, sin embargo, esta versión no funciona sobre OpenSolaris y OpenIndiana.

Problemas con los binarios para Solaris 10 en OpenIndiana
El principal problema de los binarios compilados para Solaris reside en el uso de la biblioteca <libssl.so.0.9.7> y <libcrypto.so.0.9.7> que en OpenIndiana son </usr/lib/64/libcrypto.so.0.9.8> y </usr/lib/64/libssl.so.0.9.8>

Es decir, en OpenIndiana -OpenSolaris- tenemos una versión superior, y por lo tanto, cuando verificamos las dependencias del inario utilizando <ldd> vemos que no se encuentran:
# ldd postgres
        libxslt.so.1 =>  /usr/lib/64/libxslt.so.1
        libxml2.so.2 =>  /lib/64/libxml2.so.2
        libpam.so.1 =>   /lib/64/libpam.so.1
        libssl.so.0.9.7 =>       (file not found)
        libcrypto.so.0.9.7 =>    (file not found)
        libgss.so.1 =>   /usr/lib/64/libgss.so.1
        libnsl.so.1 =>   /lib/64/libnsl.so.1
        librt.so.1 =>    /lib/64/librt.so.1
        libsocket.so.1 =>        /lib/64/libsocket.so.1
        libm.so.2 =>     /lib/64/libm.so.2
        libc.so.1 =>     /lib/64/libc.so.1
        libz.so.1 =>     /lib/64/libz.so.1
        libpthread.so.1 =>       /lib/64/libpthread.so.1
        libmp.so.2 =>    /lib/64/libmp.so.2
        libmd.so.1 =>    /lib/64/libmd.so.1
Pero ... que no cunda el pánico, que es un problema fácilmente solucionable. Tenemos tres opciones para ello, o instalamos la versión anterior de OpenSSL cosa que NO RECOMIENDO, o compilamos nuestra propia versión de PostgreSQL o ... podeis descargaros la versión compilada por mí, para OpenIndiana x86 en 64bits de PostgreSQL 9.0.

Si os habéis decidido por la última opción -Instalar PostgreSQL desde el binario par a OpenIndiana-, entonces, podéis ignorar el paso de compilación pero debéis tener en cuenta lo siguiente:
  • El binario debe ser instalado en </u01/app/postgres/9.0/db
  • Utilizaremos el role de <postgres> del sistema
  • El <PGDATA> esta en </var/postgres/9.0/data>
Preparación del Entorno
Antes de poder compilar PostgreSQL 9.0 en OpenIndiana, debemos tener en cuenta que son necesarios algunos paquetes, para ello, deberemos instalarlos antes.

Aquí os dejo la lista de paquetes necesarios, para instalarlos, simplemente debemos ejecutar <pkg install _nombre_paquete_>
  • sunstudio
  • SUNWgmake
  • SUNWbison
  • SUNWgm4
  • SUNWflexlex
Podemos comprobar si ya están instalados utilizando el comando <pkginfo>, por ejemplo
# pkginfo |grep flex
system      SUNWflexlex               Flex Lexer
system      SUNWrsync                 rsync - faster, flexible replacement for rcp
# pkginfo |grep bison
system      SUNWbison                 bison - A YACC Replacement
# pkginfo |grep gm4
system      SUNWgm4                   GNU m4
# pkginfo |grep gmake
system      SUNWgmake                 gmake - GNU make
# pkginfo |grep sunstudio
application sunstudio12u1             Sun Studio 12 update 1

Compilar PostgreSQL 9.0
Para la compilación he utilizado los mismos parámetros que Bjorn Munch utiliza en la versión "oficial" que es posible descargar desde PostgreSQL.

Lo primero que haremos, será descargarnos el fuente de PostgreSQL desde su página oficial, en cualquiera de los dos formatos: tar.gz, tar.bz2
# export CC=cc  
# export CFLAGS="-xO3  -xspace -Xa  -xildoff  -m64  -xc99=none -xCC -fast -native"
# export LDFLAGS="-R/usr/sfw/lib/64 -R/usr/lib/64"
# ./configure 
--prefix=/u01/app/postgres/9.0/db
--exec-prefix=/u01/app/postgres/9.0/db
--bindir=/u01/app/postgres/9.0/db/bin/64
--libexecdir=/u01/app/postgres/9.0/db/bin/64
--sbindir=/u01/app/postgres/9.0/db/bin/64
--datadir=/u01/app/postgres/9.0/db/share
--sysconfdir=/u01/app/postgres/9.0/db/etc
--mandir=/u01/app/postgres/9.0/db/man
--libdir=/u01/app/postgres/9.0/db/lib/64
--includedir=/u01/app/postgres/9.0/db/include
--sharedstatedir=/var/postgres/9.0
--localstatedir=/var/postgres/9.0
--enable-nls
--docdir=/u01/app/postgres/9.0/db/doc
--with-system-tzdata=/usr/share/lib/zoneinfo
--with-python
--with-pam
--with-openssl
--with-libedit-preferred
--with-libxml
--with-libxslt
--with-gssapi
--enable-thread-safety
--enable-dtrace
--disable-integer-datetimes
--with-includes=/usr/include:/usr/sfw/include
--with-libs=/lib/64:/usr/lib/64:/usr/sfw/lib/64
# make
# make install
Configuración de PostgreSQL
A diferencia del post sobre Cómo Instalar PostgreSQL 8.x en Solaris 10, en esta ocasión vamos a utilizar roles para ejecutar el servicio.

Ahora si que estamos en disposición de poder hablar de esta forma de instalación, ya que hemos introducido los conceptos de RBAC, Roles y Privilegios en post anteriores.

No es que la instalación de PostgreSQL 8.x en Solaris 10 no estuviese bien, sino que no utilizaba todos los mecanismos que Solaris nos proporciona -a nivel de seguridad-, para que os hagáis una idea, si ejecutamos el comando <ppriv> sobre el proceso de postgres ejecutado con un usuario normal veremos cuáles son sus privilegios
$ svcs -p postgresql_84
STATE          STIME    FMRI
disabled       mar_04   svc:/application/database/postgresql_84:default_32bit
online         jul_06   svc:/application/database/postgresql_84:default_64bit
               jul_06       3082 postgres
               jul_06       3084 postgres
               jul_06       3085 postgres
$ ppriv 3082
3082:   /u01/app/postgres/8.4/db/bin/64/postgres -D /var/postgres/8.4/data
flags =
        E: basic
        I: basic
        P: basic
        L: basic,contract_event,contract_observer,file_chown,file_chown_self,file_dac_execute,file_dac_read,

file_dac_search,file_dac_write,file_owner,file_setid,ipc_dac_read,ipc_dac_write,ipc_owner,
net_bindmlp,net_icmpaccess,net_mac_aware,net_privaddr,net_rawaccess,proc_audit,
proc_chroot,proc_lock_memory,proc_owner,proc_setid,proc_taskid,sys_acct,sys_admin,
sys_audit,sys_ip_config,sys_mount,sys_nfs,sys_resource
Ahora, si ejecutamos el servicio postgres mediante <pg_ctl> y el role <postgres> veremos la diferencia de privilegios:
$ id
uid=90(postgres) gid=90(postgres)

$ pg_ctl start -l /var/log/postgres/server.log
server starting
$ ps -ef|grep postgre
postgres   794     1   1 09:39:22 pts/1       0:00 /u01/app/postgres/9.0/db/bin/64/postgres
postgres   799   794   0 09:39:22 ?           0:00 /u01/app/postgres/9.0/db/bin/64/postgres
$ ppriv 794
794:    /u01/app/postgres/9.0/db/bin/64/postgres
flags = PRIV_PFEXEC
        E: basic
        I: basic
        P: basic
        L: all
Como podéis ver, la diferencia se encuentra en flags que ahora indica PRIV_PFEXEC ya que al ser un role, su shell es <pfexec> y, si es lanzado por el servicio SMF, es root quien lo lanza.

Además, si queríamos que un usuario -persona- pudiese gestionar nuestro PostgreSQL debíamos entregarle la contraseña de root ya que sino, no podría operar con SMF. Si lo intentase, nos mostraría el siguiente error:
$ id
uid=101(postgres) gid=90(postgres)
$ /usr/sbin/svcadm disable svc:/application/database/postgresql_84:default_64bit
svcadm: svc:/application/database/postgresql_84:default_64bit: Permiso denegado.
Configuración de PostgreSQL en SMF
A continuación configuraremos nuestro servicio postgres para que sea controlado mediante SMF, para ello, debemos descargar el Manifest para Solaris SMF 10 PostgreSQL 9 y el Method para Solaris SMF 10 PostgreSQL 9
# cd /lib/svc/method
# wget http://blog.sfchildren.com/blogger/openindiana/postgresql/9.0/smf/postgres_9
# chown root:bin postgres_9
# chmod 555 postgres_9
# mkdir -p /var/svc/manifest/application/database
# cd /var/svc/manifest/application/database
# wget http://blog.sfchildren.com/blogger/openindiana/postgresql/9.0/smf/postgresql_9.xml
# svccfg
svc:> validate postgresql_9.xml
svc:> import postgresql_9.xml
svc:> quit
# svcs -p postgresql_9
STATE          STIME    FMRI
disabled        9:29:24 svc:/application/database/postgresql_9:default_32bit
disabled       10:24:40 svc:/application/database/postgresql_9:default_64bit
Creación Estructura de PGDATA
Antes de poder iniciar postgres debemos crear la estructura de almacenamiento necesaria, para ello, deberemos ejecutar el comando <initdb> con los parámetros oportunos. En nuestro caso, vamos a iniciar la estructura en formato <UTF-8> y lenguage <es_UTF8> y la opción <-W> para que nos solicite la password que vamos a asignar al usuario postgres de la base de datos
# mkdir -p /var/postgres/9.0/data
# chown -R postgres:postgres /var/postgres
# chmod 700 /var/postgres
# su - postgres
$ export PGDATA=/var/postgres/9.0/data
$ /u01/app/postgres/9.0/db/bin/64/initdb -E utf8 --locale=es.UTF-8 -U postgres -W
Project y Directorio de Logs
Al igual que hicimos con la Instalación de PostgreSQL en Solaris, debemos definir un project y un directorio donde queremos escribir nuestro log. En nuestro caso, el project será <group.postgres> y el directorio </var/log/postgres>
# projadd -c "Postgres Database" -G postgres group.postgres
# projmod -sK "process.max-sem-nsems=(priv,256,deny)" group.postgres
# projmod -sK "project.max-sem-ids=(priv,100,deny)" group.postgres
# projmod -sK "project.max-shm-ids=(priv,100,deny)" group.postgres
# projmod -sK "project.max-shm-memory=(priv,8G,deny)" group.postgres
# mkdir -p /var/log/postgres
# chown -R postgres:postgres /var/log/postgres
# chmod 700 /var/log/postgres
Inicio y Parada de PostgreSQL
Como siempre, vamos a utilizar el framework de Solaris SMF para gestionar el inicio y parada de PostgreSQL, sin embargo, en esta ocasión -a parte de poder utilizar root- podemos utilizar el role <postgres> para gestionarlo, por ejemplo:
$ id
uid=90(postgres) gid=90(postgres)
$ svcs -p postgresql_9
STATE          STIME    FMRI
disabled        9:29:24 svc:/application/database/postgresql_9:default_32bit
disabled        9:38:51 svc:/application/database/postgresql_9:default_64bit
$ pfexec /usr/sbin/svcadm enable svc:/application/database/postgresql_9:default_64bit
$ svcs -p postgresql_9
STATE          STIME    FMRI
disabled        9:29:24 svc:/application/database/postgresql_9:default_32bit
online          9:55:13 svc:/application/database/postgresql_9:default_64bit
                9:55:13      817 postgres
                9:55:13      819 postgres
                9:55:13      820 postgres
                9:55:13      821 postgres
                9:55:13      822 postgres
$ ppriv 817
817:    /u01/app/postgres/9.0/db/bin/64/postgres -D /var/postgres/9.0/data
flags =
        E: basic
        I: basic
        P: basic
        L: all
Otorgar privilegios de administración de PostgreSQL a un usuario
Como hemos comenteado, al utilizar roles podemos delegar privilegios de administración a un usuario cualquiera sin que tengamos que proporciona la contraseña de root.

Por ejemplo, vamos a crear un usuario no privilegiado llamado <zooey> al cual, le vamos a otorgar permisos para poder administrar nuestro servicio PostgreSQL asignándole el role<postgres> y las autorizaciones <solaris.smf.value.postgres> y <solaris.smf.manage.postgres>
# useradd -g sysadmin -s /bin/bash -d /export/home/zooey -m -R postgres -A solaris.smf.manage.postgres,solaris.smf.value.postgres zooey
80 blocks
# passwd zooey
New Password:
Re-enter new Password:
passwd: password successfully changed for zooey
# su - zooey
OpenIndiana     SunOS 5.11      oi_147  September 2010
zooey@openzooey:~$ roles
postgres
zooey@openzooey:~$ pfexec svcs -p postgresql_9
STATE          STIME    FMRI
disabled        9:29:24 svc:/application/database/postgresql_9:default_32bit
disabled       10:24:40 svc:/application/database/postgresql_9:default_64bit
zooey@openzooey:~$ pfexec /usr/sbin/svcadm enable svc:/application/database/postgresql_9:default_64bit
zooey@openzooey:~$ pfexec svcs -p postgresql_9
STATE          STIME    FMRI
disabled        9:29:24 svc:/application/database/postgresql_9:default_32bit
online         10:39:25 svc:/application/database/postgresql_9:default_64bit
               10:39:24     1016 postgres
               10:39:24     1018 postgres
               10:39:24     1019 postgres
               10:39:24     1020 postgres
               10:39:24     1021 postgres
zooey@openzooey:~$ pfexec /usr/sbin/svcadm disable svc:/application/database/postgresql_9:default_64bit
zooey@openzooey:~$ pfexec svcs postgresql_9
STATE          STIME    FMRI
disabled        9:29:24 svc:/application/database/postgresql_9:default_32bit
disabled       10:43:51 svc:/application/database/postgresql_9:default_64bit
Conclusiones
En esta ocasión hemos utilizado muchos más mecanismos para gestionar el servicio de PostgreSQL y, hemos aprendido a utilizar los roles como una herramienta muy potente y segura.

Aunque inicialmente la Instalación de PostgreSQL puede ser de la forma tradicional -utilizando un usuario no privilegiado y root para gestionarlo- Solaris nos proporciona un entorno mucho más seguro y rico para ello.

Espero que con este ejemplo -completo- de instalación podáis ver la potencia de los roles, y como nos pueden ayudar en nuestro día a día.

 
Referencias

20 comentarios:

  1. Thanks, for that complete Pg9 / OpenIndiana tutorial. It would be very helpfull if you can translate it to English. For now I will try google translator ;)
    Dominik/Poland

    ResponderEliminar
  2. Hi Dominik,

    Thanks about the comment.

    Yes, I've been thinking about to translate to English some of my post, and, this is one that I'm going to translate on free weeks.

    Urko,

    ResponderEliminar
  3. Hola.

    Estoy teniendo problemas para compilar, e el paso del ./configure me esta arrojando el siguiente error "configure:3369: error: C compiler cannot create executables"

    Te agradezco si me puedes indicar que estoy haciendo mal.

    Por cierto, estoy usando las fuentes del 9.0.3, ya que la 9.0 ya no esta disponible.

    Gracias.

    ResponderEliminar
  4. Hola Anónimo,

    Sobre el problema del compilador de C "compiler cannot create executables" puede deberse a varios motivos, aunque, por experiencia, creo que puede ser alguno de los siguientes:

    1.- Comprueba que Solaris soporta una arquitectura de 64bis si estás utilizando el flag "-m64"

    2.- Comprueba la ruta del compilador CC
    $ which cc
    $ which make

    Para saber con más detalle el error, mira el archivo config.log para saber dónde ha fallado.

    Además, aquí tienes una versión de Cómo actualizar PostgreSQL 9.x a 9.0.2 por si te sirve de ayuda.

    Me vas contando,

    Un Saludo,
    Urko

    ResponderEliminar
  5. Hola.

    Gracias por tu respuesta, efectivamente estoy usando el flag -m64, pero quedo con la duda de si tambien debo cambiar las partes donde hacen referencia al 64 por 32 "--bindir=/u01/app/postgres/9.0/db/bin/64"

    Gracias.

    ResponderEliminar
  6. Hola.

    Conoce alguna forma de activar el modo de 64bits en OpenIndiana ?

    Ya estuve buscando en la documentacion de OI y no logre encontrar algo que indique como se logra.

    Gracias.

    ResponderEliminar
  7. Hola.


    Estoy un poco confundido porque al ejecutar "uname -m" me dice que es i386, pero cuando ejecuto "isainfo -kv" me dice que es 64bits, no se supone que si es de 64bits el primer comando me debio arrojar x86_64 ?

    Ya en esta situacion asumo que es de 64bits por lo cual descarto la primera opcion.

    Pasando con la opcion 2 esto es lo que obtengo.

    # which cc
    /usr/bin/cc
    # which make
    /usr/gnu/bin/make

    Adicionalmente este es el contenido del archivo config.log

    http://pastebin.com/BmpcMVQn

    Gracias.

    ResponderEliminar
  8. Hola.

    Usted por pura casualidad tiene conocimiento de como instalar PgAdmin en OI ?

    Teniendo en cuenta que solo la ultima version del PgAdmin soporta Postgres 9.x

    Gracias.

    ResponderEliminar
  9. Hola Anónimo,

    Si, como bien dices si estás compilando PostgreSQL 9.x sobre 32bit no se debe utilizar el directorio $POSTGRES_HOME/bin/64, ni tampoco los de $POSTGRES_HOME/lib/64.

    Además, en el Linker debes decirle que quieres que te incluya las bibliotecas de 32 LD_FLAGS y no las de 64bits.

    Por lo tanto, la configuración sería la siguiente:

    # export CC=cc  
    # export CFLAGS="-xO3  -xspace -Xa  -xildoff  -m32  -xc99=none -xCC -fast -native"
    # export LDFLAGS="-R/usr/sfw/lib/ -R/usr/lib/"
    # ./configure 
    --prefix=/u01/app/postgres/9.0/db
    --exec-prefix=/u01/app/postgres/9.0/db
    --bindir=/u01/app/postgres/9.0/db/bin
    --libexecdir=/u01/app/postgres/9.0/db/bin
    --sbindir=/u01/app/postgres/9.0/db/bin
    --datadir=/u01/app/postgres/9.0/db/share
    --sysconfdir=/u01/app/postgres/9.0/db/etc
    --mandir=/u01/app/postgres/9.0/db/man
    --libdir=/u01/app/postgres/9.0/db/lib
    --includedir=/u01/app/postgres/9.0/db/include
    --sharedstatedir=/var/postgres/9.0
    --localstatedir=/var/postgres/9.0
    --enable-nls
    --docdir=/u01/app/postgres/9.0/db/doc
    --with-system-tzdata=/usr/share/lib/zoneinfo
    --with-python
    --with-pam
    --with-openssl
    --with-libedit-preferred
    --with-libxml
    --with-libxslt
    --with-gssapi
    --enable-thread-safety
    --enable-dtrace
    --disable-integer-datetimes
    --with-includes=/usr/include:/usr/sfw/include
    --with-libs=/lib/:/usr/lib/:/usr/sfw/lib/


    Espero que te ayude,

    Urko

    ResponderEliminar
  10. Hola.

    Gracias por tus respuestas.

    Al final opte por instalar el binario y realizar la actualizacion a 9.0.2, pero me encontre con 2 obstaculos.

    1. No puedo desactivar el servicio con el usuario postgres.
    2. No pude crear el usuario del ejemplo porque me dice que el rol postgres no es valido.

    Pero a pesar de estos dos problemas la instalacion no tuvo problema alguno, ni siquiera tuvo problemas por el hecho de que aparentemente estoy funcionando en 32bits.

    Por lo pronto voy a proceder a instalar el PgAdmin con las instrucciones que dan a ver si me camina.

    Gracias.

    ResponderEliminar
  11. Hola a Todos,

    Debido a las diferentes dudas que, he decidido crear un post sobre Cómo Instalar PostgreSQL 9.0.3 en OpenIndiana utilizando SMF y RBAC. Requisitos de Instalación

    Os animo a que le echéis un vistazo, y, como siempre, espero vuestros comentarios.

    Un Saludo,
    Urko

    ResponderEliminar
  12. Hola Camcal,

    Sobre tu duda sobre PgAdmin, lo cierto es que no he probado a instalarlo en Solaris nunca, :'( así que no sé si hay muchos problemas -me imagino que no-

    Siento no poder ayudarte,

    Urko

    ResponderEliminar
  13. Hola.

    Desafortunadamente si estoy teniendo probleas ya que durante la instalacion del PgAdmin el busca la instalacion de Postgres.

    El problema se da en que no la encuentra en la ruta predeterminada y cuando le doy el parametro

    --with-pgsql=/u01/app/postgres/9.0/db/bin/64/

    me dice que no logro encontrar la instalacion de Postgres en esa carpeta.

    Alguna idea de cual pueda ser la carpeta ?

    Gracias.


    PS: Tan pronto logre completar la instalacion de PgAdmin hare el comentario aqui dando las indicaciones.

    ResponderEliminar
  14. Hola a todos.


    Ya logre sortear el problema del pgAdmin3 pero desafortunadamente el comentario que hice no me lo acepto la pagina, no Urko, y se perdio.

    Asi que en estos dias estare explicando como lo logre, lo unico que les puedo adelantar es que lo hice con phpPgAdmin.

    Suerte.

    ResponderEliminar
  15. Hola.

    Ahora llego con un nuevo problema, estoy tratando de agregar la libreria UUID a la instalacion de Postgres, pero hasta el momento todos mis intentos no han rendido frutos.

    Esto es lo que he echo hasta el momento.

    Instale uuid-1.6.2
    Segui los pasos que estan dentro de la carpeta pgsql en el archivo uuid.txt, y hay es donde quedo barado, ya que al ejecutar el primer comando me indica que no puede eliminar varias funciones y demas porque son necesarias para el sistema.

    Si alguien tiene idea de que puede ser les agradezco la ayuda.

    Gracias.

    PS: No se me olvida que tengo pendiente dar los pasos de la instalacion de phpPgAdmin.

    ResponderEliminar
  16. Hola de nuevo.


    Se me olvidaba decir que ya probe haciendo la instalacion de UUID usando las fuentes que se encuentran dentro de la carpeta contrib/uuid-ossp
    pero me dice que no encuentra el archivo uuid.h

    ResponderEliminar
  17. Hola Camcal,

    Lo cierto es que miré el problema de la compilación de PgAdmin, y bueno, el problema está en los directorios.

    Cuando haces un "configure" de PgAdmin y le dices dónde está POSGRES_HOME, asumen que "pgconfig" está en "$POSTGRES_HOME/bin/pgconfig", sin embargo, en la instalación de PostgreSQL nosotros le hemos dicho que los binarios de 64bits están en $POSTGRES_HOME/bin/64 y, por eso no lo encuentra.

    La solución pasa por utilizar PostgreSQL 32bit para compilarlo, aunque, es cierto que voy a escribir a la gente de PgAdmin para que incluyan la opción "--with-pgconfig" y de esta forma quedaría solucionado.

    Urko

    ResponderEliminar
  18. Hola Camcal,

    Sobre el comentario, ... lo siento :'( no sé que habrá pasado pero .. yo no he sido :D

    Si quieres, mándamelo por correo y lo publico :D

    Urko

    ResponderEliminar
  19. Hola Urko.

    En este momento mi mayor problema es que no he podido instalar el UUID-OSSP y pues por obvias razones tu estas mas capacitado en el tema que yo, asi que te pregunto si es posible que te contacte por correo o por chat a ver si por fin logro completar la instalacion de Postgres en OI.

    Necesito el UUID-OSSP porque estoy trabajando con un ERP, que debes conocer, llamado OpenBravo y este hace uso de ese modulo para generar los IDs.

    Gracias.

    ResponderEliminar
  20. Hola Camcal

    Como podrás ver -y si no te lo digo- he creado un post sobre Cómo Instalar OSSP-UUID para PostgreSQL, y, aunque tu lo necesitas "de forma urgente" me ha parecido interesante, asi que lo he publicado.

    Si esperas un poquito verás que también explico cómo compilar PostgreSQL con soporte para UUID,

    Espero que te ayude,

    Urko

    ResponderEliminar