Crear nuestro propio repositorio de paquetes con Reprepro | Algo de Linux

martes, 16 de octubre de 2012

Crear nuestro propio repositorio de paquetes con Reprepro

En ocasiones necesitamos disponer de un repositorio de paquetes propio con el que instalar una serie de paquetes que no se encuentran en los repositorios de nuestra organización ni en los de nuestra distribución. En este caso, podemos recurrir a reprepro.

Vamos a ver cómo podemos instalar y utilizar reprepro en nuestra organización.

Instalar reprepro.
Lo primero es instalar los paquetes reprepro y apache2:

# apt-get install reprepro apache2

Reprepro necesita que tengamos apache para distribuir los paquetes del repositorio a los clientes.

Una vez instalados los paquetes, creamos el directorio principal de nuestro repositorio y el directorio de configuración de una vez. Por ejemplo:

# mkdir -p /var/www/iesvalledeljerte3/conf

A continuación vamos a crear una clave con la que firmaremos el repositorio:

cd /var/www/repositorio $ gpg --gen-key

gpg nos pedirá que seleccionemos el tipo de clave que deseamos crear. Elegiremos la opción (4) RSA (sólo firmar).

Lo siguiente que nos preguntará gpg es de qué tamaño queremos crear la clave y por defecto nos ofrece un tamaño de 2048. Lo aceptamos.

Nos preguntará por el período de validez de la clave y por detecto nos ofrecerá la opción 0 = la clave nunca caduca. Elegimos la opción por defecto.

Nos preguntará si es correcto. Respondemos que sí (s).

Nos preguntará el nombre y apellidos. Introducimos nuestro nombre y apellidos.

Nos pedirá que introduzcamos nuestra dirección de correo.  Así que la introducimos.

Nos ofrecerá la posibilidad de poner un comentario. Pulsamos Enter para dejarlo vacío.

Para terminar, suponiendo que hemos introducido todos los datos correctamente, pulsaremos (V) de (V)ale.

Y, ya por último, nos pedirá que introduzcamos una frase de contraseña. La introducimos y repetimos cuando nos lo pida.

Al final nos mostrará la clave generada. Si se nos ha escapado por lo que sea y no la hemos visto, ejecutamos:

$ gpg --list-keys
/home/enam0000/.gnupg/pubring.gpg
---------------------------------
pub   1024D/153F5386 2009-12-01
uid                  Esteban M. Navas Martín (Administrador Informatico)
sub   2048g/83061C03 2009-12-01


Copiamos el identificador de la clave pública para introducirlo posteriormente en el fichero /var/www/iesvalledeljerte3/conf/distributions. En mi caso: 153F5386

Exportamos la clave pública en un archivo y la copiamos en el directorio principal del repositorio:

$ gpg  --armor --export 153F5386 > /var/www/iesvalledeljerte3/iesvalledeljerte3.asc

A continuación creamos un fichero donde vamos a definir las distribuciones con las que vamos a trabajar:

$ nano /var/www/iesvalledeljerte3/conf/distributions

Origin: IES Valle del Jerte
Label: Debian Squeeze packages
Suite: squeeze
Codename: squeeze
Architectures: i386 amd64
Components: main
Description: Paquetes adicionales para el IES
DebIndices: Packages Release . .gz .bz2
SignWith: 153F5386


Cuando tengamos todo lo anterior, entramos en el directorio del repositorio:

$ cd /var/www/iesvalledeljerte3

Y ejecutamos:

$ reprepro -VVV export

Al ejecutar el comando anterior, en alguna ocasión he tenido problemas con  la clave. Si tuviérais algún problema como yo, siempre podéis ejecutar el comando anterior con el parámetro --ask-passphrase:

$ reprepro --ask-passphrase -VVV export

A continuación creamos los enlaces simbólicos:

$ reprepro -VVV createsymlinks


Agregar paquetes binarios a nuestro repositorio
Para agregar paquetes binarios (.deb), nos situamos en la carpeta raíz del repositorio (siguiendo el ejemplo: /var/www/iesvalledeljerte3) y ejecutamos el siguiente comando:

$ reprepro --ask-passphrase includedeb [DISTRIBUCION] [PAQUETE]

Ejemplo:
$ reprepro --ask-passphrase includedeb squeeze /home/enam0000/Java-package/oracle-j2re1.7_1.7.0+update7_amd64.deb

$ reprepro --ask-passphrase includedeb squeeze /home/enam0000/Java-package/oracle-j2re1.7_1.7.0+update7_i386.deb

Nos preguntará por la frase de paso. La introducimos y al terminar incluirá nuestro paquete binario en el repositorio.


Eliminar paquetes binarios del repositorio
Eliminar un paquete de una rama de nuestro repositorio es sencillo:

$ reprepro --ask-passphrase remove [DISTRIBUCION] [PAQUETE]

Ejemplo:
$ reprepro --ask-passphrase remove squeeze oracle-j2re1.7


Usar el repositorio en nuestros clientes
Una vez hecho todo lo anterior, ya podemos usar el repositorio en nuestros clientes.

Creamos un archivo en el cliente para nuestro repositorio:

# nano /etc/apt/sources.list.d/iesvalledeljerte3.list

Con el siguiente contenido:

deb http://servidor/repositorio [DISTRIBUCIÓN] [COMPONENTES]

Siguiendo con el ejemplo en distribución especificamos squeeze, tal y como indicamos en el archivo de configuración /var/www/iesvalledeljerte3/conf/distributions y como componentes main (no hemos creado otro).

deb http://servidor/iesvalledeljerte3 squeeze main

Seguidamente descargamos la clave pública de nuestro repositorio, que ya subimos al servidor en el cliente y la añadimos mediante apt-key:

# wget http://servidor/iesvalledeljerte3.asc
# apt-key add iesvalledeljerte3.asc

Por último, haremos un apt-get update en el cliente para actualizar la lista de paquetes y ya podremos instalar lo que queramos desde nuestro repositorio.


Listar los paquetes disponibles en nuestro repositorio
Si queremos ver la lista de paquetes que tenemos agregados en nuestro repositorio, tan sólo tenemos que ejecutar:

# reprepro list "rama-de-repositorio"

Por ejemplo: Si quiero ver los paquetes que tengo en la rama squeeze de mi repositorio, ejecuto el siguiente comando:

# reprepro list squeeze

Y obtendré una lista en la que puedo ver los paquetes, la sección en la que están incluidos y la arquitectura:

squeeze|main|i386: firefox 18.0-2
squeeze|main|i386: iceweasel 17.0-1~bpo60+1
squeeze|main|i386: iceweasel-l10n-es-es 1:17.0-1~bpo60+1
squeeze|main|i386: java-package 0.51~exp1
squeeze|main|i386: nixnote 1.4
squeeze|main|i386: oracle-java7-jre 7.11
squeeze|main|i386: pkg-mozilla-archive-keyring 1.1
squeeze|main|i386: skype 4.0.0.7-1
squeeze|main|i386: xulrunner-17.0 17.0-1~bpo60+1
squeeze|main|amd64: firefox 18.0-2
squeeze|main|amd64: iceweasel-l10n-es-es 1:17.0-1~bpo60+1
squeeze|main|amd64: java-package 0.51~exp1
squeeze|main|amd64: libsqlite3-0 3.7.13-1~bpo60+1
squeeze|main|amd64: nixnote 1.4
squeeze|main|amd64: oracle-java7-jre 7.11
squeeze|main|amd64: pkg-mozilla-archive-keyring 1.1



Agregar paquetes sin sección o prioridad a nuestro repositorio
A veces queremos añadir ciertos paquetes a nuestro repositorio y éstos carecen de información de sección a la que pertenecen o prioridad, por ejemplo. O incluso, puede que tengan dicha información pero queremos cambiarla.

Para especificar la sección a la que queremos añadir un paquete, usamos el parámetro -S o --section. Por ejemplo: Imaginemos que quiero añadir los paquetes de libreoffice descargados de la web oficial de LibreOffice, que carecen de información de sección:

# reprepro --ask-passphrase -S main includedeb squeeze /var/www/descargas/libreoffice4/*.deb

Y si además, quiero cambiar la prioridad, usaré el parámetro -P o --priority. Por ejemplo: Imaginemos que, además de cambiar la sección quiero asignar una prioridad de 600 a los paquetes que voy a añadir a mi repositorio. No tendría más que hacer lo siguiente:

# reprepro --ask-passphrase -S main -P 600 includedeb squeeze /var/www/descargas/libreoffice4/*.deb


5 comentarios:

michel dijo...

Es perfecto, lo unico que me he tenido que poner como usuario root porque con el sudo no era suficiente por los derechos sobre ficheros.

Anónimo dijo...

Muy interesante.

Tengo una duda. En reprepro, como se generan los directorios como "squeeze/main/Contents-amd64.diff/Index/" con sus ficheros?

Esteban M. Navas Martín dijo...

La estructura del directorio la genera reprepro automáticamente.

Ark74 dijo...

Muy bien explicado ;)

Gracias por la información!
Saludos

Pedro Weinzettel dijo...

Muy bueno el tuto... me fue de mucha utilidad!

Con lo unico que me encontre, fue con lo siguiente, que lo agrego por si a alguien mas le pasa...

Si en el proceso de generacion de clave nos aparece:
Not enough random bytes available. Please do some other work to give
the OS a chance to collect more entropy! (Need 284 more bytes)

pueden verificar los random bytes disponibles en:
cat /proc/sys/kernel/random/entropy_avail

en caso de ser muy pocos (dependiendo de la carga del server) pueden generarlos con:
apt-get install rng-tools
rngd -r /dev/urandom

Saludos y nuevamente gracias por el tuto!