Compilar apt-get y dpkg, y hacer que funcionen

TÍTULO:				Compilar apt-get y dpkg, y hacer que funcionen
VERSIÓN LFS:		Todas
AUTOR:				Ben Roberts <benr@wam.umd.edu>
TRADUCTOR:		Proyecto LFS-ES

SINOPSIS:
	dpkg y apt-get son un par de programas extremadamente potentes para manejar 
paquetes, famosos por su habilidad para actualizar fácilmente un sistema Linux entero. 
Sin embargo, ya que estas herramientas están diseñadas para instalar y mantener 
una distribución Debian GNU/Linux, nunca se pensó que pudieran ser instaladas 
"desde cero". Esta receta describe como "engañar" a estos programas para que
funcionen.

RECETA:
[Intenté este proceso por primera vez en el 2001 para instalar Debian encima de 
RedHat sin arrancar de nuevo y sin los CDs de instalación. Funcionó bastante bien, 
pero las anotaciones de como lo hice se perdieron cuando se estropeó el disco duro 
de mi ordenador. He intentado recrear el proceso usando una instalación de LFS en 
un entorno chroot. Espero que a ti también te funcione.]

Primero, descarga el código fuente de dpkg y apt de packages.debian.org/dpkg y 
packages.debian.org/apt respectivamente (el enlace pequeño cerca del final de la 
página). Las versiones usadas para escribir esta receta son dpkg-1.9.21 y apt-0.5.4.

$ tar xzvf dpkg_1.9.21.tar.gz
$ cd dpkg-1.9.21
$ ./configure --prefix=/usr --admindir=/var/lib/dpkg

Ten en cuenta de que la opción --with-admindir tiene un valor por defecto diferente 
(/usr/lib/db) del que apt y el resto de Debian usa. Por tanto es conveniente usar la 
opción de configure para asignarle un valor por defecto ahora, o crear un enlace 
simbólico.

Si simplemente tecleas 'make', la compilación fallará a menos que tengas instalados 
jade y debiandoc2html (probablemente no tengas ninguno de los dos). La mejor forma 
de solucionar esto es cambiando doc/Makefile, de la siguiente forma:

$ mv doc/Makefile doc/Makefile.bak
$ sed 's/^all: /&# /g; s/^install: /&# /g' doc/Makefile.bak > doc/Makefile

(esta es una razón más para instalar la versión de Debian del paquete
una vez que apt funcione)

$ make
$ su
# make install 

Ahora instalaremos apt.

$ tar xzvf apt_0.5.4.tar.gz
$ cd apt-0.5.4
$ ./configure

No hay ninguna opción útil aquí, ni siquiera se necesita --prefix.

$ make

apt no tiene un objetivo 'make install', y por tanto debe instalarse manualmente. 
Afortunadamente, casi todos los ficheros que se deben instalar están en el 
subdirectorio bin. La excepción son los guiones de dselect.

¡Ten en cuenta que apt probablemente no funcionará si no se usan exactamente 
estos directorios!. Es por eso que no se utilizó la opción --prefix de configure; apt 
no tiene en cuenta esta opción.

$ su
# cd bin
# cp -a libapt-* /usr/lib
# ldconfig
# cp apt-cache apt-cdrom apt-config apt-get /usr/bin
# mkdir /usr/lib/apt
# cp -R methods /usr/lib/apt
# cd ..
# cp -R scripts/dselect /usr/lib/dpkg/methods/apt
# mkdir -p /etc/apt /var/state/apt/lists/partial \
	/var/cache/apt/archives/partial

Ahora, vamos a hacer que funcione. Primero necesitamos el fichero 
/etc/apt/sources.list. Puedes cambiar los sitios que aparecen más abajo por los
servidores de respaldo (mirrors) que desees, por supuesto. También puedes añadir 
otras fuentes y actualizaciones de seguridad, pero esto es sólo un consejo.

# cat > /etc/apt/sources.list >> EOF
# Inicio /etc/apt/sources.list

deb http://http.us.debian.org/debian testing main contrib non-free
deb http://non-us.debian.org/debian-non-US testing/non-US main contrib non-free

# Fin /etc/apt/sources.list
EOF

Si necesitas crear el enlace simbólico /var/lib/dpkg a /usr/lib/db, hazlo ahora.

# ln -s /usr/lib/db /var/lib/dpkg

# touch /var/lib/dpkg/status

# dselect

En dselect, empieza con el menú [A]ccess y elige apt. Conserva el fichero de 
configuración que hemos creado antes. Después elige [U]pdate. Ahora la base de 
datos de dpkg ha sido actualizada (por alguna razón, apt-get update no me funcionó; 
si tienes problemas, prueba con dselect).

Eso es todo. Una cosa que hay que tener en cuenta es que a dpkg no le gusta 
instalarse desde cero como hemos hecho nosotros. Muchos paquetes esenciales 
tienen dependencias más complejas que las que muestran. Puedes tener problemas 
instalando cosas porque otras no están instaladas (un ejemplo es si intentas instalar 
libc6, te dirá que dpkg no está instalado, aunque no depende de él). La solución a esto 
es modificar /var/lib/dpkg/status. Para arreglar el problema con libc6, añade esto a la 
base de datos de dpkg:

Package: dpkg
Essential: yes
Status: install ok installed
Priority: required
Section: base
Installed-Size: 2360
Maintainer: Wichert Akkerman <wakkerma@debian.org>
Version: 1.9.21
Replaces: dpkg-doc-ja
Pre-Depends: libc6.1 (>= 2.2.4-4), libncurses4 (>= 5.2.20020112a-1),
libstdc++2.10-glibc2.2 (>= 1:2.95.4-0.010810) <--- *PON ESTO EN LA LÍNEA
ANTERIOR!*
Description: Package maintenance system for Debian
 This package contains the programs which handle the installation and
 removal of packages on your system.
 .
 The primary interface for the dpkg suite is the `dselect' program;
 a more low-level and less user-friendly interface is available in
 the form of the `dpkg' command.
 .
 In order to unpack and build Debian source packages you will need to
 install the developers' package `dpkg-dev' as well as this one.

Hay que destacar que la versión de dpkg es la misma que la que hemos instalado. 
Si quieres reinstalar dpkg a partir de un paquete, la mejor forma de hacerlo es 
decrementar el número de versión en uno, de modo que piense que está instalada 
la versión 1.9.20. Entonces dpkg automáticamente se actualizará a si mismo.

Podrías incluso añadir todos los paquetes instalados hasta el momento en esta base 
de datos, y utilizar dselect para hacer que no se actualicen (ponerlos en estado hold). 
De esta forma, sólo tienes que preocuparte de los binarios, y has engañado a dpkg 
para que no sobreescriba tu instalación LFS.

Eso es todo. ¡Buena suerte con tu Debian desde cero!
(¿DFS? ¿DG/LFS quizás?)