========= 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**: [[http://wiki.centos.org/PackageManagement/| 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 ([[https://www.cl.cam.ac.uk/~jw35/docs/rpm_config.html|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**: [[https://www.busindre.com/yum_version_paquete_actual_actualizacion|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' ==== Error "Cannot retrieve metalink for repository" ==== 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 **Downgrad**e: 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 # Alternativa teniendo yum-utils repoquery --requires --resolve 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 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 [[guia_rapida_y_completa_de_yum_y_rpm#modificar_la_prioridad_de_los_repositorios|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