Repositorios
Los paquetes .deb los podemos encontrar aislados o bien agrupados en lo que se denomina un repositorio u origen o fuente de paquetes (package source). No debemos confundir el término package source (repositorio) con el término source package, que se refiere a paquete fuente, es decir, un paquete donde se encuentra el código fuente de un programa.
Todos los paquetes que forman una distribución GNU/Linux se colocan juntos dentro de un repositorio, pero existe también software, que por diversos motivos, normalmente por cuestiones de licencia, no pertenecen a una distribución o incluso a ninguna distribución, y es su creador, empresa o individuo, el que prepara el paquete gratuito o de pago, normalmente en distintos formatos (.deb, .rpm, etc.) para que pueda ser instalado en múltiples distribuciones GNU/Linux. Un ejemplo es el programa TeamViewer, el cual no pertenece a ninguna distribución, y si queremos instalarlo en Debian, al no encontrarse en el repositorio, debemos conseguir el paquete .deb, y lo habitual en estos casos, es localizarlo en la página web de su desarrollador.
Como se ha dicho, todos los paquetes de una distribución GNU/Linux se encuentran agrupados en un repositorio desde donde se podrán instalar muy fácilmente. Existen distintos tipos de repositorios, y todos son formas de almacenar un conjunto de ficheros:
- Sitio web (es la forma más utilizada de repositorio)
- Servidor FTP
- CD-ROM
- DVD
- Directorio local
- ...
En Debian, la forma más avanzada, y por lo tanto la más cómoda de instalar programas (paquetes) es a través de APT (Advanced Package Tool, Herramienta Avanzada de Paquetes), y una parte muy importante de su configuración consiste en especificar los repositorios desde donde se van a coger los paquetes y las bases de datos que contienen el listado de los paquetes que existen. Esto se hace a través del fichero /etc/apt/sources.list y se pueden poner más de un repositorio.
Como se ha dicho en el párrafo anterior, para funcionar correctamente, APT necesita fundamentalmente dos tipos de ficheros de los repositorios:
- Los paquetes, tanto los binarios (.deb) como los fuentes. De estos últimos se puede prescindir si no vamos a trabajar con el código fuente.
- Las bases de datos que contienen la lista de todos los paquetes que existen en la distribución. Son simples ficheros de texto comprimidos cuyos nombres son: Packages.gz (.xz o .bz2) y Sources.gz (.xz o .bz2), para la base de datos de paquetes binarios y paquetes fuentes respectivamente.
Los repositorios Debian tienen una determinada estructura de directorios y las empresas que quieren crear sus propios repositorios para distribuir su software replican dicha estructura. Un ejemplo de esto es la empresa Oracle que para distribuir su software de virtualización llamado Virtualbox, utiliza las dos formas que se han comentado, por un lado ha creado un paquete Debian (.deb) aislado para que se descargue y se instale, y por otro, también ha creado un repositorio Debian desde el cual instalarse.
Veamos ahora, sin entrar en todos los detalles, cómo son estos repositorios u orígenes Debian y su configuración en sources.list.
En primer lugar, tendremos un espacio de almacenamiento donde se va a guardar todo lo necesario, ya sea en un servidor web o ftp, un DVD, etc. Dentro del directorio raíz de este espacio de almacenamiento cuelgan varios directorios y ficheros, pero los más interesantes para nosotros son los dos directorios siguientes:
raíz
├── dists
└── pool
Del directorio dists (distribuciones) cuelgan varios directorios, y entre ellos hay uno por cada una de las seis ramas de desarrollo paralelo que tiene Debian, que en estos momentos son:
raíz
├── dists
│ ├── experimental
│ ├── sid
│ ├── buster
│ ├── stretch
│ ├── jessie
│ └── wheezy
└── pool
Pero como las ramas de Debian tienen varios nombres, se han creado enlaces simbólicos que apuntan a estos directorios para que estén todos los nombres. Así, stretch también se llama en estos momentos stable y es la versión 9 de Debian, y lo mismo sucede con el resto de nombres, menos con experimental que tiene nombre único. Por lo tanto los nuevos directorios (en realidad enlaces simbólicos) son:
raíz
├── dists
│ ├── experimental
│ ├── sid
│ ├── unstable
│ ├── buster
│ ├── testing
│ ├── stretch
│ ├── stable
│ ├── jessie
│ ├── oldstable
│ ├── wheezy
│ └── oldoldstable
└── pool
Y además, están los terceros nombres de las versiones estables:
raíz
├── dists
│ ├── experimental
│ ├── sid
│ ├── unstable
│ ├── buster
│ ├── testing
│ ├── stretch
│ ├── stable
│ ├── Debian9
│ ├── jessie
│ ├── oldstable
│ ├── Debian8
│ ├── wheezy
│ ├── oldoldstable
│ └── Debian7
└── pool
Todos estos directorios de segundo nivel tienen la misma estructura, por lo que voy a mostrarla únicamente sobre el directorio stretch (contiene la rama estable actual), pero lo mismo se repetiría en los demás directorios.
raíz
├── dists
│ ├── experimental
│ ├── sid
│ ├── unstable
│ ├── buster
│ ├── testing
│ ├── stretch
│ │ ├── main
│ │ ├── contrib
│ │ ├── non-free
│ │ ├── Release
│ │ └── Release.gpg
│ ├── stable
│ ├── Debian9
│ ├── jessie
│ ├── oldstable
│ ├── Debian8
│ ├── wheezy
│ ├── oldoldstable
│ └── Debian7
└── pool
En primer lugar tenemos los directorios main, contrib y non-free, que son las tres secciones en las que Debian clasifica los programas en base a la licencia de estos. Veamos entonces qué paquetes podemos encontrar en cada una de estas secciones:
- main: Esta sección contiene todos los programas clasificados como software libre, es decir, que cumplen con las cuatro libertades que se les exigen al software para catalogarse como libre.
- contrib: Contiene programas de código abierto que no pueden funcionar sin elementos privativos. Por ejemplo, OpenOffice necesitaba de un entorno Java privativo.
- non-free: En este directorio se ponen los programas que no cumplen con las cuatro libertades del software libre, pero pueden ser distribuidos sin restricciones. Esta sección, que no es parte de Debian oficialmente, es un servicio para los usuarios que pueden llegar a necesitar algunos de estos programas, sin embargo Debian siempre recomienda dar prioridad al software libre.
También tenemos en el directorio stretch dos ficheros que forman parte de la seguridad que da Debian para asegurarnos de que lo que nos bajamos de sus repositorios es original y no ha sido modificado por un error en la descarga o fraudulentamente. Estos ficheros son:
- Release: Contiene los hash MD5 y SHA256 de los ficheros Packages.gz y Sources.gz. Esto permite a APT comprobar que el fichero Packages.gz y/o el fichero Sources.gz que se haya descargado es el original y no ha sufrido ningún cambio fortuito o intencionado. El contenido de este fichero tiene la siguiente forma:
...
6dffb6bafff4453b92b2534306b9a6627ca6bf1dd75f64458205369460ee71ab 9496862 main/binary-amd64/Packages.gz
c8acbfd08c108a20846c84d3e3debe68d029472ef93b0639b17efe8047359de6 9466662 main/binary-i386/Packages.gz
...
d700d4cf48e871847c3d6daf10eea3903823232c6575dace8310a97c49128118 8848662 main/source/Sources.gz
...
71f7045d605faff5355001db79948ac938168fd6c1d1439d6f722b88dfdfbbf3 47155 contrib/binary-amd64/Packages.gz
03b2c64e5a68ac38cf98939cb7ed32a2db3408e0a84a73110c8082cc1ee20b9b 57104 contrib/binary-i386/Packages.gz
...
e868751550eb55df7e521df64a2d84b56315c1845e36bbb4fa4c82ce0786cd5b 52015 contrib/source/Sources.gz
...
91f7202e05d36ea32624dbc6b9534343aa52485c9d9aeefa9c86223615ae9874 92961 non-free/binary-amd64/Packages.gz
15445a43ebfe3fcdcbafab6567ceae0ff921bcfb460dc94e022577b0f0a9eefa 82102 non-free/binary-i386/Packages.gz
...
44aaafcbc5598281ecd3f438301f15b93ee4b4db4b5a7cb834883ec9db45bd86 94433 non-free/source/Sources.gz
...
- Release.gpg: Es la firma digital del fichero Release, con lo cual se garantiza la seguridad de dicho fichero. Es en este punto donde empieza la cadena de comprobación de la seguridad de cualquier fichero que nos bajemos de los repositorios de Debian. Al final de este apartado haré un seguimiento completo de esta cadena.
Siguiendo con el desarrollo de la estructura de los repositorios de Debian, toca ahora ver el contenido de los directorios main, contrib y non-free, los cuales tienen también la misma estructura y, la parte más importante es la que se muestra a continuación:
raíz
├── dists
│ ├── experimental
│ ├── sid
│ ├── unstable
│ ├── buster
│ ├── testing
│ ├── stretch
│ │ ├── main
│ │ │ ├── binary-amd64
│ │ │ ├── binary-i386
│ │ │ └── source
│ │ ├── contrib
│ │ │ ├── binary-amd64
│ │ │ ├── binary-i386
│ │ │ └── source
│ │ ├── non-free
│ │ │ ├── binary-amd64
│ │ │ ├── binary-i386
│ │ │ └── source
│ │ ├── Release
│ │ └── Release.gpg
│ ├── stable
│ ├── Debian9
│ ├── jessie
│ ├── oldstable
│ ├── Debian8
│ ├── wheezy
│ ├── oldoldstable
│ └── Debian7
└── pool
Estos nuevos directorios consisten en lo siguiente:
- source: directorio que contiene la base de datos de los paquetes fuentes (Sources.gz).
- Un directorio por cada una de las arquitecturas (amd64, i386, etc.) en las que se puede instalar Debian y, cada uno contendrá la base de datos de los paquetes binarios (Packages.gz) que existen para esa arquitectura.
raíz
├── dists
│ ├── experimental
│ ├── sid
│ ├── unstable
│ ├── buster
│ ├── testing
│ ├── stretch
│ │ ├── main
│ │ │ ├── binary-amd64
│ │ │ │ └── Packages.gz
│ │ │ ├── binary-i386
│ │ │ │ └── Packages.gz
│ │ │ └── source
│ │ │ └── Sources.gz
│ │ ├── contrib
│ │ │ ├── binary-amd64
│ │ │ │ └── Packages.gz
│ │ │ ├── binary-i386
│ │ │ │ └── Packages.gz
│ │ │ └── source
│ │ │ └── Sources.gz
│ │ ├── non-free
│ │ │ ├── binary-amd64
│ │ │ │ └── Packages.gz
│ │ │ ├── binary-i386
│ │ │ │ └── Packages.gz
│ │ │ └── source
│ │ │ └── Sources.gz
│ │ ├── Release
│ │ └── Release.gpg
│ ├── stable
│ ├── Debian9
│ ├── jessie
│ ├── oldstable
│ ├── Debian8
│ ├── wheezy
│ ├── oldoldstable
│ └── Debian7
└── pool
El contenido de un fichero Packages.gz, como ya se ha mencionado, es la lista de paquetes de una arquitectura determinada, y por cada paquete guarda la siguiente información (nombre, arquitectura, localización, hash, etc.):
$ zcat Packages.gz
Package: 0ad
Version: 0.0.21-2
Installed-Size: 18473
Maintainer: Debian Games Team <pkg-games-devel@lists.alioth.debian.org>
Architecture: amd64
Depends: 0ad-data (>= 0.0.21), 0ad-data (<= 0.0.21-2), 0ad-data-common (>= 0.0.21), 0ad-data-common (<= 0.0.21-2), libboost-filesystem1.62.0, libc6 (>= 2.15), libcurl3-gnutls (>= 7.16.2), libenet7, libgcc1 (>= 1:3.4), libgl1-mesa-glx | libgl1, libgloox15, libicu57 (>= 57.1-1~), libminiupnpc10 (>= 1.9.20140610), libnspr4 (>= 2:4.9.2), libnvtt2, libopenal1 (>= 1.14), libpng16-16 (>= 1.6.2-1), libsdl2-2.0-0 (>= 2.0.4), libstdc++6 (>= 5.2), libvorbisfile3 (>= 1.1.2), libwxbase3.0-0v5 (>= 3.0.2+dfsg), libwxgtk3.0-0v5 (>= 3.0.2+dfsg), libx11-6, libxcursor1 (>> 1.1.2), libxml2 (>= 2.9.0), zlib1g (>= 1:1.2.0)
Pre-Depends: dpkg (>= 1.15.6~)
Description: Real-time strategy game of ancient warfare
Homepage: http://play0ad.com/
Description-md5: d943033bedada21853d2ae54a2578a7b
Tag: game::strategy, interface::graphical, interface::x11, role::program,
uitoolkit::sdl, uitoolkit::wxwidgets, use::gameplaying,
x11::application
Section: games
Priority: optional
Filename: pool/main/0/0ad/0ad_0.0.21-2_amd64.deb
Size: 5229686
MD5sum: d3a3f59190a550f5347c8fc152706032
SHA256: beac2de1e7ae8d8deaa79c1eda14798dd0d597c0852c9eed7d1486bd23053174
Package: 0ad-data
Version: 0.0.21-1
............
............
La base de datos Sources.gz donde está la lista de los paquetes fuentes es similar a la anterior. Entre otros datos está: el nombre, arquitecturas, ficheros que componen el paquete, localización, etc.
Package: 0ad
Binary: 0ad
Version: 0.0.21-2
Maintainer: Debian Games Team <pkg-games-devel@lists.alioth.debian.org>
Uploaders: Vincent Cheng <vcheng@debian.org>
Build-Depends: autoconf, debhelper (>= 9), dpkg-dev (>= 1.15.5), libboost-dev, libboost-filesystem-dev, libcurl4-gnutls-dev | libcurl4-dev, libenet-dev (>= 1.3), libgloox-dev (>= 1.0.9), libicu-dev, libminiupnpc-dev (>= 1.6), libnspr4-dev, libnvtt-dev (>= 2.0.8-1+dfsg-4~), libogg-dev, libopenal-dev, libpng-dev, libsdl2-dev (>= 2.0.2), libvorbis-dev, libwxgtk3.0-dev | libwxgtk2.8-dev, libxcursor-dev, libxml2-dev, pkg-config, python, python3, zlib1g-dev
Architecture: amd64 arm64 armhf i386 kfreebsd-amd64 kfreebsd-i386
Standards-Version: 3.9.8
Format: 3.0 (quilt)
Files:
5f2af935f4537ede6169db8946d18d81 2363 0ad_0.0.21-2.dsc
095eade8c9b3deaf25d0d7fa423ff860 29196476 0ad_0.0.21.orig.tar.xz
01d28e643619455fef8d40f1d1e7da7d 71420 0ad_0.0.21-2.debian.tar.xz
Vcs-Browser: https://anonscm.debian.org/viewvc/pkg-games/packages/trunk/0ad/
Vcs-Svn: svn://anonscm.debian.org/pkg-games/packages/trunk/0ad/
Checksums-Sha256:
ee98572de81be0ffbf039951111fdef3a431d81892481a959363fbb93cfb780e 2363 0ad_0.0.21-2.dsc
96be23e4284a3931ef9536f988f2517040bde1f8700ee048bff18c932d8683cf 29196476 0ad_0.0.21.orig.tar.xz
2f6e5b751872932971c4dbf618c32ddef1021f195d0457f57030b814cb1749c7 71420 0ad_0.0.21-2.debian.tar.xz
Homepage: http://play0ad.com/
Package-List:
0ad deb games optional arch=amd64,arm64,armhf,i386,kfreebsd-amd64,kfreebsd-i386
Directory: pool/main/0/0ad
Priority: source
Section: games
Package: 0ad-data
Binary: 0ad-data, 0ad-data-common
..........
..........
En este punto ya podemos ver en qué consiste la cadena de seguridad que permite la comprobación de las descargas de los paquetes. Por ejemplo, si queremos instalar el juego de estrategia 0 A.D., necesitamos, en primer lugar, descargarnos el paquete 0ad, y para ello intervienen los siguientes ficheros:
- Release.gpg: Contiene la firma digital del fichero Release, por lo que su función es la de garantizar la seguridad del mismo.
- Release: Tras descargarse se confirma que no ha sido alterado en base a la firma digital que está en Release.gpg. Contiene la cadena hash del fichero Packages.gz, con lo cual se garantiza la seguridad de este.
- Packages.gz: Tras descargarse se comprueba que no ha sido modificado gracias al hash almacenado en Release. Se busca la información del paquete 0ad, y en ella encontramos la localización del paquete (pool/main/0/0ad/0ad_0.0.21-2_amd64.deb) y su hash para garantizar su seguridad.
- pool/main/0/0ad/0ad_0.0.21-2_amd64.deb: Es el paquete Debian que hay que descargar e instalar. Tras descargarse nos aseguramos que no ha sido alterado utilizando el hash almacenado en Packages.gz.
Para el caso de instalar un paquete fuente, se hace algo muy parecido en la cadena de seguridad, solo que hay que recordar que estos paquetes estaban formados por más de un fichero, los cuales se listan junto a sus hash en el apartado Files del fichero Sources.gz. Para el paquete fuente 0ad intervendrían los siguientes ficheros:
- Release.gpg
- Release
- Sources.gz
- pool/main/0/0ad/0ad_0.0.21-2.dsc
- pool/main/0/0ad/0ad_0.0.21.orig.tar.xz
- pool/main/0/0ad/0ad_0.0.21-2.debian.tar.xz
Como vemos, los paquetes no se encuentran dentro del directorio dists, pues ahí están las bases de datos de los listados de paquetes, y es en estas bases de datos donde se indica la localización del paquete como ruta relativa a partir del directorio raíz del espacio de almacenamiento de los repositorios, concretamente:
- Los paquetes binarios se encuentran donde indica la sección Filename dentro de Packages.gz.
- Los ficheros de un paquete fuente se encuentran donde indica la sección Directory dentro de Sources.gz.
Aunque la localización del paquete depende únicamente del valor de Filename y Directory, se ha planteado cierta organización de los paquetes, pero si esto se cambiara, no supondría mucho problema al procedimiento establecido, pues lo que se hace siempre es acceder a donde indican Filename y Directory.
Como nos habremos dado cuenta, los paquetes están dentro del directorio pool que cuelga del directorio raíz del espacio de almacenamiento de los repositorios:
raíz
├── dists
└── pool
Dentro de pool los paquetes se clasifican en base a las secciones main, contrib y non-free.
raíz
├── dists
└── pool
├── main
├── contrib
└── non-free
En cada uno de estos tres directorios se crea un directorio para cada una de las letras del abecedario y para cada uno de los dígitos del 0 al 9. La idea que se persigue es la de organizar alfabéticamente los paquetes.
raíz
├── dists
└── pool
├── main
│ ├── a
│ ├── b
│ └── t
├── contrib
└── non-free
Dentro de estos nuevos directorios habrá otro directorio para cada paquete con el nombre del paquete:
raíz
├── dists
└── pool
├── main
│ ├── a
│ ├── b
│ └── t
│ └── tree
├── contrib
└── non-free
Y ya dentro de este último directorio se encuentran todos los paquetes binarios y fuentes:
raíz
├── dists
└── pool
├── main
│ ├── a
│ ├── b
│ └── t
│ └── tree
│ ├── tree_1.6.0-1_amd64.deb
│ ├── tree_1.6.0-1_i386.deb
│ ├── tree_1.6.0-1.debian.tar.gz
│ ├── tree_1.6.0-1.dsc
│ ├── tree_1.6.0.orig.tar.gz
│ ├── tree_1.7.0-3_amd64.deb
│ ├── tree_1.7.0-3_i386.deb
│ ├── tree_1.7.0-3.debian.tar.xz
│ ├── tree_1.7.0-3.dsc
│ ├── tree_1.7.0-5_amd64.deb
│ ├── tree_1.7.0-5_i386.deb
│ ├── tree_1.7.0-5.debian.tar.xz
│ ├── tree_1.7.0-5.dsc
│ └── tree_1.7.0.orig.tar.gz
├── contrib
└── non-free
Podemos comprobar todo esto entrando en uno de los sitios web donde Debian almacena sus repositorios, por ejemplo aquí, y lo podemos comparar con el sitio web donde Oracle tiene los repositorios Debian para distribuir VirtualBox.
Licencia: licencia de software libre GPL