Archivo

Entradas Etiquetadas ‘rpm’

Modulo OCI8 para PHP 5.5 Software Collections en Red Hat 7

Lunes, 22 de Febrero de 2016

En el servidor web que administro, ha surgido la necesidad de actualizar a PHP 5.5 para dar soporte a las nuevas versiones de productos como phpMyAdmin, Piwik y similares.

Para facilitar las tareas de mantenimiento del servidor utilizamos la versión de PHP distribuida con el sistema operativo Red Hat. En este caso, hemos decidido aprovechar esta actualización para también actualizar el SO a Red Hat 7 Enterprise Linux (en adelante RH7).

Sin embargo, la versión de PHP que viene con RH7 es la 5.4 y no nos sirve. Para resolver este problema Red Hat proporciona las Software Collections que incluyen la versión 5.5 y 5.6 de PHP. De momento vamos a optar por actualizar a la versión 5.5, ya que actualmente tenemos PHP 5.3 y el cambio a la 5.5 va a ser más sencillo que actualizar directamente a la 5.6 (más adelante ya abordaremos la actualización a PHP 5.6).

Aunque con las Software Collections se incluyen muchos módulos de PHP, no están todos los que utilizamos, en este caso concreto no está el modulo OCI8 para acceder a BBDD Oracle.

Por este motivo vamos a generarnos un nuevo paquete RPM compatible con el PHP 5.5 de las Software Collections que nos añada el modulo OCI8.

Este paquete lo vamos a generar en un servidor con RH7 que tenga la herramienta rpmbuild instalada.

En primer lugar hemos de instalarnos el Instant Client de Oracle para Linux. Necesitamos los paquetes RPM *-devel y *-basic de este cliente. He utilizado la versión 12 de Oracle y estos paquetes se pueden descargar desde la web de Oracle.

Ahora buscamos un RPM source del modulo OCI8 para PHP 5.5. Oracle nos proporciona uno para Red Hat 6 en la dirección: https://oss.oracle.com/projects/php/files/EL6/. Nos lo descargamos y lo descomprimimos en /root/rpmbuild/SOURCES con el siguiente comando:

# rpm2cpio php55-oci8-5.5.10-2.el6.src.rpm | cpio -idmv

Este paquete utiliza la versión 2.0.8 del OCI8 para PHP y existe la 2.0.10. Descargamos esta última versión y ubicamos el fichero en /root/rpmbuild/SOURCES.

Ahora hemos de adaptar el fichero SPEC (php55oci8.spec)  para generar los RPMs que necesitamos.  Modificamos lo siguiente:

1,2d0
< %{?scl:%scl_package php-oci8}
<
4c2
< # Builds the latest DTrace disabled PHP OCI8 extension on top of PHP 5.5
---
> # Builds the latest DTrace enabled PHP OCI8 extension on top of PHP 5.5
7,8c5,6
< %global apiver %{php55_php_core_api}
< %global zendver %{php55_php_zend_api}
---
> %global apiver 20121113
> %global zendver 20121212
12c10
< %define oci8peclver 2.0.10
---
> %define oci8peclver 2.0.8
24c22
< Name: %{?scl_prefix}php-oci8
---
> Name: php55-oci8
26,27c24,25
< Version: 5.5.21
< Release: 1%{?dist}
---
> Version: 5.5.10
> Release: 2%{?dist}
44a43
> Obsoletes: php53-oci8-11gR1 php53-oci8-12cR1
48c47
< Requires: %{?scl_prefix}php-common >= %{version}, oracle-instantclient12.1-basic >= %{oci12cR1ver}
---
> Requires: php55-common >= %{version}, oracle-instantclient12.1-basic >= %{oci12cR1ver}
50,53d48
<
< Requires: %{?scl_prefix}php(zend-abi) = %{php55_php_zend_api}
< Requires: %{?scl_prefix}php(api) = %{php55_php_core_api}
<
55c50,51
< BuildRequires: %{?scl_prefix}php-devel >= %{version}
---
> BuildRequires: dtrace-utils >= 0.4.0-5
> BuildRequires: php55-devel >= %{version}
57c53
< Provides: %{?scl_prefix}php-oci
---
> Provides: php55_database, php55-oci, mod_php = %{version}-%{phprelease}
68d63
< %setup -q -c -T -n %{pkg_name}-%{version}
71a67,82
> # Safety check for API version change.
> vapi=`phpize -v | sed -n '/PHP Api Version:/{s/.* //;p}'`
> if test "x${vapi}" != "x%{apiver}"; then
> : Error: Upstream API version is now ${vapi}, expecting %{apiver}.
> : Update the apiver macro and rebuild.
> exit 1
> fi
>
> # Safety check for Zend API version change.
> vzend=`phpize -v | sed -n '/Zend Module Api No:/{s/^[^0-9]*//;p;}'`
> if test "x${vzend}" != "x%{zendver}"; then
> : Error: Upstream Zend module ABI version is now ${vzend}, expecting %{zendver}.
> : Update the zendver macro and rebuild.
> exit 1
> fi
>
74c85
< %{_bindir}/phpize
---
> phpize
80c91
< PHP_DTRACE=no
---
> PHP_DTRACE=yes
86c97
< %configure --with-php-config=%{_bindir}/php-config --with-oci8=shared,instantclient,/usr/lib/oracle/$VER/client64/lib
---
> %configure --with-oci8=shared,instantclient,/usr/lib/oracle/$VER/client64/lib
164,168d174
< * Fri Feb 19 2016 David Fernandez <david.fernandez@ehu.eus> 5.5.21
< - Use Red Hat Enterprise Linux 7
< - Use PHP 5.5.21
< - Use OCI8 2.0.10
<
209c215
< * Sun Nov 1 2009 Christopher Jones <christopher.jones@oracle.com> 5.2.11
---
> * Mon Nov 1 2009 Christopher Jones <christopher.jones@oracle.com> 5.2.11
215c221
< * Tue Apr 28 2009 Christopher Jones <christopher.jones@oracle.com> 5.2.9
---
> * Wed Apr 28 2009 Christopher Jones <christopher.jones@oracle.com> 5.2.9
227,228c233,235
< * Fri Aug 8 2008 Srinivas Maturi <srinivas.maturi@oracle.com> 5.1.6-20.el5_2.1
< - Update BuildRequires for oracle-instantclient-devel and Conflicts for oracle-instantclient-basic
---
> * Tue Aug 08 2008 Srinivas Maturi <srinivas.maturi@oracle.com> 5.1.6-20.el5_2.1
> - Update BuildRequires for oracle-instantclient-devel and Conflicts for
> oracle-instantclient-basic
230c237
< * Tue Aug 5 2008 Srinivas Maturi <srinivas.maturi@oracle.com> 5.1.6-20.el5_2.1
---
> * Tue Aug 05 2008 Srinivas Maturi <srinivas.maturi@oracle.com> 5.1.6-20.el5_2.1
233c240
< * Mon Jul 21 2008 Srinivas Maturi <srinivas.maturi@oracle.com> 5.1.6-20.el5_2.1
---
> * Fri Jul 21 2008 Srinivas Maturi <srinivas.maturi@oracle.com> 5.1.6-20.el5_2.1
237c244,245
< - Update rpm name, add libaio as runtime dependency, remove code to run tests at build time
---
> - Update rpm name, add libaio as runtime dependency, remove code to run
> tests at build time

Una vez que ya tenemos el fichero spec, generamos los ficheros RPMs con el siguiente comando:

# rpmbuild -ba php55oci8.spec --define "scl php55"

Si todo ha ido bien, los RPMs estarán en /root/rpmbuild/RPMS y ya los podremos instalar con YUM.

Linux , , , , , ,

Yum Shell

Lunes, 10 de Noviembre de 2014

En algunos casos nos puede surgir la necesidad de sustituir un paquete por otro que proporcione la misma funcionalidad. Para complicar el asunto, se da la circunstancia de que no es posible tener instalados los dos paquetes simultáneamente (porque generan un conflicto al instalar el segundo de ellos) y además no es práctico desinstalar uno para instalar el otro, ya que es un paquete del que dependen muchos otros y la desintalación de ese paquete implicaría la desintalación de muchos otros. Este es el caso que se da al intentar sustituir el paquete rsyslog por el nuevo rsyslog7 en un Red Hat Enterprise Linux 6.

Para resolver esta situación podemos utilizar el Yum Shell, con el que podremos crear una transacción básica Yum que nos permitirá sustituir el paquete deseado sin modificar los otros.

La secuencia de comandos que utilizaríamos para sustituir el paquete rsyslog por rsyslog7 con el yum shell sería la siguiente:

# yum shell
> remove rsyslog
> install rsyslog
> run
> exit
# service rsyslog start
# chkconfig rsyslog on

Linux , ,

RPMBinario

Lunes, 23 de Mayo de 2011

Creación de RPMs binarios

El propósito de este documento es detallar los pasos que se han seguido para crearnos nuestro primer RPM. Como es el primero seguramente el proceso es notoriamente mejorable, pero por algo hay que empezar.

Necesitamos instalarlos la herramienta rpmbuild

# yum install rpm-build

Nos creamos un directorio donde crearemos los ficheros:

# mkdir /root/misrpms

Dentro de este directorio nos cremos otros: SPECS, BUILD, RPMS, SRPMS, SOURCES

# cd /root/misrpms
# mkdir SPECS BUILD RPMS SRPMS SOURCES

Nos cremos un fichero ~/.rpmmacros con el siguiente contenido:

%_topdir /root/misrpms
%_builddir %{_topdir}/BUILD
%_rpmdir %{_topdir}/RPMS
%_sourcedir %{_topdir}/SOURCES
%_specdir %{_topdir}/SPECS
%_srcrpmdir %{_topdir}/SRPMS

Ahora nos creamos el fichero spec del RPM a construir que contiene los datos necesarios para construir el RPM ~/misrpms/SPECS/aspell-eu.spec:

Name:           aspell-eu
Version:        20081029
Release:        1%{?dist}.el5
Summary:        Basque dictionary for aspell
Group:          Applications/Text
License:        GPL

%description
Basque dictionary for aspell 0.60. Files obtained from .deb package.

%prep

%build

%install

%clean

%files
%defattr(-,root,root,-)
/usr/lib/aspell-0.60/eu.multi
/usr/lib/aspell-0.60/eu.rws
/usr/lib/aspell-0.60/eu.dat
/usr/lib/aspell-0.60/euskera.alias
/usr/lib/aspell-0.60/eu_affix.dat

%doc

%changelog
* Mon Nov  8 2010  David Fernanez <david.fernandez@ehu.es>
- Initial version

Una vez creado este fichero ya procedemos a generar el RPM:

# rpmbuild -bb SPECS/aspell-eu.spec

En este comando podemos especificar la arquitectura para la que se crea el paquete con –target (pe. noarch, i386,…). Si no se específica se usará la del servidor donde se construye el paquete.

Y ya tenemos nuestro RPM en ~/misrpms/RPMS/noarch/aspell-eu-20081029-1.el5.noarch.rpm

Linux ,

Rsyslog5enRH5

Lunes, 14 de Marzo de 2011

Instalar Rsyslog 5.6.x en Red Hat 5

Red Hat 5 a partir de la versión 5.2 incluye el software rsyslog. Rsyslog es un sustituto del syslog tradicional de los sistemas Unix que incorpora funcionalidad nueva (envio de logs mediante TCP, a una BBDD,…). Sin embargo, la versión que se incluye con la distribución (3.22.x) es bastante antigua y tiene limitaciones.

En mi caso concreto me encontré con un error en el módulo imfile (módulo de rsyslogpara la lectura de fichros de logs). Este error ocasionaba que bajo determinadas circunstancias, en ficheros grandes, rsyslog perdiera el punto donde se encontraba leyendo el fichero y volviera a empezar desde el principio, con la consiguiente duplicación de mensajes.

Por este motivo decidí proceder a la instalación de una versión más reciente de rsyslog (la rama estable a fecha de este documento 5.6.x). Dado que esto lo debía hacer en varios servidores, en lugar de compilar en software en cada uno de ellos, me decidí por la opción de generar un RPM binario para luego instalar el software en los diferentes servidores.

Generar un RPM binario con la nueva versión de RSYSLOG para RH5

En primer lugar nos descargamos el SourceRPM del paquete rsyslog del RawHide de Fedora (a fecha de este documento este source era para la versión 5.6.2 de rsyslog). También nos descargamos el código fuente de Rsyslog.

En principio a partir de un Source RPM es fácil generar los RPMS binarios, pero en este caso a partir de Fedora 11 se ha cambiado el algoritmo resumen a la hora de generar los RPMs por lo que no podemos usar directamente ese Source RPM, tenemos que volver a generarlo.

Para volver a generar el Source RPM en primer lugar extraemos los ficheros del mismo:

# rpm2cpio rsyslog-5.6.2-2.fc15.src.rpm | cpio -idmv
cpio: rsyslog-5.6.2.tar.gz not created: newer or same age version exists
rsyslog-5.6.2.tar.gz
rsyslog.conf
rsyslog.init
rsyslog.log
rsyslog.spec
rsyslog.sysconfig
4451 blocks

Además de regenerar el source RPM vamos a actualizar la versión del paquete RPM. Para eso copiamos los ficheros rsyslog.conf, rsyslog.init, rsyslog.log y rsyslog.sysconfig extraidos anteriormente a la carpeta ~/SOURCES del rpmbuild (ver creación de un RPM binario). También copiamos a esta carpeta el fichero con el código fuente de RSYSLOG que nos hemos descargado (rsyslog-5.6.4.tar.gz).

Modificamos el fichero ~/SOURCES/rsyslog.log y lo dejamos como sigue (si no hacemos esto, al instalar el RPM se producirá un conflicto en el fichero /etc/logrotate.d/syslog con el paquete sysklogd de la distribución de Red Hat y eso nos complicará – aunque no de forma insalvable – la instalación de la nueva versión de rsyslog):

/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
 sharedscripts
 postrotate
 /bin/kill -HUP catvarrunsyslogd.πd2>devνll 2> /dev/null || true
 /bin/kill -HUP catvarrunrsyslogd.πd2>devνll 2> /dev/null || true
 endscript
}

A continuación editamos el fichero rsyslog.spec y cambiamos las líneas 8 y 9:

Version: 5.6.2
Release: 2%{?dist}

por

Version: 5.6.4
Release: 1%{?dist}

Para generar el RPM binario necesitamos instalar una serie de dependencias. Para ello instalamos los siguientes paquetes:

# yum install mysql-devel postgresql-devel krb5-devel librelp-devel gnutls-devel net-snmp-devel

El paquete librelp-devel lo encontraremos en el repositorio EPEL.

Ahora procedemos a reconstruir el source RPM con:

# rpmbuild -bs rsyslog.spec

Una vez regenerado el source RPM procedemos a compilarlo para generar los binarios (vamos a necesitar el gcc). Lo hacemos con:

# rpmbuild --rebuild ~/SRPMS/rsyslog-5.6.4-1.src.rpm

Si todo va bien se nos habrán creado los RPMs binarios en ~/RPMS. Estos binarios son dependientes de la arquitectura por lo que habrá que generarlos en un servidor de 32 bits para las maquinas de 32 bits y en un servidor de 64 bits para las maquinas de 64 bits.

Estos RPMs ya están listos para ser instalados. Para facilitar este proceso se han movido al repositorio EHURepo.

Linux , , , ,

CreacionRepositorioYUM

Miércoles, 10 de Noviembre de 2010

Creación de un repositorio YUM para Red Hat 4 y 5

En este documento pretendo explicar una forma rápida y sencilla de crearnos nuestro propio repositorio de paquetes RPM. El acceso al repositorio será vía web.

Crearemos un repositorio distinto por cada versión de SO (4 y/o 5) y arquitectura (32 bits y/o 64 bits). Los repositorios para Red Hat 4 serán accesibles mediante la herramienta up2date y los de Red Hat 5 mediante yum.

Para crear los repositorios necesitamos instalarnos las herramientas:

  • createrepo: es la encargada de generar los repositorios para YUM
  • repoview: genera unas páginas HTML indice con el contenido del repositorio. Estas páginas se generan dentro de una carpeta repoview y nos permite navegar por los paquetes del repositorio y obtener información sobre ellos.
  • yum-arch: esta herramienta la necesitamos para Red Hat 4 para generar unos ficheros .hdr que usa up2date.

Dado que el repositorio va a ser accesible vía web, también necesitamos un servidor web, en este caso yo voy a utilizar el servidor Apache.

Los repositorios se van a crear en un servidor con Red Hat 5 con el repositorio EPEL configurado (en este repositorio están disponibles las herramientas mencionadas con anterioridad).

La instalación de estas herramientas la hacemos con el siguiente comando:

yum install createrepo repoview yum-arch

A continuación nos creamos los directorios que albergarán el repositorio. Estos directorios deberán ser accesibles vía web.  Crearemos un directorio por cada repositorio.

Una vez creados los directorios hemos de copiar dentro de ellos los diferentes paquetes RPM que queremos dejar disponibles en el repositorio.

Nota:  Si tenemos activado SELinux, hemos de revisar el contexto de los ficheros *.rpm copiados, ya que por defecto se les asigna uno que los deja inaccesibles para el Apache.

Una vez copiados los RPMs que nos interesen y cada vez que se haga una modificación ejecutaremos los siguientes comandos para generar/actualizar el repositorio:

createrepo -d $dir
repoview $dir

siendo $dir el directorio del repositorio.

Además, en el caso de actualizar los repositorios de Red Hat 4 también ejecutaremos:

yum-arch $directorio

Al ejecutar esta herramienta obtenemos un aviso de que esta deprecated, pero es la forma que he encontrado para crear el repositorio en Red Hat 4.

Configuración del repositorio en los clientes

El activar el repositorio en los clientes depende de si vamos a usar Red Hat 4 (up2date) o Red Hat 5 (yum).

Red Hat 4 (up2date)

Nos hemos de crear un fichero /etc/yum.repos.d/myRepo.repo con el siguiente aspecto:

[myRepo]
name=myRepo Repository for Enterprise Linux 4 - $basearch
baseurl=http://$urlrepositorio
enabled=1
gpgcheck=0

Además hemos de dar de alta el repositorio en la configuración de los sources de up2date (/etc/sysconfig/rhn/sources) añadiendo las siguientes líneas al fichero mencionado con anterioridad:

#BEGIN myRepo
yum myRepo http://$urlrepositorio
#END myRepo

Con esto ya está dado de alta el repositorio en nuestro cliente.

Nuestro repositorio no tiene activado el uso de GPG. En caso de querer utilizar paquetes firmados con GPG hay que hacer más cosas, pero eso se escapa de los objetivos de esta documentación. Para poder utilizar este repositorio no firmado  es necesario pasar el parámetro –nosig al up2date para que no compruebe la firma GPG. Se podriá desactivar esta comprobación de forma global para todos los repositorios RPM, pero esto puede ser demasiado radical.

Red Hat 5 (Yum)

Nos hemos de crear un fichero /etc/yum.repos.d/myRepo.repo con el siguiente aspecto:

[myRepo]
name=myRepo Repository for Enterprise Linux 5 - $basearch
baseurl=http://$urlrepositorio
enabled=1
gpgcheck=0

A semejanza del repositorio EPEL (y supongo que otros) se podría crear un paquete RPM que se encargara de configurar el nuevo repositorio en nuestros clientes.

Linux , , , ,

Red Hat Linux: instalación repositorio EPEL

Lunes, 1 de Marzo de 2010

EPEL (Extra Packages for Enterprise Linux) es un repositorio de paquetes para Red Hat Enterprise Linux 4 y 5.  Son paquetes que complementan la distribución original de Red Hat.  Es un repositorio mantenido dentro del proyecto Fedora.

La instalación de este repositorio la haremos de la siguiente forma:

Red Hat 4 32 bits:

# rpm -Uvh http://download.fedora.redhat.com/pub/epel/4/i386/epel-release-4-9.noarch.rpm
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL

(si no importamos la clave GPG, al instalar los paquetes con up2date nos dará error)

Red Hat 5 64 bits:

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm

Una vez instalado el repositorio, ya tendremos acceso a sus paquetes con los comandos up2date (Red Hat 4) y yum (Red Hat 5).

Linux , ,