SafeChildren Banner

viernes, 29 de abril de 2011

Problemas RTL8168B PCI-e en OpenIndiana

Introducción
Hace unos días decidí cambiar algunos de mis equipos de pruebas de mi casa, y me "lancé" a comprarme componentes sueltos en App Informática -era en previsión de las días de fiesta ... :D-

Así que me compré diferentes componentes, aunque hoy vamos a hablar sólo de la tarjeta de red PCI-e EDIMAX y su Chipset RTL8168B.

El problema
Después de instalar OpenIndiana sin ningún problema, configurar y demás historias -todo ello utilizando la tarjeta de red integrada en la placa- me dispuse a activar la tarjeta PCI-e y configurar OpenIndiana como Router -para poner SQUID como Proxy Transparente-, pero ... cuál fue mi sorpresa que después de unas horas "OpenIndiana se colgaba 100%".

No respondía nada! Ni por consola!!

La Solución
Siento decir que me hubiese gustado poner aquí "la solución mágica", pero ... no fui capaz! Toqué cientos de parámetros, cambie de driver -utilizando gani- y muchas horas de pruebas, siempre con el mismo resultado: "colgada 100% de OpenIndiana"

Así que, al final, he cambiado esta tarjeta por una Intel PCI-e ...

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

lunes, 11 de abril de 2011

Qué es Crossbow y Cómo Utilizarlo en Solaris/OpenIndiana - Parte 1

Introducción
Una de las tecnologías que OpenSolaris nos dejó fue la "Virtualización de la Infraestructura de Red". Actualmente tanto OpenIndiana como Solaris 11 incorporan esta tecnología, que, aunque un poco desconocida, realmente muy potente.

En esta serie de artículos vamos a ver cómo podemos utilizar esta tecnología en nuestras máquinas de producción.

¿Virtualizar Infraestructura de Red?
Si, es correcto. Crossbow nos permite virtualizar nuestra infraestructura -switches, routers, tarjetas- por lo tanto, nos permite diseñar una "infraestructura virtual" completa.

Sin embargo, vamos a ver un enfoque más "práctico" a la virtualización de la infraestructura de Red, y, sobre todo, cómo utilizarlo en nuestro equipos de producción.

El uso de Solaris Zones es una ventaja importante, pero, si queremos "mover" nuestras máquinas virtuales de un host a otro, tenemos algunos problemas -por ejemplo el nombre de la tarjeta de red-. Utilizando una tarjeta virtual, eliminaremos este problema, y, además podremos añadir soporte IPFilter a nuestra zona ya que podemos poner <ip-type=exclusive> en vez de <shared>

Por último, crossbow incluye una nueva forma de manejar QoS, y sí, esta vez, es sencilla y muy eficiente.


El comando <dladm>
La gestión de la virtualización de red se encuentra en el comando </usr/sbin/dladm> que, nos proporciona los métodos para: crear, modificar y borrar elementos virtuales -vnic, etherstub, bridge, vlan-

Si ejecutamos el comando -teniendo en cuenta que debemos disponer de permisos suficientes- sin argumentos, se nos muestra las diferentes opciones
itily@openzooey:~$ pfexec /sbin/dladm
usage:  dladm <subcommand> <args> ...
    rename-link      <oldlink> <newlink>
    show-link        [-pP] [-o <field>,..] [-s [-i <interval>]] [<link>]

    create-aggr      [-t] [-P <policy>] [-L <mode>] [-T <time>] [-u <address>]
                     -l <link> [-l <link>...] <link>
    delete-aggr      [-t] <link>
    add-aggr         [-t] -l <link> [-l <link>...] <link>
    remove-aggr      [-t] -l <link> [-l <link>...] <link>
    modify-aggr      [-t] [-P <policy>] [-L <mode>] [-T <time>] [-u <address>]
                     <link>
    show-aggr        [-pPLx] [-o <field>,..] [-s [-i <interval>]] [<link>]

    scan-wifi        [-p] [-o <field>,...] [<link>]
    connect-wifi     [-e <essid>] [-i <bssid>] [-k <key>,...] [-s wep|wpa]
                     [-a open|shared] [-b bss|ibss] [-c] [-m a|b|g] [-T <time>]
                     [<link>]
    disconnect-wifi  [-a] [<link>]
    show-wifi        [-p] [-o <field>,...] [<link>]

    set-linkprop     [-t] -p <prop>=<value>[,...] <name>
    reset-linkprop   [-t] [-p <prop>,...] <name>
    show-linkprop    [-cP] [-o <field>,...] [-p <prop>,...] <name>

    show-ether       [-px][-o <field>,...] <link>

    create-secobj    [-t] [-f <file>] -c <class> <secobj>
    delete-secobj    [-t] <secobj>[,...]
    show-secobj      [-pP] [-o <field>,...] [<secobj>,...]

    create-vlan      [-ft] -l <link> -v <vid> [link]
    delete-vlan      [-t] <link>
    show-vlan        [-pP] [-o <field>,..] [<link>]

    create-iptun     [-t] -T <type> [-a {local|remote}=<addr>,...] <link>]
    delete-iptun     [-t] <link>
    modify-iptun     [-t] -a {local|remote}=<addr>,... <link>
    show-iptun       [-pP] [-o <field>,..] [<link>]

    delete-phys      <link>
    show-phys        [-pP] [-o <field>,..] [-H] [<link>]

    create-vnic      [-t] -l <link> [-m <value> | auto |
                     {factory [-n <slot-id>]} | {random [-r <prefix>]} |
                     {vrrp -V <vrid> -A {inet | inet6}} [-v <vid> [-f]]
                     [-p <prop>=<value>[,...]] <vnic-link>
    delete-vnic      [-t] <vnic-link>
    show-vnic        [-pP] [-l <link>] [-s [-i <interval>]] [<link>]

    create-part      [-t] [-f] -l <link> [-P <pkey>]
                     [-R <root-dir>] <part-link>
    delete-part      [-t] [-R <root-dir>] <part-link>
    show-part        [-pP] [-o <field>,...][-l <linkover>]
                     [<part-link>]
    show-ib          [-p] [-o <field>,...] [<link>]

    create-etherstub [-t] <link>
    delete-etherstub [-t] <link>
    show-etherstub   [-t] [<link>]

    create-bridge    [-R <root-dir>] [-P <protect>] [-p <priority>]
                     [-m <max-age>] [-h <hello-time>] [-d <forward-delay>]
                     [-f <force-protocol>] [-l <link>]... <bridge>
    modify-bridge    [-R <root-dir>] [-P <protect>] [-p <priority>]
                     [-m <max-age>] [-h <hello-time>] [-d <forward-delay>]
                     [-f <force-protocol>] <bridge>
    delete-bridge    [-R <root-dir>] <bridge>
    add-bridge       [-R <root-dir>] -l <link> [-l <link>]... <bridge>
    remove-bridge    [-R <root-dir>] -l <link> [-l <link>]... <bridge>
    show-bridge      [-p] [-o <field>,...] [-s [-i <interval>]] [<bridge>]
    show-bridge      -l [-p] [-o <field>,...] [-s [-i <interval>]] <bridge>
    show-bridge      -f [-p] [-o <field>,...] [-s [-i <interval>]] <bridge>
    show-bridge      -t [-p] [-o <field>,...] [-s [-i <interval>]] <bridge>

    show-usage       [-a] [-d | -F <format>] [-s <DD/MM/YYYY,HH:MM:SS>]
                     [-e <DD/MM/YYYY,HH:MM:SS>] -f <logfile> [<link>]
Ver los interfaces "físicos"
El primer paso es conocer nuestros interfaces físicos, y para ello utilizaremos el argumento <show-phys>
itily@openzooey:~$ pfexec /usr/sbin/dladm show-phys
LINK         MEDIA      STATE      SPEED  DUPLEX    DEVICE
e1000g0      Ethernet   up         1000   full      e1000g0
e1000g1      Ethernet   unknown    0      half      e1000g1
Ver los estado de los "enlaces"
Ahora debemos conocer "cómo están conectados" nuestros enlaces, para ello, utilizaremos la opción <show-link>
itily@openzooey:~$ pfexec dladm show-link
LINK        CLASS     MTU    STATE    BRIDGE     OVER
e1000g0     phys      1500   up       --         --
e1000g1     phys      1500   unknown  --         --
Virtualizar Interfaces de Red
Crossbow nos permite virtualizar los interfaces de red físicos, y asignarlos a una zona de Solaris como <ip-type=exclusive> de esta forma, podemos utilizar IPFilter de forma separada, y, también "mover" nuestra zona a otro host sin importarnos si la tarjeta de red es o no la misma.

Por defecto utilizaremos el nombre <vnicN> para definir nuestros interfaces virtuales, esto es debido a que en OpenSolaris existía un problema con la nomenclatura, y os recomiendo no cambiar a nombres "más complicados".

Para la creación de un interface virtual debemos seleccionar sobre que "interface físico" queremos montarlo, en nuestro caso lo haremos sobre <e1000g0> y lo llamaremos <vnic1>
itily@openzooey:~$ pfexec /sbin/dladm create-vnic -l e1000g0 vnic1

Ver Interfaces Virtuales
Para ver que interfaces virtuales tenemos declarados en nuestro host, utilizaremos la opción <show-vnic> y para ver su estado utilizaremos <show-link>
itily@openzooey:~$ pfexec /sbin/dladm show-vnic
LINK    OVER    SPEED  MACADDRESS      MACADDRTYPE  VID
vnic1   e1000g0 1000   2:8:20:cd:ad:34 random       0
itily@openzooey:~$ pfexec dladm show-link
LINK        CLASS     MTU    STATE    BRIDGE     OVER
e1000g0     phys      1500   up       --         --
e1000g1     phys      1500   unknown  --         --
vnic1       vnic      1500   up       --         e1000g0
Como vemos, <vnic1> está "asociado" al link físico <e1000g0> y se encuentra como "up"

Manejo de Interface Virtuales
La ventaja de uso de interfaces de red virtuales, radica en que se utilizan de igual forma que un interface físico, por lo tanto, podemos utilizar el comando <ifconfig> para asignarle una IP y "levantarlo", por ejemplo:
itily@openzooey:~$ pfexec ifconfig vnic1 plumb
itily@openzooey:~$ pfexec ifconfig vnic1 192.168.1.20/24 broadcast + up
itily@openzooey:~$ pfexec ifconfig vnic1
vnic1: flags=1000843 mtu 1500 index 3
        inet 192.168.1.20 netmask ffffff00 broadcast 192.168.1.255
        ether 2:8:20:cd:ad:34
Y desconectarlo ...
itily@openzooey:~$ pfexec ifconfig vnic1 unplumb
itily@openzooey:~$ pfexec ifconfig -a
lo0: flags=2001000849 mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
e1000g0: flags=1004843 mtu 1500 index 2
        inet 192.168.1.12 netmask ffffff00 broadcast 192.168.1.255
        ether 8:0:27:86:70:32
lo0: flags=2002000849 mtu 8252 index 1
        inet6 ::1/128
Eliminar un Interface Virtual
Para eliminar un interface de red virtual, deberemos utilizar la opción <delete-vnic> del comando <dladm>, por ejemplo,

itily@openzooey:~$ pfexec dladm delete-vnic vnic1
itily@openzooey:~$ pfexec dladm show-vnic
Ver las propiedades de un Enlace
Una de las opciones más interesantes que nos proporciona esta tecnología es tratar a los interfaces virtuales como "físicos" y, por lo tanto, podemos modificar los parámetros del enlace de forma similar.

Las propiedades de un enlace las obtendremos con la opción <show-linkprop> y el nombre del enlace, en nuestro caso <vnic1>.

El valor de PERM nos indicará si es posible modificarlo (rw), o por el contrario si es de sólo lectura (r-). Aunque hay muchas propiedades, hoy nos centraremos en dos: maxbw y priority.
itily@openzooey:~$ pfexec dladm show-linkprop vnic1
LINK         PROPERTY        PERM VALUE          DEFAULT        POSSIBLE
vnic1        autopush        rw   --             --             --
vnic1        zone            rw   --             --             --
vnic1        state           r-   unknown        up             up,down
vnic1        mtu             rw   1500           1500           1500
vnic1        maxbw           rw   --             --             --
vnic1        cpus            rw   --             --             --
vnic1        cpus-effective  r-   0              --             --
vnic1        pool            rw   --             --             --
vnic1        pool-effective  r-   --             --             --
vnic1        priority        rw   high           high           low,
                                                                medium,
                                                                high
vnic1        tagmode         rw   vlanonly       vlanonly       normal,vlanonly
vnic1        protection      rw   --             --       mac-nospoof,
                                                          restricted,
                                                          ip-nospoof,
                                                          dhcp-nospoof
vnic1        allowed-ips     rw   --             --             --
vnic1        allowed-dhcp-cids rw --             --             --
vnic1        rxrings         rw   --             --             --
vnic1        rxrings-effective r- --             --             --
vnic1        txrings         rw   --             --             --
vnic1        txrings-effective r- --             --             --
vnic1        txrings-available r- 0              --             --
vnic1        rxrings-available r- 0              --             --
vnic1        rxhwclnt-available r- 0             --             --
vnic1        txhwclnt-available r- 0             --             --
Modificar una propiedad de un enlace
Si la propiedad es de lectura y escritura (rw) entonces, podemos cambiar su valor utilizando la opción <set-linkprop -p OPCION=VALOR>, por ejemplo, vamos a modificar la velocidad de nuestro enlace <vnic1> y vamos a ponerlo a 10Mb en vez de 1000Mb:
itily@openzooey:~$ pfexec dladm set-linkprop -p maxbw=10m vnic1
itily@openzooey:~$ pfexec dladm show-vnic
LINK    OVER     SPEED  MACADDRESS       MACADDRTYPE   VID
vnic1   e1000g0  10     2:8:20:74:9a:f3  random        0
Y ahora la prioridad
itily@openzooey:~$ pfexec dladm set-linkprop -p priority=low vnic1

Crear una Zona con <ip-type=exclusive>
Como es costumbre en el blog, después de un poco de teoría, viene la práctica "real". Esta vez vamos a crear una zona de Solaris/OpenIndiana y vamos a asignar la IP como "exclusiva" para poder incluir IPFilter y poder gestionar el ancho de banda que nos consume nuestra zona.

Para ello, primero crearemos un sistema ZFS donde alojaremos la zona -zonepath- llamado </export/zones> (En mi caso el zpool es "rpool1"). Si ya disponéis de un espacio ZFS para zonas, no es necesario crear uno nuevo.
itily@openzooey:~$ pfexec zfs create rpool1/export/zones
Ahora ya podemos crear la zona, utilizaremos como nombre <pkg-srv> -espero que intuyáis para que la utilizaremos-
itily@openzooey:~$ pfexec zonecfg -z pkg-srv
pkg-srv: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:pkg-srv> create
zonecfg:pkg-srv> set zonepath=/export/zones/pkg-srv
zonecfg:pkg-srv> set ip-type=exclusive
zonecfg:pkg-srv> set scheduling-class=FSS
zonecfg:pkg-srv> add net
zonecfg:pkg-srv:net> set physical=vnic1
zonecfg:pkg-srv:net> end
zonecfg:pkg-srv> verify
zonecfg:pkg-srv> commit
zonecfg:pkg-srv> exit
itily@openzooey:~$ pfexec zoneadm -z pkg-srv install

Encender la zona
itily@openzooey:~$ pfexec /usr/sbin/zoneadm -z pkg-srv boot
Conectarse a la Consola
Para los que no tenemos un teclado en_US el carácter de escape de <zlogin> es un poco complicado, así que pongo un carácter más sencillo "#." de ahí la opción -e\#
itily@openzooey:~$ pfexec zlogin -C -e\# pkg-srv
[Connected to zone 'pkg-srv' console]
Pantalla de Resumen de Red
Aquí os  dejo la pantalla de resumen del asistente de configuración de la zona, y como podéis ver, para él (Solaris/OpenIndiana), el uso de una interface virtual no representa ningún cambio, la trata "igual"
─ Confirm Information for vnic1 ──────────────────

  > Confirm the following information.  If it is correct, press F2; to change any information, press F4.


                  Host name: pkg-srv
                 IP address: 192.168.1.20
    System part of a subnet: Yes
                    Netmask: 255.255.255.0
                Enable IPv6: No
              Default Route: Specify one
          Router IP Address: 192.168.1.1


────────────────────────────────────────────────
    Esc-2_Continue    Esc-4_Change    Esc-6_Help
Instalar IPFilter
Una vez finalizado el proceso de configuración de la zona, podemos realizar la Instalación de IPFilter en la Zona con un simple
root@pkg-srv:~# pkg install ipfilter
Conclusiones
En esta primera parte hemos visto cómo es muy sencillo crear interfaces virtuales y, como se comportan "igual" que los físicos. Además, al poder modificar las propiedades de una forma "sencilla",  tenemos un control más exhaustivo.

En las siguientes entregas veremos un poco más sobre propiedades, flujos y, sobre todo, cómo aplicarlo a nuestros entornos de producción, pero hasta entonces ... a esperar.

Como siempre, cualquier duda o sugerencia es bienvenida,





Referencias

viernes, 1 de abril de 2011

Instalar PostgreSQL 9.0.3 64bit en OpenIndiana con soporte UUID

Introducción
Continuando con algunas de las características de los módulos "contrib" que tenemos en PostgreSQL, y de algunas dependencias de OpenBravo, vamos a ver cómo podemos Instalar PostgreSQL 9.0.3 en 64bits sobre OpenIndiana con soporte para UUID.

Requisitos Previos
Antes de poder continuar, es necesario Instalar OSSP-UUID en OpenIndiana, en nuestro caso en 64bits -como vimos anteriormente-

Además, os recomiendo -si no lo sabéis ya- leer los post sobre Instalar PostgreSQL 9.x en OpenIndiana y Requisitos de Instalación de PostgreSQL 9.x en OpenIndiana

Instalación desde el Binario
Para aquellos que no tengáis tiempo -o ganas- os dejo una versión de PostgreSQL 9.0.3 64bits con soporte para OSSP UUID que simplemente hay que descargar e Instalar el módulo en PostgreSQL -ver más abajo-
root@openzooey:/# cd /
root@openzooey:/# wget http://blog.sfchildren.com/blogger/postgres/9.0.3/openindiana/postgresql-9.0.3-x86-64bit-openindiana-with-uuid.tar.gz
root@openzooey:/# gzip -dc postgresql-9.0.3-x86-64bit-openindiana-with-uuid.tar.gz | tar xpf -
root@openzooey:/# chown -R postgres:postgres /u01
root@openzooey:/# rm postgresql-9.0.3-x86-64bit-openindiana-with-uuid.tar.gz 

Compilación de PostgreSQL
La compilación de PostgreSQL no supone mayor problema que añadir en el script de configuración la opción <--with-ossp-uuid> para que nos permita utilizar nuestro creador de UUID.

Sin embargo, tendremos que exportar nuestro <LD_LIBRARY_PATH> para que el script <configure> pueda "testear" correctamente el acceso a la biblioteca "uuid" que hemos compilado.

Una vez hecho esto, la compilación es, igual que siempre. Vamos a verlo:
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ossp-uuid/lib/64
$ 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 -R/opt/ossp-uuid/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:/opt/ossp-uuid/include \
    --with-libs=/lib/64:/usr/lib/64:/usr/sfw/lib/64:/opt/ossp-uuid/lib/64 \
    --with-ossp-uuid
Compilación e Instalación
Como siempre, ejecutaremos los comando <make> y <pfexec make install>
$ make
$ pfexec make install
NOTA: El proceso de instalación completo se encuentra detallado en Cómo Instalar PostgreSQL 9 64bits en OpenIndiana con SMF

Compilación del Módulo UUID
Para compilar el módulo de UUID, será necesario tener instalado PostgreSQL y situarse en el directorio <contrib> del código fuente de PostgreSQL.

Además, tener en cuenta que debemos compilarlo con GNU Make y no con SVR4 Make. Para comprobar "cual tenéis en el path" simplemente se puede utilizar <which make> y ver cuál es, o, simplemente utilizamos <gmake>
itily@openzooey:~/postgresql-9.0.3$ cd contrib
itily@openzooey:~/postgresql-9.0.3/contrib$ cd uuid-ossp
itily@openzooey:~/postgresql-9.0.3/contrib/uuid-ossp$ gmake
itily@openzooey:~/postgresql-9.0.3/contrib/uuid-ossp$ pfexec gmake install
Esto nos creará una nueva biblioteca de enlace dinámico <uuid-ossp.so> en nuestro directorio <lib/64> de PostgreSQL:
itily@openzooey:~$ cd /u01/app/postgres/9.0/db/lib/64
itily@openzooey:/u01/app/postgres/9.0/db/lib/64$ ls -ltrh uuid-ossp.so
-rwxr-xr-x   1 root root   16K mar 30 21:09 uuid-ossp.so
itily@openzooey:/u01/app/postgres/9.0/db/lib/64$ file uuid-ossp.so
uuid-ossp.so:   ELF 64-bit LSB dynamic lib AMD64 Version 1, dynamically linked, not stripped
itily@openzooey:/u01/app/postgres/9.0/db/lib/64$ ldd uuid-ossp.so
        libuuid.so.16 => /opt/ossp-uuid/lib/64/libuuid.so.16
        libc.so.1 =>     /usr/lib/64/libc.so.1
        libm.so.2 =>     /lib/64/libm.so.2
Instalación en PostgreSQL
Por último, sólo nos queda crear las funciones en nuestra DB de PostgreSQL, para ello, utilizaremos el script <uuid-ossp.sql> que encontraremos en $POSTGRES_HOME/share/contrib
itily@openzooey:/$ cd /u01/app/postgres/9.0/db/share/contrib
itily@openzooey:/u01/app/postgres/9.0/db/share/contrib$ ls -ltr
total 7
-rw-r--r-- 1 root mar 30 21:09 uninstall_uuid-ossp.sql
-rw-r--r-- 1 root mar 30 21:09 uuid-ossp.sql
Deberemos añadirlo a las DB que queramos, utilizando el comando <psql> y un usuario con permisos para "crear languages"

postgres@openzooey:~$ /u01/app/postgres/9.0/db/bin/64/psql -U postgres -d testdb -f uuid-ossp.sql
SET
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
postgres@openzooey:~$ /u01/app/postgres/9.0/db/bin/64/psql -U test -d testdb
psql (9.0.3)
Type "help" for help.

testdb=> SELECT uuid_generate_v3(uuid_ns_url(), 'http://www.postgresql.org');
           uuid_generate_v3          
--------------------------------------
 cf16fe52-3365-3a1f-8572-288d8d2aaa46
(1 row)

testdb=> SELECT uuid_generate_v3(uuid_ns_url(), 'http://www.havoctec.com/');
           uuid_generate_v3          
--------------------------------------
 5f2f3ed0-ce36-3968-b065-4bbaf6684d22
(1 row)

testdb=> \q
Desinstalación del módulo
Para poder desinstalarlo, simplemente utilizaremos el script <uninstall_uuid-ossp.sql> de la siguiente forma:
postgres@openzooey:~$ /u01/app/postgres/9.0/db/bin/64/psql -U postgres -d testdb -f uninstall_uuid-ossp.sql
SET
DROP FUNCTION
DROP FUNCTION
DROP FUNCTION
DROP FUNCTION
DROP FUNCTION
DROP FUNCTION
DROP FUNCTION
DROP FUNCTION
DROP FUNCTION
DROP FUNCTION
Algunos Errores
Si no hemos podido instalar correctamente el módulo dentro de PostgreSQL, se nos mostrará el siguiente error al tratar de usar la función:
testdb=> SELECT uuid_generate_v3(uuid_ns_url(), 'http://www.postgresql.org');
ERROR:  function uuid_ns_url() does not exist
LINE 1: SELECT uuid_generate_v3(uuid_ns_url(), 'http://www.postgresq...
                                ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
Si intentamos crear las funciones con un usuario que no tiene permisos suficientes, tendremos el siguiente error:
postgres@openzooey:~$ /u01/app/postgres/9.0/db/bin/64/psql -U testuser -d testdb -f uuid-ossp.sql
SET
psql:uuid-ossp.sql:9: ERROR:  permission denied for language c
psql:uuid-ossp.sql:14: ERROR:  permission denied for language c
psql:uuid-ossp.sql:19: ERROR:  permission denied for language c
psql:uuid-ossp.sql:24: ERROR:  permission denied for language c
psql:uuid-ossp.sql:29: ERROR:  permission denied for language c
psql:uuid-ossp.sql:34: ERROR:  permission denied for language c
psql:uuid-ossp.sql:39: ERROR:  permission denied for language c
psql:uuid-ossp.sql:44: ERROR:  permission denied for language c
psql:uuid-ossp.sql:49: ERROR:  permission denied for language c
psql:uuid-ossp.sql:54: ERROR:  permission denied for language c
Conclusiones
Parece más complicado de lo que parece, pero al final, resulta bastante sencillo. Además, debemos recordar que a partir de ahora, tenemos que incluir OSSP-UUID como dependencia de nuestro PostgreSQL

Referencias