You are not logged in.
En esta sección vamos a ver cómo construir nuestro propio repositorio de paquetes debian, el cual será utilizado posteriormente por debootstrap en el live-sdk.
He ahí un ejemplo de repositorio construído con amprolla:
deb http://packages.gnuinos.org/merged jessie main
deb-src http://packages.gnuinos.org/merged jessie main
Lo primero de todo, vamos a instalar el servidor HTTP Apache (otra opción será Nginx, ver más abajo):
# apt-get install apache2
El documento raíz por defecto en debian es /var/www/html. Podemos generar nuestros propios alojamientos virtuales en /var/www. Si abrimos el navegador y teclamos "localhost" o "127.0.0.1", nos aparecerá la página por defecto de apache2 en debian:
Ya tenemos apache instalado y funcionando en el sistema. Supongamos ahora que tenemos un conjunto de paquetes que queremos añadir a nuestro proyecto de repositorio. Algunos serán trabajos nuestros o ajenos no incluídos en el repositorio de devuan; otros, por el contrario, serán paquetes ya existentes en devuan. Se tratará de paquetes que han sufrido modificaciones y cuyo objetivo es sustituir a los propios de devuan, tal y como devuan hace con debian.
Para fijar ideas y poder poner un ejemplo práctico, he colgado un archivo comprimido conteniendo algunos paquetes ya preparados.
Lo descargamos y descomprimimos:
$ wget http://gnuinos.org/packages.tar.gz
$ tar -xzvf packages.tar.gz
Como podréis ver, la carpeta contiene dos proyectos distintos: por un lado está el kernel linux-libre-4.9.103 descargado del repositorio de la ::[FSFLA]:: y empaquetado para devuan; por otro, el intramfs-tools con algunos cambios que lo hacen compatible con vdev.
Instalemos la herramienta reprepro:
# apt-get install reprepro
Antes de utilizar esta herramienta, vamos a generar una llave gpg con la que poder firmar el repositorio. Para ello instalamos el siguiente paquete:
# apt-get install gnupg2
y generamos la llave (también podemos hacer gpg2 --key-gen):
# gpg --gen-key
gpg (GnuPG) 1.4.18; Copyright (C) 2014 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
gpg: directory `/root/.gnupg' created
gpg: new configuration file `/root/.gnupg/gpg.conf' created
gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: keyring `/root/.gnupg/pubring.gpg' created
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection?
Hay opciones que sólo permiten firmar y opciones que permiten firmar y cifrar. Elegiremos la opción por defecto RSA.
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Las llaves RSA pueden medir entre 1024 y 4096 bits, y nos pide el tamaño. Esto es de libre elección. Escogeremos el tamaño por defecto 2048.
Lo siguientes pasos son triviales. Nos pregunta si queremos que la validez de la clave expire pasado un tiempo y cuándo:
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
También nos pide el nombre, una dirección de correo, un comentario y la contraseña. En el momento de generar la clave nos pedirá también que hagamos cosas para aumentar la entropía (desorden) del sistema.
Ahora debemos exportar la parte privada de la llave:
# gpg --output private_key.asc --armor --export-secret-key email@email.com
y también la parte pública:
# gpg -a --export email@email.com > public_key.asc
usando el email proporcionado durante la generación de la llave.
Para poder firmar, importamos la clave secreta:
# gpg --allow-secret-key-import --import private_key.asc
Hecho lo cual, y ubicados en el directorio de trabajo en el que hemos descomprimido la carpeta "packages", ejecutamos el siguiente script (sustituid ascii por la rama en cuestión para el caso de jessie o beowulf, y 64CF1949 por la parte pública de vuestra llave gpg):
#!/bin/sh
rm -rf conf
rm -rf db
rm -rf dists
rm -rf pool
mkdir confl
echo \
"Origin: Devuan
Label: Devuan Ascii packages
Codename: ascii
Architectures: i386 amd64 source
Components: main
UDebComponents: main
Description: Additional packages for Devuan
DebIndices: Packages Release . .gz
UDebIndices: Packages Release . .gz
DscIndices: Sources Release .gz .bz2
Contents: . .gz .bz2" > ./conf/distributions
find ./packages -name "*.deb" -exec reprepro --ask-passphrase -b . -V -C main includedeb ascii {} \;
find ./packages -name "*.udeb" -exec reprepro --ask-passphrase -b . -V -C main includeudeb ascii {} \;
echo \
"SignWith: 64CF1949" >> ./conf/distributions
find ./packages -name "*.dsc" -exec reprepro --ask-passphrase -b . -V -C main includedsc ascii {} \;
exit 0
Llegados a este punto, hay que aclarar que reprepro no es compatible con el formato fuente git, frecuentemente utilizado en devuan, pero no aprobado oficialmente en debian.
El script de arriba generará las carpetas ./dist y ./pool del repositorio. Al finalizar nos pedirá la contraseña de nuestra firma gpg. Posteriormente copiaremos las dos carpetas generadas (y también la parte pública de nuestra llave gpg) en el directorio /var/www/html/packages, al que previamente damos permisos (www-data es el usuario por defecto para servidores webs):
# mkdir -p /var/www/html/packages
# mkdir -p /var/www/html/packages/gnuinos
# chown www-data:www-data /var/www/html/packages
# chmod 0700 /var/www/html/packages
# mv ./dists /var/www/html/packages/gnuinos/
# mv ./pool /var/www/html/packages/gnuinos/
# mv public_key.asc /var/www/html/packages/
Ya tenemos un pequeño repositorio local de paquetes debian conteniendo el kernel y las herramientas initramfs, algo que podemos comprobar añadiendo las siguientes líneas en el /etc/apt/sources.list :
deb http://localhost/packages/gnuinos ascii main
deb-src http://localhost/packages/gnuinos ascii main
Ahora lo que pretendemos es fusionarlo (merge) con el repositorio de devuan, y es aquí donde entra en juego amprolla.
Es importante entender que, así como el initramfs-tools sustituirá al ya existente en el repositorio de devuan, no ocurrirá lo mismo con el kernel. Esto se debe al hecho de que APT (y, por ende, también amprolla) considerará los paquetes linux-image-4.9.0-6-686 y linux-image-4.9.0-7-686 por separado, ya que tienen diferentes nombres. Lo mismo sucederá con las cabeceras y demás. Así pues, si queremos eliminar aquellos paquetes del kernel provenientes de debian/devuan deberemos hacer pinning de APT. Más adelante nos ocuparemos de esto.
Antes de empezar a trabajar con amprolla veremos como configurar nginx -pronunciado en inglés engine X-, el servidor web ligero de alto rendimiento utilizardo por devuan en sus repositorios. Instalamos su paquete .deb:
# apt-get install nginx
Paramos el servicio de apache:
# service apache2 stop
Ahora abrimos el navegador y tecleamos "localhost" viendo la página por defecto de nginx:
En el archivo de configuración de nginx /etcv/nginx/sites-available/default hay una línea:
root /var/www/html;
que indica que la página que solicita nginx por defecto es también la solicitada por apache, por lo que el pequeño repositorio apt ubicado ahí va a seguir siendo reconocido.
Para terminar con nginx, vamos a dejar su archivo de configuración como sigue:
server {
listen 80 default_server;gpg2 --key-gen
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
server_tokens off;
access_log /var/log/nginx/repository.votre-serveur.com_access.log;
error_log /var/log/nginx/repository.votre-serveur.com_error.log;
default_type "text/plain";
try_files $uri/ $uri /index.html;
location / {
autoindex on;
}
}
y recargamos el servicio:
# /etc/init.d/nginx reload
El módulo Autoindex permite a nginx listar/ocultar el contenido de los directorios:
Es el análogo a:
<Directory /var/www/html>
Options +Indexes
</Directory>
del htaccess de apache. Y nada más por el momento en cuanto a nginx...
Sin más preámbulos, pasemos ya al asunto que nos ocupa en este apartado: amprolla !
Amprolla es una herramienta que fusiona distintos repositorios apt en un único repositorio. Básicamente consiste en un ordenador intermedio o proxy que contiene un repositorio local y que concentra al vuelo (es decir, en tiempo real) el contenido de este repositorio local con otros repositorios externos.
Escrita en python, su primera versión fue desarrollada por Franco Lanza "Nextime", y, a pesar de que no se comportara del todo bien en términos de velocidad, jugó un papel fundamental dentro de la infraestructura de devuan jessie. En cuanto a su segunda versión, ésta nunca vio la luz. Es por ello que Iván J. "Parazyd" reescribió amprolla con miras a devuan ascii y posteriores:
https://github.com/parazyd/amprolla
Creamos nuestro directorio de trabajo y entramos en él:
$ mkdir amprolla
$cd amprolla
Para simplificar las cosas, en lugar del repositorio de parazyd clonaremos esta otra versión modificada:
$ git clone https://git.devuan.org/aitor_czr/amprolla.git
Luego hablaremos de las pequeñas diferencias entre ambas. Entramos en el repositorio local:
$ cd amprolla
Estamos ubicados en /home/user/amprolla/amprolla. Prestad atención al archivo de configuración lib/config.py y dejádlo de la siguiente manera:
# See LICENSE file for copyright and license details.
"""
amprolla configuration file
"""
from hashlib import sha256
cpunm = 2 # number of cpus you want to use for multiprocessing
logdir = '/home/aitor/amprolla/log'
spooldir = '/home/aitor/amprolla/spool'
gpgdir = '/home/aitor/amprolla/gnupg'
mergedir = '/home/aitor/amprolla/merged-volatile'
signingkey = '720BBF6B51F3883F847066E665BB7901DAB59DE1'
signrelease = False
mergesubdir = 'dists'
lockpath = '/run/lock/amprolla.lock'
banpkgs = {'systemd', 'systemd-sysv', 'file-rc'}
checksums = [
{'name': 'SHA256', 'f': sha256},
]
distrolabel = 'Gnuinos'
repo_order = ['gnuinos', 'devuan', 'debian-security', 'debian']
# used for a hacky way to skip certain suites when crawling Debian
skips = ['ascii-security']
repos = {
'gnuinos': {
'name': 'GNUINOS',
'host': 'http://localhost/packages',
'dists': 'gnuinos/dists',
'pool': 'pool',
'aliases': False,
'skipmissing': False,
},
'devuan': {
'name': 'DEVUAN',
'host': 'http://deb.devuan.org',
'dists': 'devuan/dists',
'pool': 'devuan/pool',
'aliases': False,
'skipmissing': False,
},
'debian-security': {
'name': 'DEBIAN-SECURITY',
'host': 'http://security.debian.org',
'dists': 'dists',
'pool': 'pool',
'aliases': True,
'skipmissing': True,
},
'debian': {
'name': 'DEBIAN',
'host': 'http://deb.debian.org',
'dists': 'debian/dists',
'pool': 'debian/pool',
'aliases': True,
'skipmissing': False,
},
}
suites = {
'ascii': [
'ascii',
],
}
aliases = {
'DEBIAN-SECURITY': {
'ascii-security': 'stretch/updates',
},
'DEBIAN': {
'ascii': 'stretch',
'ascii-backports': 'stretch-backports',
'ascii-proposed-updates': 'stretch-proposed-updates',
'ascii-updates': 'stretch-updates',
},
}
release_aliases = {
'ascii': {
'Suite': 'testing',
'Codename': 'ascii',
'Version': '2.0',
},
'ascii-backports': {
'Suite': 'testing-backports',
'Codename': 'ascii-backports',
'Origin': 'Devuan Backports',
'Label': 'Devuan Backports',
},
'ascii-proposed-updates': {
'Suite': 'testing-proposed-updates',
'Codename': 'ascii-proposed-updates',
},
'ascii-security': {
'Suite': 'testing-security',
'Codename': 'ascii-security',
'Label': 'Devuan-Security',
},
'ascii-updates': {
'Suite': 'testing-updates',
'Codename': 'ascii-updates',
},
}
categories = ['main']
arches = [
'source',
'binary-all',
'binary-amd64',
'binary-i386',
]
mainrepofiles = [
'InRelease',
'Release',
'Release.gpg',
]
pkgfiles = [
'Packages',
'Packages.gz',
'Packages.xz',
'Release',
]
srcfiles = [
'Sources',
'Sources.gz',
'Sources.xz',
'Release',
]
release_keys = [
'Label',
'Suite',
'Version',
'Codename',
'Date',
'Valid-Until',
'Architectures',
'Components',
'Description',
'NotAutomatic',
'ButAutomaticUpgrades',
]
packages_keys = [
'Package',
'Version',
'Kernel-Version',
'Installer-Menu-Item',
'Essential',
'Installed-Size',
'Maintainer',
'Architecture',
'Replaces',
'Provides',
'Depends',
'Conflicts',
'Pre-Depends',
'Breaks',
'Homepage',
'Apport',
'Auto-Built-Package',
'Build-Ids',
'Origin',
'Bugs',
'Built-Using',
'Enhances',
'Recommends',
'Description',
'Description-md5',
'Ghc-Package',
'Gstreamer-Decoders',
'Gstreamer-Elements',
'Gstreamer-Encoders',
'Gstreamer-Uri-Sinks',
'Gstreamer-Uri-Sources',
'Gstreamer-Version',
'Lua-Versions',
'Modaliases',
'Npp-Applications',
'Npp-Description',
'Npp-File',
'Npp-Mimetype',
'Npp-Name',
'Original-Maintainer',
'Original-Source-Maintainer',
'Package-Type',
'Postgresql-Version',
'Python-Version',
'Python-Versions',
'Ruby-Versions',
'Source',
'Suggests',
'Xul-Appid',
'Multi-Arch',
'Build-Essential',
'Tag',
'Section',
'Priority',
'Filename',
'Size',
'MD5sum',
'SHA1',
'SHA256',
]
sources_keys = [
'Package',
'Binary',
'Version',
'Maintainer',
'Uploaders',
'Build-Depends',
'Architecture',
'Standards-Version',
'Format',
'Files',
'Vcs-Browser',
'Vcs-Svn',
'Checksums-Sha1',
'Checksums-Sha256',
'Homepage',
'Package-List',
'Directory',
'Priority',
'Section',
'Vcs-Git',
'Dm-Upload-Allowed',
'Build-Conflicts',
'Testsuite',
'Build-Depends-Indep',
'Vcs-Bzr',
'Vcs-Mtn',
'Vcs-Hg',
'Ruby-Versions',
'Dgit',
'Vcs-Darcs',
'Extra-Source-Only',
'Python-Version',
'Testsuite-Triggers',
'Autobuild',
'Build-Conflicts-Indep',
'Vcs-Cvs',
'Comment',
'Origin',
'Vcs-Arch',
'Original-Maintainer',
'Python3-Version',
]
Analicemos su contenido por partes. En la líneas:
logdir = '/home/aitor/amprolla/log'
spooldir = '/home/aitor/amprolla/spool'
gpgdir = '/home/aitor/amprolla/gnupg'
mergedir = '/home/aitor/amprolla/merged-volatile'
debéis cambiar la ubicación y dejarla acorde a vuestro directorio personal. He eliminado la opción de firma:
signingkey = '720BBF6B51F3883F847066E665BB7901DAB59DE1'
signrelease = False
De momento lo dejaremos así y firmaremos el repositorio manualmente en una operación aparte. Me ha pasado que APT no reconocía la firma del repositorio usando gpg en lugar de gpg2. ¿Tal vez dependa también de cuál de las dos hayamos utilizado a la hora de generarla? Le dedicaré mi tiempo.
El resto de las opciones podéis configurarlas a vuestro gusto. Cambiar el distrolabel por otro e incluso añadir un nombre más en el repo_order si queréis basarla gnuinos.
Ejecutamos el script:
$ python3 amprolla_init.py
Esto genera una carpeta /home/aitor/amprolla/spool con los índices del repositorio agrupados en tres categorías: debian, devuan y gnuinos. Así será como lo obtendremos si utilizamos debmirror con el repositorio generado por amprolla. Ante cualquier intento fallido habrá que borrar el /var/lock/amprolla.lock, antes de intentarlo de nuevo.
El siguiente paso será fusionar el triple repositorio en un único repositorio:
$ python3 amprolla_merge.py
lo que generará una carpeta /home/aitor/amprolla/merged-volatile. Dado que no hemos incluído paquetes de las secciones contrib y non-free, sustituiremos la línea:
Components: main contrib non-free
por esta otra:
Components: main
y, a continuación, firmamos el repositorio:
$ cd ../merged-volatile/dists/ascii
$ gpg2 -q --default-key 64CF1949 --yes --clearsign -a -o InRelease Release
y generar el Release.gpg para que la genta pueda comprobar la veracidad de la firma:
$ gpg2 -sb -o Release.gpg InRelease
Copiamos la carpeta dists en nuestro repositorio local:
# mkdir /var/www/html/packages/merged
# cp -a /home/aitor/amprolla/merged-volatile/dists /var/www/html/packages/merged
y modificamos el /etc/apt/sources.list:
deb http:://localhost/packages/merged ascii main
deb-src http:://localhost/packages/merged ascii main
Nos queda un último paso: redirigir las solicitudes del inexistente directorio /var/www/html/packages/merged/pool a sus sitios correspondientes. Para ello, configuramos el location del archivo de configuración de nginx /etc/nginx/sites-available/default tal que:
location / {
autoindex on;
rewrite /packages/merged/pool/DEVUAN/(.*) http://deb.devuan.org/devuan/pool/$1;
rewrite /packages/merged/pool/main/(.*) http://deb.devuan.org/merged/pool/DEBIAN/main/$1;
rewrite /packages/merged/pool/GNUINOS/(.*) http://localhost/packages/gnuinos/pool/$1;
}
Esto explica el pequeño misterio de amprolla de por qué el directorio merged/pool está vacío. Y en realidad, así es: ocurre es que los rewrite redireccionan las solicitudes del servidor a otros repositorios, ya sea debian, devuan o gnuinos.
Todo esto que hemos hecho en local, puede aplicarse a un hosting remoto cambiando el localhost por la url correspondiente. Si disponéis de un hosting compartido en el que no disponéis de permisos root, entonces no os será posible configurar nginx y tendréis que recurrir al servidor apache. Ése es mi caso en el repositorio de gnuinos.
La configuración del htaccess que ha funcionado con mi proveedor de hosting ha sido recurriendo a redireccionamientos 302, esto es:
RewriteEngine on
Redirect 302 /merged/pool/DEVUAN http://deb.devuan.org/devuan/pool
Redirect 302 /merged/pool/main http://deb.devuan.org/merged/pool/DEBIAN/main
Redirect 302 /merged/pool/GNUINOS http://packages.gnuinos.org/gnuinos/pool
Aunque puede que no sirva como regla general.
Y aquí finaliza mi pequeño tutorial de amprolla. Esto es todo, amigos :)
NOTA IMPORTANTE:
Al escribir esta guía he notado un bug en el "amprolla_init.py", y es que los paquetes del initramfs-tools, siendo de arquitectura "all" aparecen en ambos "binary-i386/Packages.gz" y "binary-amd64/Packages.gz" mientras que el binary-all no existe en "spool/gnuinos/dists/ascii/main/"
Le echaré un vistazo y trataré de corregirlo.
Last edited by aitor (2018-10-13 18:18:55)
If you work systematically, things will come by itself (Lev D. Landau)
Offline
I don't understand a single word son. This looks useful so I guess we need to find someone who can read Spanish to translate your guide?
Offline
I don't understand a single word son. This looks useful so I guess we need to find someone who can read Spanish to translate your guide?
[DNG] How to build your own distro: https://www.mail-archive.com/dng@lists. … 22608.html
Offline
@HextorBRX . . . see how useful the DNG mailing list is?
Offline
Hi HextorBRX,
I don't understand a single word son. This looks useful so I guess we need to find someone who can read Spanish to translate your guide?
which word? i'll write the improvements above onto the same post, comments will be written bellow. When i finish the tutorial, i'll try to translate it to english my best. But i'll need your help.
I started the tutorial with an example using Apache2 because it's the common solution in the case of shared hosting where no root permissions are available, but i'll also explain how to do the same using the nginx webserver.
Last edited by aitor (2018-10-08 18:51:35)
If you work systematically, things will come by itself (Lev D. Landau)
Offline
which word?
Don't mind me. I did not read your message in the DNG mailing list so I was wondering why you wrote the tutorial in Spanish.
I hope someone will help you with the translation. Your tutorial will give us a head start for sure.
Offline
I finished it.
It only remains how to patch other git repositories using the git-format-patch, and also how to do the pinning of apt in favour of linux-libre.
Last edited by aitor (2018-10-13 18:33:01)
If you work systematically, things will come by itself (Lev D. Landau)
Offline