Woop!

FAQ sobre Yum


Recopilatorio de preguntas frecuentes y tips/trucos sobre el gestor de paquetes Yum para distribuciones basadas en Red Hat (RHEL, CentOS, Fedora, etc.)




Plugin yum-security para Yum


El plugin yum-security para Yum permite gestionar las actualizaciones de seguridad de paquetes, de modo que podemos limitar la actualización de aquellos que tengan únicamente fallos de seguridad, ejemplo:

yum install yum-security
yum update --security


También podemos listar aquellos paquetes que tienen fallos de seguridad y todavía no hemos actualizado, así como información adicional sobre dichas vulnerabilidades:

yum list-security
yum info-security


El plugin yum-security también permite actualizar aquellos paquetes que se ven afectados por un determinado ID de BugZilla (--bz) o CVE (Common Vulnerabilities and Exposures), ejemplo:

yum update --cve CVE-2008-0947


Podemos encontrar información adicional sobre el plugin yum-security para Yum en:

- KB de RHEL 5: Is it possible to limit Yum so that it lists or installs only security updates?
- KB de RHEL 5: Is it possible to install a security update based on a CVE reference?
- Red Hat Magazine. Tips and tricks: yum-security



Reinstalación de un paquete RPM con Yum


Yum carece de una funcionalidad muy interesante que tienen otros gestores de paquetes como el APT de Debian: forzar la reinstalación de un paquete RPM ya instalado. Es una tarea muy útil si queremos recuperar o restablecer un fichero que hemos borrado por error, recuperar los permisos que hemos cambiado a un fichero de configuración importante, volver a instalar un binario que ha sido comprometido tras una intrusión o ataque, recuperarnos tras un catastrófico "chmod -R 777 /", etc.. algo que con el APT de Debian se soluciona rápidamente con el comando "apt-get install --reinstall paquete".

Estos son algunos "hacks" para tratar de simular el --reinstall de APT para forzar la reinstalación de un paquete RPM con Yum:


yum remove paquete
yum install paquete



rpm -e --nodeps paquete
yum install paquete



rpm -e --justdb --nodeps paquete
yum install paquete




Descargar un paquete RPM con Yum sin necesidad de instalarlo


El plugin yum-downloadonly para Yum permite descargar paquetes RPM sin tener que llegar a instalarlos, así evitamos tener que localizarlo en el mirror, FTP, etc..

Ejemplo: Para descargar el paquete ipvsadm sin llegar a instalarlo en una CentOS 5, instalamos el paquete yum-downloadonly y utilizamos el nuevo flag --downloadonly:

# yum install yum-downloadonly
# yum --downloadonly install ipvsadm
(..)
exiting because --downloadonly specified 

# ls -1 /var/cache/yum/base/packages
ipvsadm-1.24-8.1.i386.rpm


Los paquetes se descargaran por defecto en el directorio /var/cache/yum/base/packages, pero podemos modificar esta parámetro con el flag --downloaddir=.

Si el paquete ya estaba instalado previamente este plugin no funcionará y tendremos que utilizar algún hack tipo –-installroot:

# mkdir -p /tmp/var/cache
# cp -a /var/cache/yum /tmp/var/cache
# yum --downloadonly --installroot=/tmp install ipvsadm
# ls -1 /tmp/var/cache/yum/base/packages/
ipvsadm-1.24-8.1.i386.rpm


En este caso el paquete estará dentro del directorio temporal que hemos utilizado como raíz (parámetro –-installroot), realmente es un hack un poco chapucero.. pero en algunas ocasiones puede resultar mas cómodo que acudir a buscarlo al FTP, mirror, etc..

También podemos utilizar el script yumdownloader del paquete yum-utils:

# yum install yum-utils
# yumdownloader ipvsadm


NOTA: Es importante recordar que Yum por defecto no deja una copia del paquete RPM en /var/cache/yum una vez instalado, pero podemos activar (valor 1) o desactivar (valor 0) este comportamiento modificando el parámetro keepcache en el fichero /etc/yum.conf, los paquetes RPM estarán en este directorio hasta que se ejecute un yum clean all o se borren manualmente...



Downgrade de versión en un paquete RPM con Yum


Por defecto, Yum y RPM no permiten hacer downgrade de versiones de un paquete ya instalado, es decir, no es posible instalar una versión anterior. En RPM podemos utilizar el flag --oldpackage para indicar que queremos volver atrás e instalar una versión anterior, en este caso vamos a hacer un downgrade de la release 22.2 -> 22.1:

# rpm -q -a httpd --queryformat="%{VERSION} - %{RELEASE}\n"
2.2.3 - 22.2
# rpm -Uvh --oldpackage  httpd-2.2.3-22.1.rpm
# rpm -q -a httpd --queryformat="%{VERSION} - %{RELEASE}\n"
2.2.3 - 22.1


Si queremos hacer downgrade con Yum tenemos que utilizar el plugin yum-allowdowngrade:

yum install yum-allowdowngrade
yum --allow-downgrade install httpd




Descargar el código fuente, source o SRPM de un RPM con Yum


Si queremos descargar el código fuente de un RPM (SRPM) con Yum tendremos que añadir un repositorio extra a la configuración y utilizar el script yumdownloader, ya que por defecto no está habilitada esta funcionalidad. Este repositorio funciona para cualquier versión y arquitectura de CentOS (si quieres puedes descargarte el fichero CentOS-Source.repo desde aquí):

[root@woop ~]# cat /etc/yum.repos.d/CentOS-Source.repo
[source]
name=CentOS-$releasever - Source
baseurl=http://mirror.centos.org/centos/$releasever/os/SRPMS/
enabled=1
gpgcheck=0


NOTA: En lugar de utilizar el servidor mirror.centos.org puede ser buena idea pasarse por el servicio de mirrors de CentOS y seleccionar el mas adecuado.

Una vez configurado el nuevo repositorio con los SRPM, podemos utilizar yumdownloader con el flag --source para obtener el source del RPM, ejemplo:

yumdownloader --source httpd




Localizar binarios que estan en el $PATH y no pertenecen a ningun RPM


Tras una intrusión con acceso root a una máquina Linux suele ser muy habitual dejar binarios hackeados o ficheros que pertenecen a un rootkit dentro del $PATH. La mayoría de las aplicaciones para detectar rootkits de forma automática no contemplan este escenario, ya que suelen comprobar la integridad de las aplicaciones instaladas basandose en los metadatos de los paquetes RPM/DPKG, etc..

Este pequeño script genera un listado de todos aquellos ficheros que están en el $PATH del usuario que lo ejecuta, y por cada uno de ellos se comprueba si pertenece a algún paquete RPM (con el parámetro --whatprovides), en caso de no pertenecer se genera una alerta:

#!/bin/bash

# Localiza binarios que estan en el $PATH y no pertenecen a ningun RPM
# $Id: notowned_rpm.sh 1158 2009-09-10 10:55:47Z santi $

# A partir de $PATH generar el listado de directorios a analizar, cambiando
# los ":" por un espacio :)
DIRS=`echo $PATH | tr ":" " "`

# Por cada fichero -que no sea un enlace- comprobar si pertenece a un RPM
for FILE in `find $DIRS -type f ! -type l 2> /dev/null` ; do
	rpm -qf $FILE > /dev/null || echo "$FILE is not owned by any RPM"
done




Localizar y borrar paquetes RPMs duplicados


En ocasiones ocurre que podemos llegar a tener instaladas dos o mas versiones diferentes del mismo paquete RPM, para tratar de solucionarlo podemos reconstruir la base de datos RPM por si se tratara de algún error con el comando rpm --rebuilddb, y si tras la reconstrucción siguen apareciendo paquetes duplicados tendremos que localizar y borrar el mas antiguo para mantener el mas reciente.

El paquete yum-utils contiene el script package-cleanup que entre otras cosas sirve para localizar de forma automática los paquetes RPMs duplicados (también localiza cualquier otro problema con los RPMs como: entradas corruptas en la BBDD, paquetes huerfanos que no han sido instalados desde un repositorio, etc..):

# yum install yum-utils
# package-cleanup --cleandupes	


Podemos automatizar esta tarea con unas sencillas consultas a la base de datos RPM, ejemplo:

#!/bin/bash

# $Id: duplicate_rpm.sh 1200 2009-09-21 09:35:49Z santi $

# Obtiene un listado de los paquetes RPMs duplicados y borra el mas antiguo.
# Tip: En lugar de borrar el paquete con "rpm -e" es deseable borrarlo con Yum
# activando el flag "tsflags=repackage" en el fichero "yum.conf" para guardar
# un backup del paquete borrado en "/var/spool/repackage". --Santi, 2009-09-21

for PACKAGE in `rpm -qa --queryformat="%{NAME}\n" | sort | uniq -d` ; do
		echo rpm -e `rpm -q $PACKAGE | head -1`
		# yum remove `rpm -q $PACKAGE | head -1`
done


NOTA: Si queremos borrar todas las versiones, y de diferentes arquitecturas, del mismo paquete se debe utilizar el flag --allmatches al llamar a RPM.



Localizar paquetes RPM huérfanos con rpmorphan (equivalente al deborphan de Debian)


Cuando instalamos un paquete con Yum, APT, etc.. suele ser habitual que se instalen otros por dependencias. Posteriormente si borramos ese paquete "padre" los paquetes-dependencias seguirán instalados ocupando espacio en disco, a estos paquetes se les llamar huérfanos (no tienen padre). Para distribuciones basadas en Red Hat, existe el script rpmorphan que nos a ayuda a localizar estos paquetes RPM huérfanos.

El programa trata de ser un clon de su equivalente en Debian, deborphan, incluso su sintaxis es prácticamente idéntica, ejemplos:

# rpmorphan
libdbi-dbd-mysql
libmcrypt

# rpmorphan --guess-all
libdbi-dbd-mysql
libmcrypt
sendmail-doc
sgml-common
xml-common


Adicionalmente, al instalar el RPM rpmorphan se instalarán las utilidades rpmdep para consultar las dependencias de un determinado paquete, rpmduplicates para localizar paquetes RPMs duplicados y rpmusage para determinar cuando fue usado por última vez los binarios de un RPM (funciona comparando el "atime" del inodo contra el "atime" que debería tener según la información del RPM).

NOTA 1: El paquete yum-utils contiene el plugin package-cleanup para Yum, que permite automatizar la tarea de limpieza de paquetes huérfanos tras terminar cada ejecución de Yum pasando el flag --leaves. También podemos listar los paquetes instalados que no pertenecen a los repositorios configurados, es decir, instalaciones manuales y/o instalados por otro método:

/usr/bin/package-cleanup --orphans
rpmorphan-1.4-1.noarch


NOTA 2: No se debe confundir el concepto de paquete huérfano (que no tiene padre) con el que se suele utilizar entorno a la distribución Fedora para referirse a que el paquete RPM no tiene un "mantenedor", es decir, alguien encargado de actualizarlo.



Como reempaquetar un RPM ya instalado


Con el script rpmrebuild (de Eric Gerbier, el mismo autor de rpmorphan, rpmrestore, etc..) podemos re-empaquetar un fichero RPM desde un paquete ya instalado, la herramienta trata de ser el equivalente al dpkg-repack de Debian.

El script resulta muy útil cuando necesitamos instalar un RPM que tenemos instalado sobre una máquina pero no tenemos forma de obtener el RPM original (por ser una versión/aplicación obsoleta, el autor lo ha borrado, no existe el fichero SRPM o SPEC, etc.). En base a la información del paquete instalado, con rpmrebuild podemos reconstruir el fichero RPM e instalarlo donde sea necesario.

¿Cómo funciona? Para re-empaquetar un RPM ya instalado tan solo necesitamos los ficheros que este instala e "información adicional" (versión, dependencias, scripts de instalación, proceso de desinstalación, etc.): todo ello se encuentra en la base de datos de RPM (/var/lib/rpm), rpmrebuild se encarga extraer esta información y regenera el RPM original, ejemplo:

$ rpmrebuild rpmforge-release
/usr/lib/rpmrebuild/rpmrebuild.sh: WARNING: some files have been modified:
..5....T  c /etc/yum.repos.d/rpmforge.repo
Do you want to continue ? (y/N) y
Do you want to change release number ? (y/N) N
result: /usr/src/redhat/RPMS/i386/rpmforge-release-0.3.6-1.el5.rf.i386.rpm


El script permite realizar cualquier cambio "al vuelo" sobre el fichero SPEC, como por ejemplo cambiar la versión, release, etc. Para algo mas avanzado a la hora de re-empaquetar RPMs recomiendo la lectura de Hacking RPMs with rpmrebuild en la Red Hat Magazine.

Tip! Cuando borramos un paquete con rpm podemos pasarle el flag --repackage para dejar automáticamente un backup del RPM borrado en /var/spool/repackage (para que Yum guarde una copia de cada paquete borrado/actualizado tenemos que añadir tsflags=repackage en el fichero yum.conf): este proceso es muy similar a la forma de trabajar del script rpmrebuild, pero para obtener el RPM es necesario llegar a borrar el paquete (mas información en Transactions and rollback with RPM).



Ver el ChangeLog (listado de cambios) de un paquete antes y/o después de actualizarlo vía Yum


El plugin yum-changelog para Yum nos permite ver los cambios de un paquete antes y/o después de actualizarlo vía Yum. Ejemplo para ver los cambios que introduce el paquete strace antes de proceder a actualizarlo:

# yum install yum-changelog
# yum --changelog update strace
(..)
Changes in packages about to be updated:

strace-4.5.18-5.el5.i386
* Thu Apr 23 00:00:00 2009 Denys Vlasenko <dvlasenk@redhat.com> - 4.5.18-4
- Restore ^C handling inadvertently disabled in fairness fix
- Note: previous version (4.5.18-3) includes fixes for these bugs:
- Resolves: RHBZ #471169 (incorrent formatting of fcntl64() on32/64 system)
- Resolves: RHBZ #472053 (SIGKILL might be improperly traced)

* Fri Jun 19 00:00:00 2009 Denys Vlasenko <dvlasenk@redhat.com> - 4.5.18-5
- Remove unneeded changes on QE request
- Note: still includes fixes for these bugs:
- Resolves: RHBZ #471169 (incorrent formatting of fcntl64() on32/64 system)
- Resolves: RHBZ #472053 (SIGKILL might be improperly traced)
- Resolves: RHBZ #478419 (Improve fairness)
(..)


Editando la variable when del fichero /etc/yum/pluginconf.d/changelog.conf podemos indicar cuando queremos ver dichos cambios: antes de proceder con la actualización (when=pre) o una vez finalizado el proceso de actualización (when=post).

También podemos consultar el ChangeLog de un determinado paquete, utilidad similar al comando rpm -q --changelog paquete de RPM, o obtener un listado con todos los cambios aplicados a la distribución en un determinado rango de fechas (para ello tendremos que instalar antes el paquete python-dateutil desde RPMforge o nos dará el error Dateutil module not available, so can't parse dates):

# yum --enablerepo=rpmforge install python-dateutil

# yum changelog 2009-Jan yum
(..)
Listing changelogs since 2009-01-16

==================== Installed Packages ====================
yum-3.2.19-18.el5.centos.noarch          installed
* Thu Jan 22 23:00:00 2009 Karanbir Singh <kbsingh@centos.org> - 3.2.19-18.el5.centos
- Make yum require fastestmirror
- Obsolete for yum-repolist ( no longer needed )

changelog stats. 2 pkgs, 2 source pkgs, 1 changelog

Powered by Woop!