# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Instalar la última versión de postgreSQL por RPM / YUM


PostgreSQLComo la mayoría sabéis, los repositorios oficiales de RHEL, CentOS, Scientific Linux, etc traen versiones de aplicaciones bastante retrasadas respecto las oficiales que podemos encontrar a través de los propietarios del software, por ejemplo Apache, PHP, MySQL, etc. En el caso de postgreSQL existe un repositorio mantenido por ellos mismos a través del cual podemos instalar y mantener actualizado nuestro postgreSQL con la última versión estable.

Podéis encontrar la descarga de otros repositorios, arquitecturas, etc en el sitio web www.postgresql.org.es. Lo que vamos a hacer es primero bajarnos el rpm que instalará el repositorio en el sistema:

# curl -O http://yum.postgresql.org/9.1/redhat/rhel-6-x86_64/pgdg-redhat91-9.1-5.noarch.rpm

Lo instalamos, básicamente crea el fichero .repo correspondiente:

# rpm -ivh pgdg-redhat91-9.1-5.noarch.rpm

Importante, en el caso de RedHat Enterprise Linux tenemos que deshabilitar todo lo referente a postgresql en el repositorio oficial, lo mismo tendríamos que hacer en otras distribuciones y en cualquier repositorio adicional que haya en el sistema:

# vi /etc/yum/pluginconf.d/rhnplugin.conf

exclude=postgresql*

Ahora ya podemos consultar las versiones de postgreSQL disponibles en el nuevo repositorio instalado. En este caso instalamos la 9.1 para 64 bits:

# yum install postgresql91-server.x86_64

Iniciamos la base de datos/instancia:

# /etc/init.d/postgresql-9.1 initdb

Arrancamos el servicio:

/etc/init.d/postgresql-9.1 start

Y lo primero cambiamos la clave del usuario postgresql desde la shell de psql, que por defecto está vacía:

ALTER ROLE postgres WITH PASSWORD 'XXXXXX';

A partir de aquí ya podemos trabajar con el servidor.

Instalar php-mbstring en RHEL 6 por yum


Hoy toca una entrada rápida. Si tenéis que instalar el módulo php mb-strings por yum/rpm en RHEL 6 de primeras veréis que el paquete no está disponible en los repositorios oficiales. Esto es porque hay que activar el repositorio opcional desde la Red Hat Network.

Para ello acceded a http://rhn.redhat.com con vuestro usuario y password. Entrad en la sección de sistemas (Systems), pinchad en el servidor que queráis activar el repositorio y una vez dentro accedemos a la sección de suscripciones a canales (modificar canales de suscripción / Subscribed Channels (Alter Channel Subscriptions). Ahí es donde activamos RHEL Server Optional y guardamos.

Ahora en la máquina únicamente queda actualizar el perfil rhn e instalar:

# rhn-profile-sync
# yum install php-mbstring

De este modo nos evitamos compilar a mano php y tenemos la versión pre-compilada oficial de RedHat.

Verificar la integridad y seguridad de ficheros con RPM


rpmRPM nos ofrece una utilidad muy valiosa que nos permite verificar la integridad y seguridad de todos los paquetes y aplicaciones instaladas en el sistema (con yum o rpm). Básicamente, lo que vamos a hacer es verificar todos los ficheros de todos los paquetes instalados en el sistema. La verificación consiste en comprobar la información de estos ficheros con la que hay almacenada en la base de datos rpm. Vamos a verificar el MD5 checksum, los permisos, el propietario y grupo, tamaño del fichero, etc. Para ello utilizaremos los parámetros –verify o -V.

De primeras podemos descartar los ficheros de configuración, ya que lo más normal es que su contenido cambie, aunque todavía podríamos revisar su configuración de permisos, propietario, etc.

Si queremos hacer una revisión de todos los ficheros del sistema, algo que lógicamente puede tardar bastante tiempo, utilizaremos el siguiente comando. Hay que tener en cuenta que en caso de no haber salida todo es correcto:

# rpm -Va

Si queremos hacer la revisión de un único paquete lo indicamos y quitamos el parámetro “a”:

# rpm -V telnet

Y si quisiéramos revisar un único fichero:

# rpm --verify --file /usr/bin/chcon

¿Y qué sucede si se detecta algún problema? Vamos a verlo. Voy a hacer un backup del binario /usr/sbin/apachectl y a reescribirlo:

# mv /usr/sbin/apachectl /usr/sbin/apachectl.BAK
# touch /usr/sbin/apachectl
# rpm -V --file /usr/sbin/apachectl
S.5....T.  c /etc/httpd/conf/httpd.conf
S.5....T.    /etc/rc.d/init.d/httpd
S.5....T.  c /etc/sysconfig/httpd
SM5....T.    /usr/sbin/apachectl

Como véis ahora sí que hay salida. Tenemos 8 puntos que se pueden convertir en otros caracteres cuando hay algo que no cuadra:

  • 5: fallo en el checksum MD5
  • S: discrepancia en el tamaño del fichero
  • T: fecha de modificación distinta al original
  • L: enlace simbólico
  • D: dispositivo
  • U: usuario
  • G: grupo
  • M: permisos

Así pues, en el ejemplo anterior vemos como el binario apachectl tiene un checksum MD5 distinto, distinto tamaño, fecha de modificación y de permisos. La “c” es de fichero de configuración.

Si queremos comprobar de una tacada la integridad de todos los binarios de /usr/sbin, es tan sencillo como:

# rpm -Va | grep "/usr/sbin"
S.5....T.    /usr/sbin/apachectl

Podemos añadir un mayor nivel de debug con el parámetro “v”, “vv” más debug aún:

# rpm -Vv --file /usr/sbin/apachectl
# rpm -Vvv --file /usr/sbin/apachectl

Como veis, esta es una buena y sencilla forma de asegurarnos que los binarios del sistema no han sido alterados y también de tener un control del estado de los ficheros de configuración, etc.

rhn_register y yum a través de un proxy


En el caso de necesitar registrar un sistema RHEL en la Red Hat Network y el equipo no tenga salida a Internet porque se encuentra en una red privada, existe la posibilidad de habilitar el acceso vía proxy. Para ello usamos el comando rhn_register como siempre, pero añadiendo el proxy como parámetro:

# rhn_register --nox --proxy=proxy:puerto
# rhn_register --nox --proxy=10.0.0.100:8080

Si el proxy requiere autenticación usamos los parámetros –proxyUser=PROXYUSER y –proxyPassword=PROXYPASSWORD.

Por otra parte, también necesitaremos utilizar yum para instalar aplicaciones o parchear el sistema una vez registrado. Para ello únicamente tenemos que especificar el proxy en el fichero de configuración de yum /etc/yum.conf:

proxy=http://10.0.0.100:8080/
proxy_username=usuario
proxy_password=password

La barra final parece ser necesaria, a mí no me funcionaba sin ella.

Cómo crear un repositorio local de yum


YumHay circunstancias en las que puede ser recomendable disponer de repositorios de yum locales para la actualización e instalación de paquetes en sistemas CentOS, RHEL, Fedora, etc, sobre todo si manejamos una gran cantidad de servidores y queremos disponer de mayor velocidad, seguridad y centralización. Vamos a ver los pasos necesarios para crear un repositorio local.

Lo primero que tenemos que hacer es elegir la ruta del repositorio y crear la estructura de carpetas, vamos a crear la misma estructura que en los repositorios oficiales, en este caso para la versión 5.6 de CentOS i386:

mkdir -p /repo_local/centos/5.6/os/i386/CentOS/

Antes de crear el repositorio debemos instalar una utilidad de yum llamada createrepo:

# yum install createrepo

Una vez instalado podemos crear el repositorio con el siguiente comando:

# createrepo repo_local

Saving Primary metadata
Saving file lists metadata
Saving other metadata

Nota: Este comando hay que ejecutarlo cada vez que añadimos, eliminamos o hacemos algún cambio en los rpm del repositorio.

Una vez creado podemos sincronizar nuestro repositorio con uno de los mirror oficiales de CentOS por rsync o añadir nuestros propios RPM. De momento vamos a hacer la prueba añadiendo un único rpm al repositorio:

# cd /repo_local/centos/5.6/os/i386/CentOS
# wget ftp://ftp.udl.es/pub/centos/5.6/os/i386/CentOS/perl-5.8.8-32.el5_5.2.i386.rpm

Antes de empezar a trabajar con él tenemos que activar el repositorio, para ello creamos un nuevo fichero con la configuración del mismo en /etc/yum.repos.d/repo_local.repo (el fichero debe tener la extensión .repo):

[repo_local]
name=Repositorio_local_CentOS
baseurl=file:///repo_local/
enabled=1
gpgcheck=0

La estructura es sencilla, indicamos el nombre del repositorio, su ruta (podría ser SMB, NFS, HTTP…), si está activado y si usa algún tipo de llave gpg (en este caso no). Ahora ya podemos hacer consultas contra este repositorio, instalar rpm’s, etc. Vamos a consultar el único rpm que hemos metido (perl-5.8.8-32.el5_5.2.i386.rpm). En el comando que veis deshabilito el repositorio base para evitar problemas de prioridades, etc:

# yum --enablerepo=repo_local --disablerepo=base info perl
Loaded plugins: fastestmirror, priorities
Loading mirror speeds from cached hostfile
 * addons: centos.mirror.xtratelecom.es
 * extras: centos.mirror.xtratelecom.es
 * rpmforge: fr2.rpmfind.net
 * updates: centos.mirror.xtratelecom.es
addons                                                                                                                                                         |  951 B     00:00
extras                                                                                                                                                         | 2.1 kB     00:00
repo_local                                                                                                                                                     |  951 B     00:00
rpmforge                                                                                                                                                       | 1.1 kB     00:00
updates                                                                                                                                                        | 1.9 kB     00:00
Excluding Packages in global exclude list
Finished

Available Packages
Name       : perl
Arch       : i386
Epoch      : 4
Version    : 5.8.8
Release    : 32.el5_5.2
Size       : 12 M
Repo       : repo_local
Summary    : El lenguaje de programación Perl.
URL        : http://www.perl.org/
License    : Artistic or GPL
Description: Perl es un lenguaje de programación de alto nivel derivado
           : del lenguaje C, de sed, de awk y de los script de la shell. Es adecuado
           : para la gestión de procesos, de ficheros y en particular de
           : ficheros de texto. Perl es un lenguaje sencillo y eficaz. Se utiliza
           : normalmente para la creación de utilidades de administración del sistema
           : y para la programación de sitios Web. Gran parte de los scripts CGI de la
           : web están escritos en Perl. Es necesario que instale el paquete perl en su
           : sistema si desea gestionar los scripts de Perl.
           :
           : Instale este paquete si desea programar en Perl o habilitar  su sistema
           : para gestionar los scripts Perl.

Si el repositorio lo quisierais además de para vuestros RPM personalizados para los oficiales de CentOS, deberíais sincronizarlo periódicamente con un mirror oficial y ejecutar después el createrepo. Podéis hacerlo en un cron, siendo el comando algo así:

# rsync -avz centos.mirror.xtratelecom.es::CentOS/5.6 /repo_local/centos/ && createrepo repo_local

Nota: no todos los repositorios aceptan rsync, en la lista de mirrors de CentOS veréis los que sí que lo permiten. El que uso en el ejemplo sí.

6 trucos útiles del gestor de paquetes yum


YumPara una primera toma de contacto con Yum os aconsejo leer el artículo que publiqúe hace ya un tiempo: Gestión de paquetes en Linux con Yum, posteriormente estos trucos os pueden ser de utilidad.

En qué paquete se encuentra un determinado fichero

A través del parámetro whatprovides podemos consultar en la base de datos de yum qué paquete contiene un determinado fichero. Esto es realmente útil por ejemplo si necesitamos saber en qué paquete se encuentra una determinada librería que necesitamos por dependencias, un fichero de configuración, etc.

Aquí por ejemplo necesitamos saber el paquete que contiene la librería libssl3.so, gracias a whatprovides vemos que se trata de nss-3.12.8-4.el5_6:

# yum whatprovides libssl3.so
46 packages excluded due to repository priority protections

Other       : libssl3.so

nss-3.12.8-4.el5_6.i386 : Network Security Services
Repo        : updates
Matched from:
Other       : libssl3.so

Instalar únicamente actualizaciones de seguridad

Instalando (a través de yum por supuesto) el paquete yum-security activamos en nuestro sistema la posibilidad de instalar únicamente aquellas actualizaciones relacionadas con la seguridad. Primero lo instalamos:

# yum install yum-security

Una vez instalado podemos lanzar una consulta para examinar las actualizaciones de seguridad pendientes en el sistema:

# yum list-security

Y finalmente para instalarlas:

# yum update --security

Hacer downgrade de un paquete instalado

Para poder bajar de versión un paquete instalado por yum también tendremos que instalar un plugin extra ya que por defecto no está permitido. El paquete es yum-allowdowngrade. Procedemos a instalarlo:

# yum install yum-allowdowngrade

Una vez instalado podemos hacer downgrade de la versión del paquete que queramos del siguiente modo:

# yum --allow-downgrade install mysql

También podemos verificar antes las versiones disponibles para instalar/downgrade:

# yum --allow-downgrade info mysql

Ver las dependencias de un paquete

A través de la opción deplist podemos verificar las dependencias que se instalarán junto con el paquete que queremos instalar.

# yum deplist httpd

package: httpd.i386 2.2.3-45.el5.centos.1
dependency: libz.so.1
provider: zlib.i386 1.2.3-3
dependency: /bin/mv
provider: coreutils.i386 5.97-23.el5_4.2
provider: coreutils.i386 5.97-23.el5_6.4
provider: coreutils.i386 5.97-23.el5_6.3
dependency: liblber-2.3.so.0
provider: openldap.i386 2.3.43-12.el5_5.3
provider: openldap.i386 2.3.43-12.el5_6.7
provider: openldap.i386 2.3.43-12.el5_6.5
...
...

Instalar un RPM y que yum instale las dependencias

Mediante la opción localinstall podemos instalar un paquete rpm local de modo que si fuera necesaria la instalación de otro paquete por dependencias sería yum quien revisara en sus repositorios si existen y en casi afirmativo los instalaría.

# yum localinstall /home/alex/xxxxxxxxxx.rpm

Actualizar un paquete instalado por yum mediante un RPM

Muy similar a localinstall, pero en este caso la opción localupdate nos permite actualizar un paquete que hemos instalado previamente con yum a través de un rpm local. Al igual que en la anterior opción, si es necesario, yum resolverá las dependencias.

# yum localupdate /home/alex/xxxxxxxxxx.rpm

¿Qué es mejor, compilar o usar yum/apt?


La respuesta es: depende…

A raíz del anterior artículo en el que explico cómo compilar Apache y PHP en Linux me ha apetecido escribir esta entrada en la que definir los pros y contras de compilar frente a usar gestores de paquetes precompilados tipo yum (rpm) o apt (.deb).

Es mejor compilar si…

  • Necesitamos tener instalada una versión reciente de la aplicación, y tener la opción de actualizarla en el momento que una nueva versión o parche de seguridad aparezca.
  • Necesitamos poder personalizar al 100% la aplicación. Compilando puedes definir una gran cantidad de parámetros, configuraciones y módulos. Esta flexibilidad te permite adaptar la aplicación a tus requerimientos. Los paquetes utilizados por los gestores de descargas añaden el mayor número de extras posibles para una mayor aceptación general.
  • No nos importa perder un poco de tiempo al principio (durante la instalación), ya que se requiere más tiempo que la instalación de un paquete precompilado (escasos segundos).
  • Probablemente lograremos un mejor rendimiento ya que adaptamos la aplicación a nuestros requerimientos.

Es mejor usar yum, rpm, apt, deb si…

  • Necesitamos hacer la instalación de forma rápida y sencilla. Los paquetes precompilados .rpm, .deb, etc se instalan en escasos segundos y automáticamente buscan las dependencias de cada paquete para evitar tener que instalarlas de forma manual como pasaría con la compilación.
  • No es crítico disponer de la última versión de la aplicación. Los repositorios por lo general no se actualizan a la misma velocidad que salen nuevas versiones (ni por asomo), por ejemplo RHEL y CentOS actualmente tienen en su repositorio la versión 5.1.6 de PHP y la estable es la 5.3.6.
  • Instalar el paquete precompilado no te permitirá personalizar la instalación del mismo como puedes hacerlo compilando. Normalmente se peca de exceso y se añaden módulos y extras en las aplicaciones que probablemente no necesites.
  • Siguiendo con el punto anterior, ese exceso de extras puede provocar peor rendimiento que el que te da la instalación por compilación ya que no has podido reducir el peso de la instalación o adecuarlo a tus necesidades.

Estos son, en mi humilde opinión, los pros y contras de cada una de estas formas de instalación en Linux (y en Unix en general).

Yum atascado en “Setting up Update Process”


En este caso, yum dejaba de responder en el punto de “Setting up Update Process“, pero puede pasar en cualquier momento de su ejecución. Para encontrar el problema podemos seguir los siguientes pasos:

  1. Revisar el log de yum en /var/log/yum.log en busca de errores
  2. Comprobar que no hay otra instancia de yum corriendo en el sistema (ps aux | grep yum)
  3. Hacer debug del proceso atascado con el comando strace (strace -p PID)
  4. Hacer un yum clean all.

Si pese a esos tres puntos seguís sin encontrar el fallo,es muy probable (era mi caso) que la base de datos de yum tenga algún tipo de corrupción. Para regenerarla hacemos lo siguiente:

# rm -f /var/lib/rpm/__db*
# rpm --rebuilddb
# yum clean all

Ahora podemos volver a intentar ejecutar yum de nuevo y comprobar si funciona correctamente.