Arreglando pkgdb

Hay veces que FreeBSD también juega malas pasadas. Este ha sido el caso de una máquina dejada en el olvido. Estoy intentando recuperar su uso y ponerla al día. Me gusta utilizar portupgrade para estas tareas de mantenimiento, con lo que, -después de un make update- al hacer un listado de los paquetes que necesitaban actualizarse procedo con uno de ellos:
# portupgrade ruby-1.8.5_4,1
[Updating the pkgdb (format:bdb_btree) in /var/db/pkg ... /var/db/pkg/pkgdb.db: unexpected
file type or format -- Invalid argument; rebuild needed] [Rebuilding the pkgdb
(format:bdb_btree) in /var/db/pkg ... [Updating the pkgdb (format:bdb_btree) in /var/db/pkg ... /var/db/pkg/pkgdb.db:
unexpected file type or format -- Invalid argument; rebuild needed]
[Rebuilding the pkgdb (format:bdb_btree) in /var/db/pkg ... /var/db/pkg/pkgdb.db: unexpected file type or format -- Invalid 
argument: Cannot update the pkgdb!]: Cannot update the pkgdb!]
Command failed [exit code 1]: /usr/local/sbin/pkgdb -aFOQ
Vaya, era previsible tener algo roto después de tanto tiempo. A ver si obtenemos más información de lo que ocurre realmente:
# pkgdb -aFOQ
[Updating the pkgdb (format:bdb_btree) in /var/db/pkg ... /var/db/pkg/pkgdb.db: unexpected file type or format -- Invalid argument; rebuild needed] [Rebuilding the pkgdb (format:bdb_btree) in /var/db/pkg ... /var/db/pkg/pkgdb.db: unexpected file type or format -- Invalid argument: Cannot update the pkgdb!]: Cannot update the pkgdb!]
Parece que falla la base de datos de paquetes (pkgdb.db), intentamos forzar su recuperación:
# pkgdb -F
--->  Checking the package registry database
[Updating the pkgdb (format:bdb_btree) in /var/db/pkg ... /var/db/pkg/pkgdb.db: unexpected file type or format -- Invalid argument; rebuild needed] [Rebuilding the pkgdb (format:bdb_btree) in /var/db/pkg ... /var/db/pkg/pkgdb.db: unexpected file type or format -- Invalid argument: Cannot update the pkgdb!]: Cannot update the pkgdb!]
Sin éxito. Pues a lo bruto. Hacemos copia de seguridad de INDEX-6.db y pkgdb.db y procedemos a la actualización manual (make, make install...) de portupgrade, ruby-bdb y db4 (el gestor de base de datos de paquetes):
# mv /usr/ports/INDEX-6.db --> INDEX-6.db.org
# mv /var/db/pkg/pkgdb.db --> pkgdb.db.org
# pkg_delete portupgrade-2.3.1,2
# pkg_delete ruby18-bdb-0.6.2
# pkg_delete ruby18-bdb1-0.2.2
Es posible que nos advierta de dependencias insatisfechas en el borrado de alguno de estos paquetes, no nos preocupamos demasiado puesto que su eliminación solo será temporal. De necesitarlo, forzamos (-f) su desinstalación:
# pkg_delete db41-4.1.25_4
pkg_delete: package 'db41-4.1.25_4' is required by these other packages
and may not be deinstalled:
amavisd-new-2.4.3_1,1
p5-BerkeleyDB-0.31

# pkg_delete -f db41-4.1.25_4
pkg_delete: package 'db41-4.1.25_4' is required by these other packages
and may not be deinstalled (but I'll delete it anyway):
amavisd-new-2.4.3_1,1
p5-BerkeleyDB-0.31
Ahora reinstalamos portupgrade a la antigua usanza y desde cero (make clean para borrar antiguas compilaciones y configuraciones). Seleccionamos BDB4 de nuevo como backend de datos (¡veis como era temporal!). Y por último recomponemos de nuevo la base de datos de paquetes (pkgdb -F):
# cd /usr/ports/ports-mgmt/portupgrade
# make clean
# make config
  [X] BDB4  Use Berkeley DB >=2 as backend 
# make
# make install
# pkgdb -F
Finalmente ya estamos en disposición de volver al proceso de instalación/actualización del software obsoleto:
# portupgrade ruby-1.8.5_4,1
Imagino que habrá múltiples formas - y más simples- de recomponer este error, yo lo he hecho así ;).
sysadmin freebsd

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.