Mostrando entradas con la etiqueta rpm. Mostrar todas las entradas
Mostrando entradas con la etiqueta rpm. Mostrar todas las entradas

Instalación de paquetes en GNU/Linux

Por suerte, desde hace ya muchos años instalar o desinstalar paquetes en los diferentes sistemas operativos de base Linux se hizo mucho más sencillo. Al principio de los tiempos, instalar algo era casi para "nativos del código fuente". Aun recuerdo la época en la que había que compilar los binarios con todas sus dependencias. Conseguías más rendimiento, puede ser, si sabías lo que hacías, pero actualizar un paquete era casi misión imposible. El trabajo casi nunca compensaba el esfuerzo.
Por suerte, el mundo Linux avanzó y las principales distribuciones tienen desde hace mucho tiempo repositorios en los que ofrecen software ya compilado y empaquetado. Así, instalar o actualizar un paquete es una tarea muy sencilla. Pero por supuesto, cada distribución, optó por un método diferente y para nada homogéneo, ni de paquetes ni de instrucciones para la instalación.
A continuación os dejo aquí una tabla comparativa de los comandos que cada distribución tiene para hacer la misma tarea. En todos los casos, los paquetes a instalar vienen de los repositorios que estén configurados en cada uno de los sistemas.
Linux OS
search
install
update
remove
Debian
Ubuntu
Linux Mint
apt-cache search [pkg] apt-get install [pkg] apt-get upgrade apt-get remove [pkg]
Fedora
Red Hat
CentOS
yum search [pkg] yum install [pkg] yum update yum remove [pkg]
Mandriva
Mageia
urpmi -y [pkg] urpmi [pkg] urpmi-auto-select urpme [pkg]
OpenSuse zypper search [pkg] zypper install [pkg] zypper update zypper remove [pkg]
Arch pacman -Ss [pkg] pacman -S [pkg] pacman -Syu pacman -R [pkg]
Gentoo emerge -s [pkg] emerge [pkg] emerge -uD [pkg] emerge -C [pkg]
Es muy recomendable tener presente esta chuleta de ayuda siempre que tengáis que manejar más de un sistema de base Linux de una familia diferente.
Leer más

Restaurar permisos originales de un fichero

¿A quién no lo pasó alguna vez que cambió los permisos de un fichero o directorio completo sin querer y luego no sabía volver a los preestablecidos por el desarrollador?
Supongo que alguna vez ésto nos pasó a todos y no es una buena experiencia. Así que para intentar subsanar este tipo de fallos, hoy os presento un truco muy simple, para sistemas Red Hat y derivados, que permite restablecer los valores originales de forma muy sencilla. Ya bien sea para un fichero concreto o para todo un directorio, gracias a rpm --setperms volver a poner los permisos originales nunca fue tan sencillo.
Vamos a ver el comando en funcionamiento, que es la mejor forma de entender de lo que hablamos.
Partimos de estos permisos originales de un fichero cualquiera.

shell> ls -l /etc/ssh/ssh_config
  -rw-r--r--. 1 root root 2047 may 15  2012 /etc/ssh/ssh_config
y se los cambiamos por estos otros,
shell> chmod 777 /etc/ssh/ssh_config
shell> ls -l /etc/ssh/ssh_config
  -rwxrwxrwx. 1 root root   2047 may 15  2012 /etc/ssh/ssh_config
Como vemos, una equivocación no muy común, pero que en ese fichero puede traer consecuencias inesperadas. Aunque en el ejemplo es muy sencillo volver a los permisos originales, entre otras cosas por que sabemos a que volver, imagina que esto mismo se hiciera recursivo y afectase a todo /etc.
Lo que nos interesa es ver cómo volver a los valores originales del paquete sin tener que hacerlo manualmente. Para ello,
shell> rpm --setperms openssh-clients-5.3p1-81.el6.x86_64
shell> ls -l /etc/ssh/ssh_config
  -rw-r--r--. 1 root root   2047 may 15  2012 /etc/ssh/ssh_config
Y lo único que necesitas saber es el nombre del paquete que contiene el fichero o ficheros que has modificado, para lo cual,
shell> rpm -qf /etc/ssh/ssh_config
  openssh-clients-5.3p1-81.el6.x86_64

La entrada Restaurar permisos originales de un fichero la puedes leer el El mundo en bits.
Leer más

GPG key Error con yum

Aunque este error fue algo esporádico, la verdad es que tiene su lógica y probablemente a vosotros también os haya pasado si habéis creado el fichero de acceso a EPEL directamente y no instalasteis el paquete del repositorio.
Por defecto, el fichero que emplea yum para acceder al repositorio EPEL es /etc/yum.repos.d/epel.repo, el cual contiene una línea similar a la que sigue, que hace referencia a un fichero de clave GPG.
...
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
gpgcheck=1
Si dicho fichero no existe, no se puede verificar la autenticidad de los paquetes, por lo que el siguiente fallo aparecerá al intentar descargar e instalar algún paquete desde dicho repositorio.
shell> yum update
...
Downloading Packages:
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

GPG key retrieval failed: [Errno 14] Could not open/read file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
La solución más sencilla es instalar el fichero del repositorio con el paquete epel-release, que se encargará de crear el fichero del repositorio, localizado bajo /etc/yum.repos.d/ y también el fichero con la clave GPG.
shell> yum install epel-release.noarch
Tras la instalación de dicho paquete, ya no se debería de volver a tener dicho error. Al intentar instalar algo por primera vez desde el repositorio EPEL, nos saldrá el siguiente aviso de empleo de clave GPG.
shell> yum update
...
Downloading Packages:
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
Importing GPG key 0x0608B895:
 Userid : EPEL (6) 
 Package: epel-release-6-8.noarch (@epel)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
Is this ok [y/N]: y
Running rpm_check_debug
...
Tras aceptarlo, ya se podrá trabajar con el repositorio EPEL de forma permanente y certificando la autenticidad de los paquetes.
Leer más

RedHat, limpiar paquetes descargados

Una de las cosas que siempre suele suceder al instalar y actualizar paquetes en nuestras distribuciones es que estos terminan ocupando más espacio del que deberían. Por defecto, al actualizar un paquetes, éste suele ocupar un poco más de espacio que el anterior, por nuevas funcionalidades o librerías nuevas que incluya, pero a mayores, ocupa todo el espacio del propio paquete que se descargar. Este paquete queda en la caché de nuestro gestor de paquetes y por lo tanto en disco, aunque no sea estrictamente necesario.
En sistemas debian, para hacer un purgado de dichos ficheros nos llega con hacer,
shell> apt-get clean
En sistemas Redat/CentOS, que emplean yum, también podemos hacer algo similar que ayuda al purgado de dichos paquetes,
shell> du -sh /var/cache/yum
48M   /var/cache/yum
shell> yum clean all
Loaded plugins: fastestmirror
Cleaning up Everything
Cleaning up list of fastest mirrors
shell> du -sh /var/cache/yum
84K   /var/cache/yum
Como se puede observar, tras el purgado el espacio fue liberado. En el fichero de configuración, /etc/yum.conf, está definido el directorio cachedir.
Leer más

rpm rollback package

El sistema de paquetería RPM no deja de sorprenderme y cada día más. Hoy descubrí un pequeño gran truco. Nada más ni nada menos que el rollback de los paquetes. Esto quiere decir, la marcha atrás de una actualización o instalación de algún paquete, por si el resultado no es el esperado. Tenerlo habilitado, lógicamente consume más espacio es disco, pero los amplios beneficios que ofrece, creo que compensan con creces el espacio extra.
Según lo que dice la documentación oficial, hay que decir que el rollback dejó de estar soportado "oficialmente" desde la versión RHEL 5, aunque internamente sigue funcionando. Así que vamos a ver cómo configurarla y emplearla.

  • Editamos el fichero /etc/yum.conf y agregamos la línea
    tsflags=repackage
    
    Con ello conseguimos indicarle a yum que debe guardar la información necesaria para poder realizar rollback de los paquetes.
  • Editamos el fichero /etc/rpm/macros y agregamos la línea
    %_repackage_all_erasures 1
    
    Esta configuración le indica al sistema rpm lo mismo que la anterior.
A partir de este punto el sistema está ya preparado para regresar a un estado anterior si fuera necesario. La forma de poder conseguirlo no es otros que indicándole a rpm la fecha a la que queremos que regrese con la opción rollback,
shell> rpm -Uvh -rollback '1 day ago'
Leer más

RPM, fecha de instalación de un paquete

Aunque no es algo habitual, quizás en algún momento nos interesa saber en qué día y a qué hora se instaló un paquete en nuestro sistema Red Hat/CentOS, así que la mejor forma de saberlo es preguntárselo a rpm. Este comando nos puede dar un listado de todos los paquetes instalados con la fecha exacta de su instalación. Si el sistema está recién instalado, lo más normal es que todos tengan la misma hora, pero a partir de ahí, según posteriores actualizaciones y nuevas instalaciones, se podrá ver cómo estos van cambiando poco a poco su fecha. Para poder obtener la fecha, únicamente hay que emplear la opción --last.
shell> rpm -qa --last
sudo-1.7.2p1-14.el5_8.3                       Thu Aug 16 13:07:28 2012
nss-tools-3.13.5-4.el5_8                      Tue Aug  7 09:11:48 2012
nscd-2.5-81.el5_8.4                           Tue Aug  7 09:11:48 2012
tzdata-2012c-3.el5                            Tue Aug  7 09:10:41 2012
libtiff-3.8.2-15.el5_8                        Mon Jul  9 09:08:25 2012
e2fsprogs-libs-1.39-34.el5_8.1                Thu Jun 28 11:02:23 2012
perl-Date-Calc-5.4-1.2.2.1                    Wed Jun 20 10:49:01 2012
perl-Bit-Vector-6.4-2.2.2.1                   Wed Jun 20 10:49:01 2012
...
O aplicándolo a un sólo paquetes,
shell> rpm -qa --last sudo
sudo-1.7.2p1-14.el5_8.3                       Thu Aug 16 13:07:28 2012
Este comando a mayores de indicarnos la fecha nos permite obtener un listado de los paquetes que se han instalado juntos (coinciden en fecha), lo que puede ayudar a diagnosticar un problema en el sistema en caso de que algo falle tras la instalación de algún software.
Leer más

rpmdb: Lock table is out of available locker entries

El sistema de paquetería basado en RPM, guarda una pequeña base de datos Berkeley que en algunas ocasiones puede fallar de forma estrepitosa y dejar el sistema de paquetería inservible. Por defecto, tanto en sistemas RedHat como en sistemas Debian, la gestión de paquetes se hace bloqueando el acceso exclusivo, para que dos procesos diferentes no puedan hacer operaciones simultáneas y dejar el sistema en un estado inconsistente. Por ejemplo, instalar software incompatible entre sí.
La base de datos rpmdb en algunas ocasiones puede darse el caso de que si en medio de la instalación se cancela el proceso, ésta se corrompa y por lo tanto el sistema de paquetería quede inservible. El error que se obtiene es el siguiente,
rpmdb: Lock table is out of available locker entries
error: db4 error(22) from db->close: Invalid argument
error: cannot open Packages index using db3 - Cannot allocate memory (12)
error: cannot open Packages database in /var/lib/rpm
La solución es bastante simple, pero la verdad, es que la primera vez que sucede, asusta un poco. Vamos por lo tanto a arreglar el fallo que hemos provocado ;-)
  1. Copia de seguridad de las bases de datos actuales
    shell> cp -r /var/lib/rpm /var/lib/rpm.old
    
  2. Borrado de las base de datos actuales
    shell> rm /var/lib/rpm/__db.00*
    
  3. Regeneramos la base de datos de información RPM
    shell> rpm --rebuilddb
    
  4. Comprobamos que todo está correcto
    shell> rpm -qa | sort
    
    1. Borramos la copia de seguridad creada en el punto 1
      shell> rm -rf /var/lib/rpm.old
      
Leer más

RPM cheat sheet

Encontrar un cheat sheet de rpm por la red es bastante simple, pero normalmente cuando necesito acordarme de una opción concreta me aparecen todas menos la que busco. Para solucionarlo, dejo aquí las que voy usando más habitualmente, así cuando las necesite las encontraré y de paso servirá de ayuda, quizás, a alguien más.

  • Instalar un paquete
    shell> rpm -i package.rpm
    shell> rpm -ivh package.rpm
    
  • Desinstalar un paquete
    shell> rpm -e package
    
  • Actualizar un paquete
    shell> rpm -Uvh package_2.rpm
    
  • Listado de paquetes
    shell> rpm -qa
    
  • Versión de un paquete instalado
    shell> rpm -q package
    
  • Mostrar información de un paquete
    shell> rpm -qi package
    
  • Listado de los ficheros de un paquete
    shell> rpm -ql package
    
  • ¿A qué paquete pertenece este fichero?
    shell> rpm -qf /usr/bin/file
    
  • Verificar un paquete instalado
    shell> rpm --verify package
    
  • Comprobar firma de paquete
    shell> rpm --checksig package
    
  • Testear los cambios que un paquete haría
    shell> rpm -Uvh --test package_2.rpm
    
  • Ficheros de configuración de un paquete
    shell> rpm -qc package
    
  • Servicios que provee un paquete
    shell> rpm -q --provides package
    
  • Mostrar los últimos paquetes instalados
    shell> rpm -qa --last
Leer más

HowTo compile Percona Server on RedHat

Esta semana tocó realizar una compilación de Percona Server para RedHat. Hay ocasiones en las que es necesarios realizar una compilación local, ya bien sea por rendimiento, ya bien por que el cliente quiera que todos los paquetes sean locales y no vengan precompilados de otro lado.
Por suerte, Percona ofrece para descarga directa la última versión disponible en formato src.rpm, por lo que tras instalar todas las dependencias se podría realizar sin problema un rpmbuild --rebuild. La sorpresa fue que la compilación no es tan sencilla, ya que había varios fallos.
El primero de los fallos ocurrió al compilar el HandlerSocket-Plugin-for-MySQL. RedHat trae por defecto la versión 5.1 de MySQL y cuando el HandlerSocket requería las librerías, estas no servían y por ello fallaba. Para solucionarlo, bastó con desinstalar todas las librerías de MySQL del sistema y que para la compilación cogiera las que él mismo estaba compilando. Con esto, HandlerSocket ya compiló perfectamente.
El error al que se hace referencia es el que sigue.
libtool: compile:  g++ -DHAVE_CONFIG_H -I. -I.. -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/sql -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/include -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/regex -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0 -I/usr/include/mysql -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -fPIC -g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -DMY_PTHREAD_FASTMUTEX=1 -DDBUG_OFF -I../libhsclient -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -felide-constructors -fno-exceptions -fno-rtti -I/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/release/include -Wall -g -fno-rtti -fno-exceptions -fPIC -DPIC -MT handlersocket_la-database.lo -MD -MP -MF .deps/handlersocket_la-database.Tpo -c database.cpp  -fPIC -DPIC -o .libs/handlersocket_la-database.o
In file included from database.cpp:16:
mysql_incl.hpp:43:24: error: mysql_priv.h: No such file or directory
database.cpp:99: error: ISO C++ forbids declaration of 'TABLE' with no type
database.cpp:99: error: expected ';' before '*' token
database.cpp: In constructor 'dena::tablevec_entry::tablevec_entry()':
database.cpp:102: error: class 'dena::tablevec_entry' does not have any field named 'table'
database.cpp: At global scope:
database.cpp:106: error: expected ')' before '*' token
database.cpp:124: error: 'Item_string' does not name a type
database.cpp:125: error: 'Item_int' does not name a type
database.cpp:126: error: 'Item_func_get_lock' does not name a type
database.cpp:127: error: 'Item_func_release_lock' does not name a type
database.cpp: In member function 'long long int dena::expr_user_lock::get_lock()':
database.cpp:118: error: 'lck_func_get_lock' was not declared in this scope
database.cpp: In member function 'long long int dena::expr_user_lock::release_lock()':
database.cpp:121: error: 'lck_func_release_lock' was not declared in this scope
database.cpp: At global scope:
database.cpp:150: error: 'TABLE' has not been declared
database.cpp:157: error: 'ha_rkey_function' has not been declared
database.cpp:158: error: 'TABLE' has not been declared
database.cpp:160: error: 'TABLE' has not been declared
database.cpp:161: error: 'uchar' has not been declared
database.cpp:162: error: 'TABLE' has not been declared
database.cpp:163: error: ISO C++ forbids declaration of 'uchar' with no type
database.cpp:163: error: expected ',' or '...' before '*' token
database.cpp:164: error: 'TABLE' has not been declared
database.cpp:165: error: 'TABLE' has not been declared
database.cpp:166: error: 'TABLE' has not been declared
database.cpp:176: error: ISO C++ forbids declaration of 'THD' with no type
database.cpp:176: error: expected ';' before '*' token
database.cpp:177: error: ISO C++ forbids declaration of 'MYSQL_LOCK' with no type
database.cpp:177: error: expected ';' before '*' token
database.cpp: In constructor 'dena::dbcontext::dbcontext(volatile dena::database*, bool)':
database.cpp:222: error: class 'dena::dbcontext' does not have any field named 'thd'
database.cpp:222: error: class 'dena::dbcontext' does not have any field named 'lock'
database.cpp: At global scope:
database.cpp:237: error: 'THD' was not declared in this scope
database.cpp:237: error: 'thd' was not declared in this scope
database.cpp:237: error: expected primary-expression before 'volatile'
database.cpp:237: error: initializer expression list treated as compound expression
database.cpp:238: error: expected ',' or ';' before '{' token
database.cpp:1182: error: expected '}' at end of input
database.cpp:1182: error: expected '}' at end of input
database.cpp:237: warning: 'dena::::wait_server_to_start' defined but not used
make[2]: *** [handlersocket_la-database.lo] Error 1
make[2]: Leaving directory `/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/storage/HandlerSocket-Plugin-for-MySQL/handlersocket'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/javier/rpmbuild/BUILD/Percona-Server-5.5.16-rel22.0/Percona-Server-5.5.16-rel22.0/storage/HandlerSocket-Plugin-for-MySQL'
make: *** [all] Error 2
error: Bad exit status from /var/tmp/rpm-tmp.fEHBlk (%build)

Una vez solucionado este problema, parece que ya todo estaba solucionado, por lo tanto intentamos nuevamente compilar Percona-Server.
shell> rpmbuild -ba \
       --clean \
       --with yassl --target x86_64 \
       --define "gotrevision 1" \
       percona-server-5.5.19.spec

Con esto, obtenemos un nuevo error, por ser un sistema de 64 Bit's.
Processing files: Percona-Server-devel-55-5.5.17-rel22.1.1.rhel6.x86_64
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/include/handlersocket
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlclient.a
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlclient_r.a
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlservices.a
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libhsclient.a
error: File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/libhsclient.la

RPM build errors:
    File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/include/handlersocket
    File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlclient.a
    File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlclient_r.a
    File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libmysqlservices.a
    File not found: ~/rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/mysql/libhsclient.a
    File not found: ~rpmbuild/BUILDROOT/Percona-Server-55-5.5.17-rel22.1.1.rhel6.x86_64/usr/lib64/libhsclient.la
Para solucionarlo, añadimos más parámetros al rpmbuild, tal como sigue y la compilación ya es satisfactoria.
shell> rpmbuild -ba \
       --clean \
       --with yassl \
       --target x86_64 \
       --define "redhat_version 15" \
       --define "gotrevision 1" \
       --define "_libdir /usr/lib" \
       percona-server-5.5.19.spec
Leer más

Extraer contenido de un paquete .rpm

Si ya hablamos en su momento de cómo extraer el contenido de un paquete debian, lo mismo se puede hacer para el sistema de paquetes RedHat/Suse, los *.rpm. En este caso, realizar dicha labor es algo más complicado, ya que no hay una herramienta que permita extraer de forma directa el contenido sino que hay que pasarlo por un pipe. Primero convertimos los archivos del rpm en ficheros y luego los componemos y volvemos a crear. Para ello usamos los comandos rpm2cpio y cpio, tal como se muestra a continuación.
shell> rpm2cpio nautilus-dropbox-0.7.0-1.rpm | cpio -idmv
./usr/bin/dropbox
./usr/share/applications/dropbox.desktop
./usr/share/icons/hicolor/16x16
...
shell> ls
usr   nautilus-dropbox-0.7.0-1.fedora.i386.rpm 

Las opciones "idmv" de cpio significan:
  • i, restaura los archivos.
  • d, crear directorios en caso de ser necesario.
  • m, mantiene los archivos en caso de que ya existan.
  • v, modo verboso.
Si lo que necesitas es ver el contenido del paquete RPM, pero no extraer sus ficheros, puedes usar el comando rpm con las opciones:
  • q, consulta el archivo rpm
  • l, lista los archivos en el paquete
  • p, especifica el nombre del paquete
shell> rpm -qlp nautilus-dropbox-0.7.0-1.rpm
/usr/bin/dropbox
/usr/share/applications/dropbox.desktop
/usr/share/icons/hicolor/16x16
...
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios