4.3. El gestor de paquetes RPM

SUSE LINUX utiliza RPM (Red Hat Package Manager) con sus principales programas rpm y rpmbuild para la administración de los paquetes de software. Esta potente base de datos puede ser consultada tanto por usuarios como por administradores de sistemas o constructores de paquetes para obtener información detallada sobre el software instalado.

Básicamente, rpm puede actuar de cinco maneras distintas: instalar, desinstalar o actualizar paquetes de software, volver a crear la base de datos RPM, enviar consultas a la base de datos RPM o a archivos RPM individuales, comprobar la integridad de los paquetes y firmar paquetes. rpmbuild sirve para generar paquetes listos para instalar a partir de las fuentes originales (pristine sources).

Los archivos RPM instalables tienen un formato binario especial que incluye los archivos con los programas e información adicional usada por rpm. Esta información adicional se usa para configurar el software del paquete o para la documentación en la base de datos RPM. Estos archivos tienen la extensión .rpm.

Con rpm se pueden gestionar los paquetes LSB. Puede obtener información adicional sobre LSB en la Sección A.4, “Estándares y especificaciones”.

[Tip]Sugerencia

En el caso de varios paquetes, los componentes necesarios para el desarrollo del software (librerías, archivos header e include) han pasado a ser paquetes separados; se trata de un procedimiento que ya se llevó a cabo en versiones anteriores. Estos paquetes sólo serán necesarios para desarrollos propios; por ejemplo compilar paquetes de GNOME más recientes. Este tipo de paquetes se identifica normalmente con el sufijo -devel en su nombre; algunos ejemplos son: alsa-devel, gimp-devel, kdelibs-devel, etc.

4.3.1. Comprobar la autenticidad de un paquete

Los paquetes RPM de SUSE LINUX están firmados con GnuPG. La clave incluyendo huella digital (fingerprint) es la siguiente:


1024D/9C800ACA 2000-10-19 SuSE Package Signing Key <build@suse.de>
Key fingerprint = 79C1 79B2 E1C8 20C1 890F  9994 A84E DAE8 9C80 0ACA

El comando rpm --checksig apache-1.3.12.rpm permite comprobar la firma de un paquete RPM para averiguar si éste procede realmente de SUSE u otra entidad de. Este procedimiento se recomienda especialmente con los paquetes de actualización de Internet. Nuestra clave pública para firmar los paquetes se encuentra normalmente en /root/.gnupg/. Esta clave también se incluye en el directorio /usr/lib/rpm/gnupg/ para que los usuarios normales también puedan comprobar la firma de los paquetes RPM.

4.3.2. Administración de paquetes: instalar, actualizar y desinstalar paquetes.

Por lo general, la instalación de un archivo RPM es muy simple: rpm -i paquete.rpm. Este comando estándar solamente instala un paquete si se cumplen todas las dependencias, ya que de lo contrario podrían aparecer conflictos; los mensajes de error de rpm indican los paquetes que faltan para cumplir con las dependencias. La base de datos se ocupa de evitar conflictos: normalmente un archivo debe pertenecer a un solo paquete; también hay diferentes opciones que permiten pasar por alto esta regla, pero se debe estar muy seguro de ello ya que se puede poner en peligro la posibilidad de actualizar el paquete.

Las opciones -U o --upgrade y -F o --freshen pueden utilizarse para la actualización de un paquete, por ejemplo: rpm -F paquete.rpm. Este comando borra la antigua versión de un paquete e instala los archivos nuevos. La diferencia entre ambas opciones radica en que en el caso de -U también se instalan paquetes que hasta ahora no estaban disponibles en en el sistema, mientras que la opción -F sólo actualiza un paquete que ya estuviera instalado. Por su parte, rpm actualiza los archivos de configuración cuidadosamente apoyándose en la siguiente estrategia:

  • Si el administrador de sistema no ha cambiado ningún archivo de configuración, rpm instala la versión nueva y por lo tanto, el administrador de sistema no tiene que intervenir de ninguna manera.

  • Si el administrador de sistema ha cambiado un archivo de configuración antes de realizar la actualización, rpm guarda el archivo con la extensión .rpmorig o .rpmsave e instala la nueva versión del paquete RPM, salvo que el archivo de configuración de esta nueva versión no haya cambiado su estructura. En el caso de reemplazar el archivo de configuración, es muy probable que sea necesario adaptar el nuevo basándose en la copia con la extensión .rpmorig o .rpmsave.

  • Los archivos con extensión .rpmnew siempre aparecen cuando el archivo de configuración ya existe y si el indicador noreplace aparece dentro del archivo .spec.

Después de la actualización se deben borrar los archivos .rpmsave y .rpmnew para que estos no obstaculicen la siguiente actualización. La extensión .rpmorig se aplica cuando la base de datos RPM no ha reconocido el archivo.

Si la base de datos reconoce el archivo se utiliza .rpmsave. En otras palabras, la extensión .rpmorig se genera cuando se actualizan paquetes de otro formato a RPM y .rpmsave se genera cuando se actualiza de un paquete RPM antiguo a uno más actual. La extensión .rpmnew se usa cuando no se puede determinar si el administrador de sistema ha modificado el archivo de configuración o no. Puede encontrar una lista de estos archivos en /var/adm/rpmconfigcheck. Algunos archivos de configuración (como /etc/httpd/httpd.conf) no se sobreescriben para posibilitar la operación continua.

Así pues, la opción -U (update) es algo más que una equivalencia de la secuencia -e (desinstalar/eliminar) e -i (instalar). Siempre que sea posible, es preferible usar la opción -U.

Para eliminar un paquete ejecute rpm -e paquete. rpm sólo borra un paquete en caso de no existir ninguna dependencia. Por lo tanto no es posible suprimir por ejemplo Tcl/Tk si todavía existe algún programa que lo necesite para su ejecución; esta funcionalidad se debe al control por parte de la base de datos RPM. Si en algún caso excepcional no es posible eliminar un paquete aunque haya dejado de existir toda dependencia, es probable que el problema se resuelva al generar de nuevo la base de datos RPM, usando la opción --rebuilddb.

4.3.3. RPM y parches

Para garantizar la seguridad en la operación de un sistema es necesario instalar periódicamente en el sistema paquetes que lo actualicen. Hasta ahora, un fallo en un paquete sólo podía ser resuelto sustituyendo el paquete entero. En el caso de paquetes grandes con fallos en archivos pequeños, podíamos encontrarnos rápidamente ante una gran cantidad de datos. No obstante, el RPM de SUSE incorpora una función que permite instalar parches en paquetes.

La información más importante sobre un parche RPM se mostrará tomando al programa pine como ejemplo:

¿Es el parche RPM el adecuado para mi sistema?

Para comprobarlo, debe averiguarse en primer lugar la versión instalada del paquete. En el caso de pine, esto se realiza con el comando

rpm -q pine 
pine-4.44-188

A continuación examine el parche RPM para comprobar si resulta adecuado para esta versión de pine:

rpm -qp --basedon pine-4.44-224.i586.patch.rpm
pine = 4.44-188
pine = 4.44-195
pine = 4.44-207

Este parche sirve para tres versiones distintas de pine, incluyendo la versión instalada en nuestro ejemplo. Por tanto, el parche puede ser instalado.

¿Qué archivos va a sustituir el parche?

Los archivos afectados por el parche pueden leerse fácilmente del parche RPM. El parámetro -P de rpm sirve para seleccionar características especiales del parche. Así, es posible obtener una lista de los archivos con

rpm -qpPl pine-4.44-224.i586.patch.rpm
/etc/pine.conf
/etc/pine.conf.fixed
/usr/bin/pine

o, si el parche ya está instalado, con

rpm -qPl pine
/etc/pine.conf
/etc/pine.conf.fixed
/usr/bin/pine
¿Cómo se instala un parche RPM en el sistema?

Los parches RPMs se utilizan como RPMs normales. La única diferencia radica en que en el caso de los parches, el RPM apropiado ya debe estar instalado.

¿Qué parches están ya instalados en el sistema y sobre qué versiones de paquetes se han instalado?

Puede obtener una lista con los parches instalados en el sistema con el comando rpm -qPa. Si en un sistema nuevo se ha instalado sólo un parche, como en nuestro ejemplo, la salida del comando será semejante a:

rpm -qPa
pine-4.44-224

Si transcurrido un cierto tiempo quiere saber qué versión del paquete fue instalada en primer lugar, puede consultar la base de datos RPM. En el caso de pine, esta información se obtiene con el comando:

rpm -q --basedon pine
pine = 4.44-188

Puede obtener más información sobre RPM (incluyendo las prestaciones de los parches) en las páginas del manual de rpm y rpmbuild.

4.3.4. Los paquetes RPM delta

Los paquetes “RPM delta” contienen la diferencia (denominada “delta”) entre las versiones nueva y antigua de un paquete RPM. Si se aplica un RPM delta a un RPM antiguo, el resultado es un RPM completamente nuevo. No obstante, no es necesario tener una copia del antiguo RPM: un RPM delta también funciona con el RPM instalado. Los paquetes deltarpm son incluso más pequeños que los parches RPM, lo cual constituye una ventaja a la hora de transferir paquetes de actualización por Internet. Su principal inconveniente radica en que las actualizaciones con RPMs delta consumen bastante más ciclos de CPU que las actualizaciones con RPMs normales o parches. Si desea que YaST utilice paquetes RPM delta en las actualizaciones con YOU, asigne el valor “yes” a la opción YOU_USE_DELTAS en el archivo /etc/sysconfig/onlineupdate.

Los binarios prepdeltarpm, writedeltarpm y applydeltarpm forman parte de la suite deltarpm y su labor es la de facilitar la creación y aplicación de los paquetes RPM delta. Con los comandos siguientes puede crear un RPM delta llamado new.delta.rpm (este comando asume que tanto old.rpm como new.rpm están presentes):

prepdeltarpm -s seq -i info old.rpm > old.cpio
prepdeltarpm -f new.rpm > new.cpio

xdelta delta -0 old.cpio new.cpio delta

writedeltarpm new.rpm delta info new.delta.rpm
rm old.cpio new.cpio delta

El comando applydeltarpm le permite reconstruir el nuevo RPM, ya sea desde el sistema de archivos en caso de que el paquete antiguo esté instalado:

applydeltarpm new.delta.rpm new.rpm

o bien con la opción -r para reconstruirlo a partir del antiguo RPM pero sin acceder al sistema de archivos:

applydeltarpm -r old.rpm new.delta.rpm new.rpm

Consulte file:///usr/share/doc/packages/deltarpm/README para obtener información adicional de carácter técnico.

4.3.5. Consultas RPM

La opción -q (query) permite enviar consultas a los archivos RPM (opción -p archivo_paquete), así como a la base de datos RPM. Existen varias opciones para especificar el tipo de información requerida (Tabla 4.8, “Las principales opciones para consultas RPM”).

Tabla 4.8. Las principales opciones para consultas RPM

-i

Mostrar información sobre un paquete

-l

Mostrar lista de archivos del paquete

-f Archivo

Consultar el paquete que contiene el archivo Archivo; se requiere la especificación de Archivo con su rama completa.

-s

Mostrar estado de los archivos (implica -l)

-d

Nombrar archivos de documentación (implica -l)

-c

Nombrar archivos de configuración (implica -l)

--dump

Mostrar toda la información de verificación de todos los archivos (utilizarlo con -l, -c o -d)

--provides

Mostrar prestaciones del paquete que otro paquete puede solicitar con --requires

--requires, -R

Mostrar dependencias entre los paquetes

--scripts

Mostrar los distintos scripts de instalación (preinstall, postinstall, uninstall)

Por ejemplo, el comando rpm -q -i wget produce como resultado la información postrada en el Ejemplo 4.2, “rpm -q -i wget”.

Ejemplo 4.2. rpm -q -i wget

Name        : wget                      Relocations: (not relocatable)
Version     : 1.9.1                          Vendor: SUSE LINUX AG, Nuernberg, Germany
Release     : 50                         Build Date: Sat 02 Oct 2004 03:49:13 AM CEST
Install date: Mon 11 Oct 2004 10:24:56 AM CEST      Build Host: f53.suse.de
Group       : Productivity/Networking/Web/Utilities Source RPM: wget-1.9.1-50.src.rpm
Size        : 1637514                       License: GPL
Signature   : DSA/SHA1, Sat 02 Oct 2004 03:59:56 AM CEST, Key ID a84edae89c800aca
Packager    : http://www.suse.de/feedback
URL         : http://wget.sunsite.dk/
Summary     : A tool for mirroring FTP and HTTP servers

Description :
Wget enables you to retrieve WWW documents or FTP files from a server.
This might be done in script files or via command line.
[...]

La opción -f sólo funciona cuando se indica el nombre de archivo completo con la ruta incluida; se pueden indicar tantos archivos como se desee. Por ejemplo el comando:

rpm -q -f /bin/rpm /usr/bin/wget

produce como resultado:

rpm-4.1.1-191
wget-1.9.1-50

Si sólo se conoce una parte del nombre del archivo, utilice un script de shell como el mostrado en el Ejemplo 4.3, “Script de búsqueda de paquetes”) pasándole como parámetro el nombre del archivo buscado.

Ejemplo 4.3. Script de búsqueda de paquetes

#! /bin/sh
for i in $(rpm -q -a -l | grep  $1); do
    echo "\"$i\" está en el paquete:"
    rpm -q -f $i
    echo ""
done

El siguiente comando rpm -q --changelog rpm muestra información detallada (actualizaciones, configuración, cambios, etc.) sobre un paquete específico. Este ejemplo proporciona información sobre el paquete rpm. No obstante, sólo se muestran las últimas 5 entradas de la base de datos RPM, el paquete en sí contiene todas las entradas (de los últimos 2 años). La siguiente consulta sólo funciona si el CD 1 está montado en /media/cdrom:

rpm -qp --changelog /media/cdrom/suse/i586/rpm-4*.rpm

La base de datos instalada también permite efectuar verificaciones. Estas se introducen con la opción -V (equivalente a -y o --verify). Con la verificación, rpm muestra todos los archivos del paquete que han sido modificados desde su instalación original. rpm coloca hasta ocho caracteres por delante del nombre de archivo que indican los siguientes cambios:

Tabla 4.9. Las verificaciones

5

Suma de control MD5

S

Tamaño de archivo

L

Enlace simbólico

T

Tiempo de modificación

D

Número de dispositivo (device number) major y minor

U

Usuario (user)

G

Grupo (group)

M

Modo (con derecho y tipo)

Para los archivos de configuración aparece como valor adicional la letra c, como lo muestra el ejemplo para el archivo /etc/wgetrc de wget, que ha sido modificado:

rpm -V wget
S.5....T c /etc/wgetrc

Los archivos de la base de datos RPM se encuentran en /var/lib/rpm. Estos pueden ocupar hasta 30 MB en una partición /usr de 1 GB, especialmente después de una actualización completa. Si la base de datos parece demasiado grande, se puede reducir su tamaño usando la opción --rebuilddb. Antes de reconstruir la base de datos se debe hacer una copia de seguridad de la base de datos existente. El script cron cron.daily genera diariamente copias comprimidas de la base de datos y las guarda en /var/adm/backup/rpmdb. El número de estas copias está definido por la variable MAX_RPMDB_BACKUPS, cuyo valor por defecto es 5, pero se puede modificar en /etc/sysconfig/backup. Cada copia de seguridad ocupa aproximadamente 3 MB en una partición /usr de 1 GB.

4.3.6. Instalar y compilar los paquetes fuente

Todos los paquetes fuente (sources) tienen la extensión .src.rpm; estos archivos se llaman “Source-RPMs”.

[Tip]Sugerencia

Los paquetes con fuentes se pueden instalar con YaST como cualquier otro paquete, con la diferencia que estos no se marcan como instalados, con una [i], como ocurre con los paquetes ordinarios. Por esta razón los paquetes fuente no figuran en la base de datos RPM, ya que este sólo anota el software instalado.

Si no hay ninguna configuración personal activada (por ejemplo a través del archivo /etc/rpmrc), los directorios de trabajo de rpm o rpmbuild deben existir en /usr/src/packages. Dichos directorios son:

SOURCES

para las fuentes originales (archivos .tar.bz2 o .tar.gz, etc.) y para las adaptaciones específicas de las distintas distribuciones (principalmente archivos .diff o .patch).

SPECS

para los archivos .spec, que controlan el proceso build y de este modo actúan como makefiles.

BUILD

por debajo de este directorio se desempaquetan o se compilan las fuentes, también se añaden a este los parches.

RPMS

en este se graban los paquetes completos en formato binario.

SRPMS

y aquí se guardan los RPM source (fuente).

Al instalar con YaST un paquete de fuentes, todos los componentes necesarios para el proceso build se copian en el directorio /usr/src/packages: las fuentes y los parches en SOURCES y el archivo .spec correspondiente en SPECS.

[Important]Importante

No haga experimentos con RPM y componentes importantes del sistema como pueden ser glibc, rpm, sysvinit etc.: la operatividad de su sistema está en juego.

Tomemos como ejemplo el paquete wget.src.rpm. Después de instalar este paquete con YaST, obtendrá una lista de archivos semejante a esta:

/usr/src/packages/SOURCES/nops_doc.diff
/usr/src/packages/SOURCES/toplev_destdir.diff
/usr/src/packages/SOURCES/wget-1.9.1+ipvmisc.patch
/usr/src/packages/SOURCES/wget-1.9.1-brokentime.patch
/usr/src/packages/SOURCES/wget-1.9.1-passive_ftp.diff
/usr/src/packages/SOURCES/wget-LFS-20040909.tar.bz2
/usr/src/packages/SOURCES/wget-wrong_charset.patch
/usr/src/packages/SPECS/wget.spec

Con el comando rpmbuild -b X /usr/src/packages/SPECS/wget.spec comienza la compilación. La variable X es un comodín que puede representar diferentes pasos (vea la salida de --help o la documentación de RPM para obtener información adicional). A continuación se explican las opciones brevemente:

-bp

Prepara las fuentes en el directorio /usr/src/packages/BUILD, las desempaqueta y pone los parches.

-bc

Igual que -bp, pero con compilación.

-bi

Igual que -bc, pero con instalación del paquete. Atención: si hay algún paquete que no soporte la característica BuildRoot, es posible que durante la instalación se sobreescriban algunos archivos de configuración importantes.

-bb

Igual que -bi, pero con generación adicional del RPM binario que, en caso de éxito, se encuentra en el directorio /usr/src/packages/RPMS.

-ba

Como -bb, pero genera adicionalmente el RPM fuente que se encuentra, en caso de éxito, en el directorio /usr/src/packages/SRPMS.

--short-circuit

Permite saltarse determinados pasos.

El RPM binario creado ya puede instalarse con rpm -i o mejor aún con rpm -U. La instalación con rpm hace que aparezca en la base de datos RPM.

4.3.7. Compilación de paquetes RPM con build

En el caso de muchos paquetes se corre el riesgo de que se instalen archivos no deseados en el sistema. Para evitarlo se puede emplear el paquete build, el cual crea un entorno definido dentro del que se construye el paquete. Para crear este entorno chroot, se debe proporcionar un árbol completo de paquetes al script build, ya sea en el disco duro, mediante NFS o desde un DVD. La ubicación concreta se comunica al script por medio del comando build --rpms ruta. A diferencia de rpm, el comando build quiere tener el archivo SPEC en el mismo directorio que las fuentes. Para volver a compilar wget en el ejemplo superior con el DVD montado en el sistema en /media/dvd, ejecute los siguientes comandos como usuario root:

cd /usr/src/packages/SOURCES/ 
mv ../SPECS/wget.spec . 
build --rpms /media/dvd/suse/ wget.spec

A continuación se crea en /var/tmp/build-root un entorno mínimo donde se construirá el paquete. Los paquetes resultantes se almacenarán posteriormente en /var/tmp/build-root/usr/src/packages/RPMS

El script build ofrece además otras opciones. Así, se puede definir la preferencia de los propios RPMs de cara al resto, saltarse el inicio del entorno build o restringir el comando rpm a una de las fases descritas anteriormente. Puede obtener más información con el comando build --help y en la página man de build.

4.3.8. Herramientas para los archivos RPM y la base de datos RPM

Midnight Commander (mc) puede mostrar el contenido de un archivo RPM y copiar partes de él. El archivo RPM se muestra en un sistema de archivos virtual para el cual se ponen a disposición todas las opciones del menú de mc. La información de los encabezamientos del archivo HEADER se visualiza con F3. Las teclas del cursor e Intro permiten “navegar” por la estructura del archivo y además es posible copiar componentes de un archivo con F5.

KDE incluye la herramienta kpackage como interfaz para rpm. Asimismo un completo gestor de paquetes está disponible en forma de módulo de YaST (ver Sección 2.2.1, “Instalar y desinstalar software”).


SUSE LINUX Manual de administración 9.3