User Tools

Site Tools


guia_rapida_y_completa_de_yum_y_rpm

Table of Contents

Guía rápida y completa de YUM / RPM

YUM

El gestor de paquetes Yellowdog Updater Modified (YUM), al contrario que el comando rpm, no tiene opción para instalar aplicaciones sin resolver dependencias. Estos son alguno de sus ficheros más importantes.

  • /etc/yum.conf: Archivo de configuración principal.
  • /etc/yum.repos.d: Directorio de repositorios.
  • /var/log/yum.log: Ficheros de log.

Yum tiene muchas más opciones que las descritas en esta guía rápida, para obtener más información es recomendable ver el manual oficial / google. Si crees que se debe añadir alguna opción interesante a esta guía simplemente envía un correo electrónico y será agregada de inmediato.

Enlace de interés: Administración de paquetes en CentOS 7 / RedHat

Instalar / Reinstalar / Desinstalar

La opción “-y” desactiva el modo interactivo, no preguntará confirmación.

yum install paquete
yum groupinstall 'MySQL Database'     #(Grupos)
yum reinstall paquete
yum reinstall "@Grupo de paquetes"     #(Grupos)
 
# Reinstalar todos los paquetes del sistema instalados con yum.
yum reinstall \*

Forzar el borrado del paquete únicamente de la base de datos RPM y volver a instalarlo vía Yum.

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

NOTA: De este modo los ficheros no se borrarán del sistema y a efectos de RPM/YUM este no estará instalado y podrá volver a instalarse, sobrescribiendo los ficheros existentes

yum remove
yum groupremove     #(Grupos)

No utilizar verificación de clave GPG con YUM (Instalar / Reinstalar / Actualizar)

yum --nogpg install paquete
yum --nogpg reinstall paquete
yum --nogpgcheck update

Mostrar versiones instaladas y versiones disponibles para actualizar

Primero mostrará “Installed Packages” y posteriormente “Available Packages”. No hay forma de tenerlo todo en una misma linea.

yum list `rpm -qa --qf '%{NAME}'`

Excluir paquetes al actualizar

yum --exclude=httpd update

Para una lista de paquetes.

yum --exclude=mysql\* --exclude=httpd\* update

También se pueden definir exclusiones en los ficheros de repositorio y en /etc/yum.conf con “exclude=procps* kernel*” para que nunca se comprueben dichos paquetes al buscar actualizaciones.

Si queremos desactivar todas las exclusiones en un momento dado se puede hacer lo siguiente.

yum --disableexcludes=all update

Instalar únicamente actualizaciones de seguridad

yum install yum-security
yum list-security
yum update --security 

Instalar actualizaciones de seguridad filtrando por CVE / Advisory

Listar los paquetes con problemas de seguridad indicando su CVE y no la numeración de RedHat.

yum updateinfo list cves
# Muestra información de una determinada vulnerabilidad dando el identificador CVE.
yum updateinfo info --cve CVE-2012-3954
# Actualiza los paquetes afectados por esa vulnerabilidad.
yum update --cve CVE-2012-3954
# Actualiza los paquetes afectados por ese Advisory.
yum update --advisory ELSA-2012-1141

Buscar sabiendo o no el nombre exacto del paquete

# Conociendo el nombre exacto del paquete.
yum list paquete
# Conociendo solo parte del nombre del paquete.
yum list php*

Mostrar información de un paquete instalado / en los repositorios

yum info paquete

NOTA: Si el paquete está instalado mostrará el repositorio origen.

Buscar sin saber el nombre exacto

Buscará en nombres de paquete y descripción, usado cuando no se conoce el nombre exacto del paquete, tiene un resultado similar al de la opción “list”.

yum search My*

Con “all” se busca en nombre, descripción y paquetes relacionados aunque no lo expresen de forma explícita.

yum search all mysql

Actualizar / Desactualizar (Downgrade) paquete

Actualizar un paquete con YUM.

yum update paquete
yum groupupdate 'Grupo de paquetes'     #(Grupos)

Desactualizar (Downgrade) paquetes con YUM, por ejemplo icinga2.

yum --showduplicates list icinga2   # Revisamos todas las versiones de un paquete en los repositorios, en este caso icinga2.
rpm -qa | grep -i icinga2           # Se comprueba la versión instalada actual.
yum downgrade icinga2-common-2.8.4 icinga2-bin-2.8.4 icinga2-2.8.4 icinga2-libs-2.8.4   # Downgrade.

Desactualizar (Downgrade) un paquete con YUM mediante el plugin “yum-allowdowngrade”.

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

NOTA: Al actualizar un paquete rpm, nunca se sabe qué ficheros de configuración van a ser sobrescritos y cuales no, eso depende de como se haya construido el paquete (Leer). Por norma, si el fichero de configuración se encuentra en el directorio estándar, no se suele sobrescribir, si no que se crean ficheros “.rpmnew” o “.rpmsave”. Pero como comentamos antes, depende de como se haya creado el paquete rpm.

Lista paquetes pendientes de actualizaciones

yum list updates
yum check-update

Actualizar todos los paquetes instalados

yum update
yum groupupdate 'DNS Name Server'            #(grupo)

Automatizar actualizaciones del sistema al arrancar (RedHat, Fedora, Centos,…).

chkconfig --level 345 yum on; service yum start

Mostrar las versiones de los paquetes instalados y sus actualización disponible: Leer.

Listar grupos de paquetes disponibles

Los grupos instalan conjuntos de paquetes: idioma / servidor / etc.

yum grouplist
repoquery -i nginx         # yum-utils debe estar instalado.

Ver paquetes instalados

Muestra el repositorio desde donde se instalo.

yum list installed

Mostrar el repositorio y paquete al que pertenece un fichero

NOTA: Acepta expresiones regulares.

yum provides "*/nginx.conf"
 yum whatprovides "/usr/share/icons/hicolor/16x16/apps/java.png"

Listar paquetes de un repositorio

yumdb search from_repo 'my-*-repo'

Problema al usar el repositorio XXXX recién agregado.

Error: Cannot retrieve metalink for repository: XXXX. Please verify its path and try again

Solución: Instalar los certificados.

yum upgrade ca-certificates --disablerepo=XXXX

Listar repositorios instalados (activados / desactivados)

yum repolist all
yum repolist disabled
yum repolist enabled

En algunos proyectos como por ejemplo MySQL, se ofrece un fichero RPM que instala varios repositorios (Todo dentro del mismo fichero mysql-community.repo) para así poder tener disponibles la instalación de varias versiones diferentes. Para ello se deben activar los repositorios correspondientes a la versión que se desea instalar. En otros proyectos se ofrece un repositorio en el conviven juntas todas las versiones del software requerido, en estos casos simplemente se debe especificar la versión que se desea instalar a la hora de ejecutar yum.

Especificar un repositorio en concreto para trabajar

yum --disablerepo="*" --enablerepo="google" list available 

Ver Historial de yum

Si no especificamos “all” mostrará las últimas transacciones.

yum history list all

Historial de un determinada transacción o paquete. (Cuando se instaló, dependencias, usuario, etc.).Se pueden especificar rangos de transacciones.

yum history info 23
yum history info java-1.5.0-gcj
yum history info 1..23

Transacciones donde han estado involucrados paquetes que empiecen con “perl-”.

yum history package-list perl-*

Ver cuantos paquetes fueron modificado en las transacciones de YUM (Instalar, Actualizar y Eliminar). Se pueden especificar rangos.

yum history summary 23
yum history summary 21..23

Repetir o deshacer una determinada transacción.

yum history redo 23
yum history undo 23

Significado de los campos de yum history

ID:Número de transacción.
Login user: Usuario que realizo la tarea.
Date and time: Fecha.

Action(s): Lista de acciones.

  • D o Downgrade: Actualización a una versión anterior.
  • E o Erase: Desinstalar.
  • I o Install:Instalar.
  • O o Obsoleting: Paqute marcado como obsoleto.
  • R o Reinstall: Reinstalación.
  • U o Update: Actualización de una versión superior.

Altered: Número de paquetes afectados por yum

  • <: Antes de que finalizara la transacción (acción realizada con YUM), la base de datos rpmdb fue cambiada.
  • >: Después de que finalizara la transacción (acción realizada con YUM), la base de datos rpmdb fue cambiada.
  • *: La transacción falló y no pudo ser terminada.
  • #: La transacción finalizó correctamente pero YUM devolvió un código de salida distinto de 0.
  • E: La transacción finalizó correctamente pero se mostró un aviso o error.
  • P: La transacción finalizó correctamente pero hay problemas con la base de datos rpmdb.
  • s: La transacción finalizó correctamente pero se utilizó “–skip-broken” para no instalar determinados paquetes.

Rehacer / Deshacer instalaciones y desinstalaciones con el historial

Visualizamos el historial de yum.

yum history

Buscamos información sobre una determinada acción realizada en yum.

yum history info 100

Si queremos deshacer una acción (instalación - desinstalacion / desinstalación - instalación).

yum history undo 100

Si queremos rehacer una acción en concreto.

yum history redo 100

Ejemplo (id=100 es una instalación de nmap).

yum history undo 100
yum history redo 100

El primer comando desinstalaría nmap y el segundo comando lo volvería a instalar.

Instalar un paquete rpm con yum

Esto resolvería las dependencias de un paquete rpm descargado e instalaría el paquete.

yum localinstall paquete.rpm paquete2.rpm

Instalar paquetes rpm desde yum es muy socorrido en casos de bucles de dependencias, donde un paquete A necesita primeramente de B para ser instalado y el paquete B necesita a su vez la instalación previa de A. Veamos un ejemplo.

rpm -ivh perl-Git-1.8.3.4-1.1.x86_64.rpm
error: Failed dependencies:
        git = 1.8.3.4-1.1 is needed by perl-Git-1.8.3.4-1.1.x86_64
 
rpm -ivh git-1.8.3.4-1.1.x86_64.rpm
error: Failed dependencies:
        perl(Git) is needed by git-1.8.3.4-1.1.x86_64
        perl-Git = 1.8.3.4-1.1 is needed by git-1.8.3.4-1.1.x86_64

Actualizar un paquete instalado con yum mediante un rpm

yum localupdate paquete rpm

Listar dependencias de un determinado paquete instalado o no

yum deplist <paquete>
 
# Alternativa teniendo yum-utils 
repoquery --requires --resolve <paquete>

Las dos alternativa mostrarán casi lo mismo dependiendo como se usen, siendo repoquery algo más específica y amigable. deplist mostrará más detalles y mostrará varias arquitecturas, como x86_64 (64 bits) y i686 (32 bits compatible), etc. Si se usa el nombre del paquete completo, incluyendo versión y arquitectura, pero si se filtra se puede conseguir la misma salida. En este ejemplo los dos comandos muestran lo mismo.

yum deplist polkit-0.112-26.el7.x86_64 | grep -i provider | sort | uniq # Se eliminan proveedores de librerías repetidos.
repoquery --requires --resolve polkit | sort

Dependencias reversas: Listar de qué paquetes es dependencia un determinado paquete

Para saber qué aplicaciones instaladas necesitan a un paquete en concreto se utiliza “whatrequires”.

rpm -q --whatrequires ImageMagick

rpm -q –whatrequires ImageMagick</code>

Para saber qué aplicaciones de los repositorios necesitan a un paquete en concreto se utiliza repoquery.

repoquery -q --whatrequires texlive

Añadir un repositorio mediante ficheros ".repo"

Otra forma es añadirlos a mano en /etc/yum.repos.d/

yum-config-manager --add-repo http://www.example.com/example.repo

Habilitar / deshabilitar repositorios

Las expresiones regulares aceptadas.

yum-config-manager --enable example\*
yum-config-manager --disable example\*

Crear un repositorio yum

 yum install createrepo

Metemos los paquetes en un dominio con el servidor web que queramos y ejecutamos el siguiente comando para crear el listado rpm.

createrepo --database /var/www/html/myrepo

Crear el fichero .repo para que de esta forma los clientes pueden añadirlo más fácilmente como vimos anteriormente, en caso contrario, ese fichero .repo debe crearlo los usuarios a mano en /etc/yum.repos.d

[base]
name=Red Hat Enterprise Linux $releasever - $basearch - Base
baseurl=http://dominio.com/repositorio/ ( Si se usa en local---> file:///var/www/html/iso)
gpgcheck=0
enabled=1

Los repositorios de ficheros RPM suelen estar divididos en tres secciones, una para paquetes normales, otra para paquetes debug y otra para paquetes de código fuente.

Conocer la version y cuando se actualizó un paquete RPM

Cuantas veces se ha actualizado el kernel de linux.

rpm -q kernel --last
kernel-2.6.32-71.29.1.el6                     Sat 29 Oct 2011 01:49:23 PM CEST
kernel-2.6.32-71.el6                          Fri 28 Oct 2011 05:11:11 PM CEST

Clonar / copiar / migrar los paquetes instalados de una máquina a otra

Antes de nada lo recomendable es comprobar si se tienen los mismos repositorios en los dos sistemas. Hay que tener en cuenta, que aunque se tengan los mismos repositorios, las versiones de los paquetes dependen de un espacio temporal. Es decir, si el equipo a clonar no tiene los paquetes actualizados, al intentar clonar la paquetería, no encontrará muchas versiones de las versiones de los paquetes que necesita.

El entorno ideal, es que esa máquina a clonar este al día (lógicamente requiere que todos sus repositorios estén activos). En caso contrario, valdría con hacer un listado de los paquetes que no se encontraron e instalar las nuevas versiones a posteriori manualmente. Además de estar actualizada la distribución en base a esos repositorios que utiliza, instalar los paquetes de forma ordenada, es decir, por orden cronológico.

También es posible que se instalen las nuevas versiones de forma automática si estas han sido previamente consideradas como dependencias, algo que se comprobará manualmente al buscar esos paquetes que se mostraron como “No package XXXX available” a la hora de clonar.

NOTA: Para tener los mismos repositorios una opción es copiar el directorio /etc/yum.repos.d/ al sistema que se quiere clonar.

Vamos a ver dos opciones, la primera utilizando ssh sería la forma más simple y rápida.

Orden Cronológico (Recomendado).

ssh root@servidor_a_clonar "rpm -qa --last | awk '{print $1}' | sed '1!G;h;$!d'" | xargs yum -y install

Otra forma sería hacerlo manualmente, útil cuando no podemos diponer de ssh.

Creamos el listado de paquetes del sistema a clonar (Opción yum).

yum list installed |tail -n +3|cut -d' ' -f1 > paquetes.txt

Creamos el listado de paquetes (orden cronológico) del sistema a clonar (Opción rpm).

rpm -qa --last | awk '{print $1}' | sed '1!G;h;$!d'  > paquetes.txt 

Instalar el listado de paquetes anteriormente generado.

yum --nogpg -y install $(cat paquetes.txt)

NOTA: Es posible que algunos paquetes fallen, para saber qué paquetes son:

yum -y install $(cat paquetes.txt) --nogpg | grep -i "No package"

Comprobación / Comparación de paquetería instalada.

1. Generar listado en cada sistema.

Sistema1> rpm -qa --queryformat='%{NAME}\n' | sort > sistema1.txt
Sistema2> rpm -qa --queryformat='%{NAME}\n' | sort > sistema2.txt

2. Comparar los listados.

diff sistema1.txt sistema2.txt

Cuando se tienen varios repositorios con diferentes versiones del mismo paquete (no recomendable), podemos encontrar determinados problemas. Si en el sistema a clonar instala un determinado número de paquetes, posteriormente agrega un repositorio (no oficial) y sigue instalando software, paquetes de ese repositorio pueden utilizar como dependencias paquetes previamente instalados.

El sistema que clona, no tiene instalados esos paquetes previos a la instalación de ese repositorio, por lo tanto, es posible que se instalen otras dependencias desde ese mismo repositorio no oficial al querer instalar algo. Por eso es importante revisar si los paquetes importantes están en la versión que deben estar después de clonar.

Ejemplo: En el sistema a clonar se instaló Mysql desde un repositorio propio, después se agrego otro repositorio, el oficial de MySQL para CentOS con intención de instalar un solo paquete, llamado “X”, el cual no solicitó dependencias ya que estaban instaladas desde el repositorio de la empresa. Al clonar la paquetería de ese sistema, yum instaló como dependencia de X (perteneciente al repositorio oficial de MySQL) las dependencias estipuladas de ese mismo repositorio, no las de la empresa que tenían otra versión (no muy distinta).

Package MySQL-shared-5.5.24-1.el6.x86_64 is obsoleted by mysql-community-libs-5.5.40-2.el6.x86_64 which is already installed

NOTA: Por norma, los repositorios intentan mantener una cierta coherencia, por lo que las versiones no suelen cambiar mucho, siempre versiones de una misma rama (v5.5.24 - v5.5.30 - v5.5.40), pero a veces esa versión concreta es lo que se busca instalar.

Recomendación: Para prevenir estos problemas, se recomienda el hacer un clonado instalando los paquetes cronológicamente y tener una buena configuración de prioridad de uso de repositorios.

Descargar paquete rpm de los repositorios y sus dependencias

yum install yum-plugin-downloadonly #Necesitamos este plugin.
yum --downloadonly --downloaddir=. -y install firefox

NOTA: Se puede hacer con otras herramientas, pero muestran muchas más dependencias que carecen de sentido.

Si queremos descargar todas las dependencias de un determinado paquete, las tengamos actualmente instaladas o no, la mejora manera es ver qué dependencias tiene con “yum deplist paquete” y después con “yumdownloader” descargarlas todas manualmente. El paquete “yum-utils” debe estar instalado.

yumdownloader --archlist=i686 paquete

NOTA: Una buena solución es partir siempre de una instalación mínima del sistema (máquina virtual?) y usar los comandos anteriormente comentados para que descargue las dependencias y así no tener problemas a la hora de querer compartir grupos de paquetes con otros sistemas que usen la misma distribución. De esta forma nos aseguramos que las dependencias son las correctas y poder ofrecer un repositorio competente.

Borrar cache de YUM

Útil cuando se obtiene el error: “E: could not open RPM database

rpmdb: unable to join the environment
error: db4 error(11) from dbenv->open: Resource temporarily unavailable
error: cannot open Packages index using db3 - Resource temporarily unavailable (11)
error: cannot open Packages database in
E: could not open RPM database
yum clean all
mv /var/cache/yum/ /tmp/
mv /var/lib/rpm/__db* /tmp/
rpm --rebuilddb

Obtener la URL de un paquete RPM en los repositorios

yumdownloader --urls nginx

El paquete “yum-utils” debe estar instalado para disponer de yumdownloader.

GPG key retrieval failed: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404"

Para solucionar el problema con la llave GPG solo es necesario instalar la clave del repositorio.

rpm --import http://dominio/RPM-GPG-KEY.pub

Utilizar un servidor proxy con YUM

Opción 1: Utilizando la variable “proxy” del fichero de configuración de YUM (/etc/yum.conf).

proxy=http://usuario:password@proxy:8080/ 

Opción 2: Utilizando las variable de entorno http_proxy / ftp_proxy del sistema operativo (/etc/profile).

export http_proxy=http://usuario:password@proxy:8080/
export ftp_proxy=http://usuario:password@proxy:8080/

Ordenar mirrors de un repositorio por velocidad de respuesta

El plug-in “fastestmirror” ordena los servidores espejo (mirrors) de un determinado repositorio (cuando se tienen varios mirrors en un repositorio). El plugin establece una conexión con cada servidor, cronometra las conexiones y los ordena por orden de velocidad de respuesta.

yum install yum-plugin-fastestmirror

Una vez instalado, asegúrese de que está habilitado verificando que en el fichero /etc/yum/pluginconf.d/fastestmirror.conf se contengan las siguientes líneas.

[main]
verbose = 0
socket_timeout = 3
enabled = 1
hostfilepath = /var/cache/yum/timedhosts.txt
maxhostfileage = 1

Listar todas las versiones disponibles de un paquete junto a su repositorio origen

Esto es útil al agregar repositorios extra a la distribución, normalmente un repositorio ofertado para instalar una determinada aplicación suele ofrecer múltiples versiones. También es común encontrar múltiples versiones de un mismo software cuando se han instalado repositorios adicionales, pero se debe tener cuidado y configurar bien las preferencias de dichos repositorios para no romper la lógica del árbol de dependencias. En los repositorios oficiales rara vez se encontrarán múltiples versiones de un mismo paquete.

yum --showduplicates list php-pear

Para instalar la versión corresponiendite se debe especificar junto al fichero.

yum install "nmap-4.5.1

NOTA: En algunos proyectos como por ejemplo MySQL, se ofrece un fichero RPM que instala varios repositorios (Todo dentro del mismo fichero mysql-community.repo) para así poder tener disponibles la instalación de varias versiones diferentes. Para ello se deben activar los repositorios correspondientes a la versión que se desea instalar.

Buscar y borrar paquetes RPMs duplicados

Útil cuando se tienen instaladas dos o mas versiones diferentes del mismo paquete RPM. 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

Localizar paquetes RPM huérfanos con rpmorphan

Al instalar paquetes que integran dependencias, 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). El script rpmorphan nos ayudará a identificarlos. Tiene la misma sintaxis que deborphan.

Descargar rpmorphan: http://sourceforge.net/projects/rpmorphan/files/rpmorphan/

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

Listar paquetes instalados que no pertenecen actualmente a los repositorios configurados

package-cleanup --orphans

NOTA: Mostrará paquetes instalados manualmente pero tambien paquetes que han desaparecido actualmente de los repositorios, eso no significa que podamos borrarlos del sistema, simplemente que no se encuentran en ese momento en el repositorio por le motivo que sea (actualización, obsoleto, etc.)

Modificar la prioridad de los repositorios

Si se quiere dar más prioridad a un repositorio que a otro a la hora de instalar software podemos hacer uso del plugin yum-priorities.

yum install yum-plugin-priorities

El siguiente paso es asignar prioridad a los repositorios mediante el uso de sus ficheros de configuración en /etc/yum.repos.d/ (Menos valor = Más prioridad), por defecto es 99.

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
priority=1

Leer: http://wiki.centos.org/PackageManagement/Yum/Priorities

Conflicto al tener varios repositorios con distintas versiones de dependencias

Cuando se tienen varios repositorios instalados, normalmente no oficiales y estos a su vez tienen diferentes versiones de una misma dependencia, podemos en algunos casos observar el siguiente mensaje error en yum.

Error: Package: php-xcache-3.0.4-1.el6.x86_64 (epel)
           Requires: php(api) = 20090626
           Installed: php-common-5.4.9-1.el6.fa.x86_64 (@fa-stable)
               php(api) = 20100412-x86-64
           Available: php-common-5.3.3-26.el6.x86_64 (base)
               php(api) = 20090626
           Available: php-common-5.3.3-27.el6_5.x86_64 (updates)
               php(api) = 20090626
           Available: php-common-5.3.3-27.el6_5.1.x86_64 (updates)
               php(api) = 20090626
           Available: php-common-5.4.8-4.el6.fa.x86_64 (fa-testing)
               php(api) = 20100412-x86-64

Esto se debe a que se ha instalado una dependencia no correspondiente (se requiere php-common-5.3.3-26.el6.x86_64 20090626, que se encuentra en el repositorio base). La solución para este caso, sería desinstalar la actual versión de esa dependencia y reinstalar la correcta o bien, instalar manualmente el paquete rpm php-xcache-3.0.4-1.el6.x86_64.

Recomendación: Aunque los repositorios no oficiales de una determinada versión de una distro intenten siempre mantener una determinada coherencia respecto al software de los repositorios oficiales, precisamente para evitar problemas de este tipo, instalar el mínimo software de repositorios no oficiales es lo más recomendable.

De tener que utilizar repositorios no oficiales, una vez instalado el software pertinente, desactivar los repositorios no oficiales para no generar posibles problemas de dependencias en el futuro. También es factible asignar diferentes niveles de prioridad al uso de repositorios.

Localizar ejecutables / binarios en el $PATH que no pertenecen a ningun paquete 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




RPM

RPM puede ser usado para interactuar con paquetes instalados en el sistema o con ficheros RPM. Permite instalar, actualizar, consultar, verificar y eliminar paquetes instalados además de otras funciones auxiliares. Antes de comenzar se deben tener claras las siguientes opciones de rpm y su significado.

a   Se refiere a paquete instalados.
p   Se refiere a paquetes rpm (que pueden estar o no instalados).
q   Realiza consultas.

Verificar integridad y seguridad de paquetes RPM

Verificar todos los paquetes del sistema y sus ficheros, hash, tamaño, usuario, grupo, permisos,…

# Todos los paquetes.
rpm -Va
# Paquete especifico.
rpm -V nmap
# Revisar un solo fichero
rpm --verify --file /usr/bin/nmap
# Niveles de depuración (debug), el máximo vv.
rpm -Vvv nmap

Averiguar cuando se instaló el sistema.

rpm -qi basesystem

Códigos de error al verificar paquetes / ficheros RPM.

  • 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.

Simular / Instalar / Reinstalar / Actualizar / Desactualizar

Las opciones “--force”, “--replacepkgs”, “--replacefiles” y “--oldpackage” funcionan de igual manera y se pueden usar indistintamente. Estos comandos son útiles cuando se quieren recuperar ficheros de configuración borrados o sobrescritos por error.

# Simula una instalacion / desinstalación mostrando posibles conflictos, si no muestra nada en la salida, indica que se puede instalar / desinstalar sin conflicto de dependencias.
rpm -e --test nginx
rpm -ivh paquete.rpm
rpm -ivh 'http://www.dominio.com/.../paquete.rpm'
rpm -ivh --force paquete.rpm
rpm -Uvh paquete.rpm
rpm -Uvh --oldpackage paquete.rpm

NOTA: La opción -U actualiza un paquete existente o instalar el paquete si no está instalado. Por el contrario la opción -F sólo actualiza o refrescar un paquete que se encuentre actualmente instalado.

IMPORTANTE: Dependiendo de como fue creado el paquete RPM, una actualización de la aplicación puede sobrescribir todos los ficheros de configuración de la misma. Esto depende de si se han usado correctamente en el fichero “.spec” (paquetes de código fuente) las opciones “%config(noreplace)” o bien “%config” a la hora de generar el paquete RPM.

Más información: http://people.ds.cam.ac.uk/jw35/docs/rpm_config.html

Es raro que eso pase con paquetes RPM provenientes de repositorios oficiales de la distribuciones GNU/Linux. De todas maneras se recomienda siempre hacer una copia de seguridad ya que algunas veces se puede perder toda la configuración de una aplicación actualizada.

Desinstalar

Con y sin dependencias (Mirar la opción de simulación del punto anterior).

rpm -ev 
rpm -ev --nodeps

NOTA: Al desinstalar un paquete RPM podemos pasarle el flag “–repackage” para dejar un backup del RPM borrado en el directorio “/var/spool/repackage”.

Mostrar nombre completo de un paquete instalado

La opción “-i” da información del paquete.

rpm -q paquete

Muestra información de un paquete rpm NO instalado.

rpm -qpi paquete.rpm

Muestra todos los paquetes instalados

Con la opción “–last” tenemos los más recientes.

rpm -qa

NOTA: Para tener un listado de todos los paquetes instalados ordenador alfabéticamente se puede hacer una tubería con sort.

rpm -qa | sort

Lista los archivos de un paquete rpm

rpm -qpl

Lista los ficheros de un paquete instalado

rpm -ql [foo]

Lista solo los ficheros de configuración de un paquete

NOTA: No siempre funciona.

rpm -qc paquete_instalado
rpm -qpc paquete.rpm

Saber a qué paquete pertenece un determinado fichero

rpm -qf /usr/bin/dir

Si además queremos saber los repositorios que contienen el paquete al que pertenece un determinado archivo.

yum whatprovides "/usr/share/icons/hicolor/16x16/apps/java.png"

Dependencias en paquetes RPM

Los paquetes RPM pueden tener especificadas sus dependencias mediante las etiquetas “requires”, “provides” y “conflicts”. Estas pueden ser agregadas de forma manual o de forma automática por el empaquetador responsable. La forma automática se basa en la herramienta “ldd” para listar qué librerías requiere cada ejecutable del paquete rpm, una vez averiguadas son agregadas al paquete durante su construcción.

Mostrar dependencias de un paquete instalado

rpm -qR

Muestra las dependencias de un paquete rpm en disco / URL

rpm -qpR

Extraer ficheros de un paquete rpm

rpm2cpio file.rpm | cpio -idv

Instalar un paquete de código fuente rpm (Opción 1)

rpm -ivh paquete.src.rpm  ---> /usr/src/RedHat/SPECS
rpmbuild -ba package.spec

Instalar un paquete de código fuente rpm (Opción 2)

rpmbuild --rebuild nombre_paquete.src.rpm
rpm -Uvih nombre_paquete.rpm

Listar la fecha de todos los paquetes instalados / Buscar los paquetes instalados en una fecha

Visualizar los paquetes instalados con su fecha de instalación.

rpm -qa --queryformat '%{installtime}  \"%{vendor}\" %{name}-%{version}-%{release}  %{installtime:date}\n'

Mostrar únicamente los paquetes instalados en una fecha determinada.

rpm -qa --queryformat '%{installtime}  \"%{vendor}\" %{name}-%{version}-%{release}  %{installtime:date}\n' | grep -i "Fri 07 Mar"

Obtener listado de paquetes RPM sin versión ni saltos de linea

rpm -qa --qf "%{NAME}\n" | grep -i php56 |  tr "\n " " " 
php56-php-mcrypt php56-php-pecl-ssh2 php56-runtime php56-php-pecl-json-post ...

Tamaño en bytes de todos los paquetes rpm instalados

echo $((`rpm -qa --queryformat='%{SIZE}+' | sed 's/+$//'`))

Mostrar scriptslets de los paquetes rpm

Los paquetes rpm ejecutan instrucciones de scripting (comandos) antes, después o durante las instalaciones / desinstalaciones, para poder saber qué comandos ejecuta podemos usar la siguiente opción de RPM.

rpm -qp --scripts https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
postinstall scriptlet (using /bin/sh):
# Not needed for el6 as sources has been removed
#echo "# epel repo -- added by epel-release " \
#    >> /etc/sysconfig/rhn/sources
#echo "yum epel http://download.fedora.redhat.com/pub/epel/6/\$ARCH" \
#    >> /etc/sysconfig/rhn/sources
postuninstall scriptlet (using /bin/sh):
#sed -i '/^yum\ epel/d' /etc/sysconfig/rhn/sources
#sed -i '/^\#\ epel\ repo\ /d' /etc/sysconfig/rhn/sources

NOTA: Se puede también indicar la ruta a un RPM alojado en disco.

Listar opciones de optimizacion (Opt flags) utilizadas en la compilación de un rpm instalado

rpm -q --queryformat="%{NAME}: %{OPTFLAGS}\n" nginx

Listar paquetes instalados de repositorios no oficiales

rpm -qa --qf '%{NAME} %{VENDOR}\n' | grep -v CentOS

Resetear permisos de un paquete instalado

Restablece los permisos originales que deberían tener los ficheros pertenecientes al paquete.

rpm --setperms paquete

Visualizar el changelog de un paquete instalado

 rpm -q --changelog paquete | less

NOTA: Si se quiere obtener el changelog de paquetes no instalados, se debe hacer uso del plugin yum-plugin-changelog.

# El plugin yum-plugin-changelog debe estar instalado, también permite buscar por fecha.
yum changelog openssh
yum changelog 2015-Jun yum\*

Localizar la documentación de un paquete instalado

Indicando el nombre del paquete.

rpm -qd paquete

Indicando un fichero (que pertenece a un paquete).

rpm -qdf /ruta/fichero

Mostrar información de un paquete instalado

rpm -qi paquete

NOTA: Este comando no muestra el repositorio origen, muestra el “Proveedor”. Si queremos saber el repositorio origen enemos entre otros “yum info” o bien “repoquery -i”.

Mostrar fechas de paquetes instalados

Muestra un listado de todos los paquetes rpm instalados y su fecha de instalación ordenado descendientemente.

rpm -qa --last 

Mostrar los disparadores (Triggers) de un paquete RPM

No todos los paquetes tienen disparadores (scripts post instalación).

Disparadores de un paquete rpm instalado.

rpm -q --triggers paquete

Disparadores de un paquete rpm no instalado.

rpm -qp --triggers

Mostrar las llaves GPG instaladas junto con su repositorio

rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n'

Autocompletado de comandos rpm y yum

Si se quiere tener la posibilidad de autocompletado en comandos rpm y yum (entre otros) se requiere instalar “bash-completion”. Este paquete amplía la capacidad de autocompletado de la bash para un gran número de aplicaciones, no solo rpm y yum.

yum install -y bash-completion 
guia_rapida_y_completa_de_yum_y_rpm.txt · Last modified: 2024/02/02 16:51 by busindre