miércoles, 16 de enero de 2013

Linux. Troubleshooting avanzado con rpm: un caso de estudio


Haciendo un upgrade de Fedora 17 a 18, usé "fedup" para instalar vía red la nueva versión, pero de momento existe un problema, el repositorio de updates de F17 tiene paquetes más nuevos que los de Fedora 18 (stable y updates).

El resultado fue que muchos paquetes quedaron sin ser actualizados y KDE tuvo varios problemas menores. La versión de KDE en F18 es 4.9.4 y la de los updates de F17 es 4.9.5 al momento.

Varios paquetes más quedaron sin actualizar, pero no tienen mayor importancia en mi caso (un par de apps y libs relacionadas con multimedia, etc.).


La solución: llevar los paquetes de KDE de versiones de fc17 a fc18 (es decir, hacer "retroceder" KDE de 4.9.5 a 4.9.4).

1) Listé y guardé los paquetes en un archivo
rpm -qa | grep fc17 | grep 4.9.5 > paquetes-sin-actualizar

2) Desinstalé manualmente los paquetes usando el comando rpm
cat paquetes-sin-actualizar | while read line ; do rpm -ve --nodeps $line ; done

3) Edité el archivo paquetes-sin-actualizar con mc (F4 para buscar y reemplazar) y borré todo el texto sobrante que no fuera el nombre del paquete en sí:

Y pasé de esto:

kdenetwork-common-4.9.5-1.fc17.noarch

a esto:

kdenetwork-common

4) Luego instalé todo con yum de vuelta (con --skip-broken):

yum install --skip-broken kdenetwork-krfb kactivities-devel kdegraphics-strigi-analyzer ark kdegraphics-thumbnailers kdegames-libs kdenetwork-kget-libs ksysguard kdepimlibs-akonadi kate audiocd-kio-libs kruler nepomuk-core-libs libkcddb kdepim-libs kde-runtime-devel libkipi kde-workspace-devel kactivities kcm_colors kdepimlibs-kxmlrpcclient audiocd-kio kdeplasma-addons kmix nepomuk-core kolourpaint-libs kde-workspace-libs kwallet kdenetwork-kdnssd libkdcraw kdenetwork-krfb-libs kdepim gwenview kwrite kate-part ksysguardd kdepim-runtime-libs ark-libs plasma-scriptengine-python kdenetwork-krdc-libs marble-libs kde-baseapps kross-python libkworkspace kdepimlibs kde-runtime kate-libs kwin-gles-libs ksnapshot kgreeter-plugins kolourpaint kde-workspace kamera kcalc libkcompactdisc kcolorchooser pykde4 kdepim-runtime kde-baseapps-devel ksysguard-libs marble kgpg libkexiv2 kde-runtime-libs kde-runtime-drkonqi kdeplasma-addons-libs kcharselect kross-interpreters libkexiv2-devel gwenview-libs kdenetwork-kget kdegames-minimal kdenetwork-krdc kde-baseapps-libs


5) Hice lo mismo con las librerías QT (borrar con rpm y luego instalar con yum).

qt-mysql
qt
qt-devel
qt-x11

6) Finalmente corrí de vuelta un "rpm -qa | grep fc17" y revisé la salida para ver que no hubiera ningun paquete relacionado con KDE que hubiera quedado sin cambiar de fc17 a fc18 (el tip es mirar el nombre "kalgo" o leer la descripción).

7) yum install @kde-desktop-basic

y con eso completé varias actualizaciones hacia atrás de paquetes faltantes. Listo



Problema con nss

En algun momento estaba mirando los paquetes de versiones pertenecientes a Fedora 17 ("fc17"), y se me dió por actualizar varios más usando la técnica explicada arriba.

Tuve la mala suerte de encontrar una dependencia importante y desinstalarla: nss

En Fedora 18 al momento tiene esta versión: nss-3.14-7.fc18.x86_64

El problema de correr un "rpm -ve --nodeps nss" es que borra el paquete nss. Luego de eso, ni el comando rpm ni yum funcionan de ninguna manera (los corrí, dieron error de librería faltante y no intenté nada más).

La solución es así:

1) Bajar el paquete de nss de un repositorio de Fedora 18 (y así ya tenemos el paquete compatible directamente con todo lo demás en el sistema):

wget http://fedora.inode.at/fedora/linux/releases/18/Fedora/x86_64/os/Packages/n/nss-3.14-7.fc18.x86_64.rpm

2) Luego de eso va a hacer falta usar un comando para descomprimir e instalar a mano el paquete,

rpm2cpio myrpmfile.rpm | cpio -idmv

Fuente
http://www.cyberciti.biz/tips/how-to-extract-an-rpm-package-without-installing-it.html


Claro, está el problema de que rpm2cpio usa nss para trabajar, así que tampoco anda (al igual que pasa con el comando rpm y con yum).


- Conseguir un binario y deployarlo temporalmente para poder usar rpm2cpio

La solución rápida para conseguir los archivos del paquete nss:

[root@wintermute ~]# rpm -ql nss
/etc/pki/nssdb
/etc/pki/nssdb/cert8.db
/etc/pki/nssdb/key3.db
/etc/pki/nssdb/secmod.db
/usr/lib64/libnss3.so
/usr/lib64/libnssckbi.so
/usr/lib64/libnsspem.so
/usr/lib64/libsmime3.so
/usr/lib64/libssl3.so

y en realidad solo necesitamos /usr/lib64/libnss3.so

Manos a la obra:

a) Conseguir una imagen .iso de Fedora 17 o 18
b) Montamos la imagen iso hasta llegar al filesystem:

[root@wintermute isos]# mount -o loop Fedora-17-x86_64-Live-KDE.iso /mnt/iso/
[root@wintermute LiveOS]# pwd
/mnt/iso/LiveOS
[root@wintermute LiveOS]# mount -o loop squashfs.img /mnt/img/
[root@wintermute LiveOS]# pwd
/mnt/img/LiveOS
[root@wintermute LiveOS]# mount -o loop ext3fs.img /mnt/extimg/
[root@wintermute LiveOS]# ls /mnt/extimg/
bin/        dev/        home/       lib64/      media/      opt/        root/       sbin/       sys/        usr/        
boot/       etc/        lib/        lost+found/ mnt/        proc/       run/        srv/        tmp/        var/        
[root@wintermute LiveOS]# ls /mnt/extimg/lib64/libnss3.so 
/mnt/extimg/lib64/libnss3.so

Y ahí tenemos nuestro reemplazo temporal libnss3.so para poder usar el comando rpm2cpio.

c) Copiamos libnss3.so a nuestro raíz /usr/lib64/libnss3.so

cd /mnt/extimg/lib64/
cp libnss3.so /usr/lib64/libnss3.so

Listo


3) Ahora sí podemos ir hasta el directorio donde bajamos el archivo .rpm y descomprimirlo:

rpm2cpio nss-3.14-7.fc18.x86_64.rpm | cpio -idmv

Luego de lo cual tendremos disponibles los archivos que contiene el archivo rpm:

[root@wintermute rpm]# ls
nss-3.14-7.fc18.x86_64.rpm
[root@wintermute rpm]# rpm2cpio nss-3.14-7.fc18.x86_64.rpm | cpio -idmv
[root@wintermute rpm]# ls -R
.:
etc  libnss3.so  nss-3.14-7.fc18.x86_64.rpm  usr

./etc:
pki

./etc/pki:
nssdb

./etc/pki/nssdb:
cert8.db  key3.db  secmod.db

./usr:
lib64

./usr/lib64:
libnss3.so  libnssckbi.so  libnsspem.so  libsmime3.so  libssl3.so


Ahora podemos copiar todo el contenido de que encontremos a /etc y /usr/lib64 respectivamente:

[root@wintermute rpm]# cp -R etc/pki/ /etc
[root@wintermute rpm]# cp -R usr/lib64/ /usr/lib64/

- En este punto, ya recuperamos totalmente la funcionalidad de rpm (y yum), así que solamente para asegurarnos:

yum install nss

y ahí realmente vamos a terminar con el troubleshooting, instalando "formalmente" el paquete nss (aunque ya lo teníamos totalmente instalado a mano, no figuraba en la base de datos RPMDB, necesaria para que todo funcione bien con yum).

No hay comentarios: