Crear un repositorio de Raspbian
Si quieres alojar tu propio repositorio de Raspbian, este artículo es para ti.
Un repositorio de Raspbian consiste en una estructura especial de directorios en un servidor web. Los archivos, incluyendo los paquetes, son todos estáticos - por lo tanto, este repositorio también podría ser simplemente alojado en una instancia de Amazon S3, por ejemplo.
La entrada sources.list en Raspbian
/etc/apt/sources.list
deb http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi
/etc/apt/sources.list.d/raspi.list
deb http://archive.raspberrypi.org/debian/ estirar la ui principal
Estas son las entradas por defecto para los repositorios de paquetes en Raspbian.
La estructura es la siguiente:
- deb : fuente de los paquetes binarios
- http://raspbian.raspberrypi.org/raspbian/ : URL del repositorio
- stretch : la "distribución" / versión / nombre en clave (en algunos casos también es posible especificar subdirectorios anidados a mayor profundidad, por ejemplo, stretch/updates)
- main contrib non-free rpi : los componentes que le interesan de este repositorio, separados por un espacio
NB: apt a partir de Debian / Raspbian Stretch incluye soporte para https por defecto. De lo contrario, tendría que instalar el paquete apt-transport-https;
Aquí hay una página web que explica por qué no es necesario https para la instalación de paquetes.
Una estructura de directorios del repositorio
Echa un vistazo a la http://raspbian.raspberrypi.org/ estructura de directorios del repositorio:
http://raspbian.raspberrypi.org/
Este directorio principal contiene varios subdirectorios, y en particular el raspbian.public.key
Algunos de los subdirectorios son para fines diversos, por ejemplo, imágenes - no es necesario para un repositorio normal de Debian / Raspbian Raspberry Pi.
En este sentido, son interesantes los
- mate
- raspbian
y los ya mencionados raspbian.public.key.
La clave es un archivo de texto, generado por GnuPG. Así es como se ve:
etc.
Esta clave es necesaria para verificar que realmente se está comunicando con el repositorio correcto, que dice ser. Si confía en el repositorio, añada la clave a su llavero apt (vea las instrucciones para añadir su propia clave e instalar paquetes desde su propio repositorio nuevo más abajo).
Entonces puede ser utilizado por apt para verificar las firmas de los metadatos del repositorio APT. Los paquetes en sí no suelen estar firmados por GPG / no se verifican. Consulte el artículo de packagecloud para más detalles.
Repositorios como subcarpetas
mate y raspbian son dos repositorios diferentes (para la Raspberry Pi en este caso).
Tenga en cuenta: aptly - la herramienta para publicar su propio repositorio que se explica a continuación - se dirigirá por defecto al webroot, y mostrará la carpeta dists en el webroot, pero también puede especificar una ruta para publicar bajo.
Veremos la carpeta raspbian, que para nuestros propósitos es uno de esos repositorios:
La carpeta dists contiene las versiones / distribuciones de Raspbian - con nombre en código en sincronía con las versiones de Debian. La actual estable - a partir de la 2.4.2019 - es Estirar.
Llevan el nombre de los personajes de Toy Story. El próximo lanzamiento es Buster.
"estable" es idéntico a "stretch" (actualmente). Apuntará a la versión estable más reciente.
Este directorio contiene varios archivos necesarios para el funcionamiento de las herramientas apt. En particular, los archivos InRelease, Release y Release.gpg.
- InRelease: firmado en línea
- Release - va junto con Release.gpg (firma)
estos archivos enumeran los archivos de índice de la distribución y sus hashes.
...
un ejemplo de archivo InRelease, con la firma inline en la parte inferior.
Es como una especie de mapa para apt - donde se pueden encontrar los archivos del listado de paquetes, y en qué formatos (siendo .gz y .xz los formatos comprimidos) se pueden descargar.
Aquí viven los metadatos de los paquetes. El archivo Paquetes es legible para los humanos (pero muy largo).
En particular, este archivo contiene un enlace a la "piscina", para el paquete real.
Nombre de archivo: pool/rpi/g/gst-omx1.0/gstreamer1.0-omx_1.0.0.1-0+rpi12+jessiepmg_armhf.deb
rpi es el nombre del componente, y los paquetes se dividen además por la primera letra.
el piscina se utiliza para evitar la duplicación de paquetes.
Mira este sitio informativo para más información sobre el formato de repositorio de Debian:
https://wiki.debian.org/DebianRepository/Format
Usando aptly - publicando su propio repositorio, con sus propios paquetes
Aptly es una herramienta para configurar y publicar fácilmente su propio repositorio .deb - para Debian y sus hermanos y primos.
Esto incluye Ubuntu, pero por supuesto también Raspbian.
Así que, si quieres publicar un repositorio de Raspbian, esta es la forma de hacerlo.
Configurar un contenedor Docker
He creado un contenedor Docker, basado en este repositorio git:
https://github.com/urpylka/docker-aptly
cambios que he introducido:
- DE ubuntu:bionic
- gnupg1
- gpgv1
- El comando gpg se ejecuta explícitamente como gpg1 (de lo contrario, las claves públicas y privadas se guardarán de forma diferente, y todo no funcionará como se espera)
Por lo tanto, habrá algunas explicaciones adicionales a continuación. En general, el script de urpylka es un punto de partida muy conveniente, si desea ejecutar en Docker.
Además, te recomiendo encarecidamente que utilices docker-compose, en lugar de ejecutar esos largos comandos docker run manualmente.
Aquí está mi dockerfile para su referencia
# Copyright 2019 Maximilian Batz
# Copyright 2018 Artem B. Smirnov
# Copyright 2018 Jon Azpiazu
# Copyright 2016 Bryan J. Hong
#
# Licenciado bajo la Licencia Apache, Versión 2.0 (la "Licencia");
# no puede utilizar este archivo salvo en cumplimiento de la Licencia.
# Puede obtener una copia de la licencia en
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Salvo que lo exija la legislación aplicable o se acuerde por escrito, el software
# distribuido bajo la Licencia se distribuye sobre una base "tal cual",
# SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.
# Consulte la Licencia para conocer el lenguaje específico que rige los permisos y
# limitaciones bajo la Licencia.DE ubuntu:bionic
LABEL maintainer=""
ENV DEBIAN_FRONTEND noninteractive
Ejecutar apt-get -q update \ ~ -
&& apt-get -y install \N - \N - ud.
gnupg1 && apt-key adv -keyserver pool.sks-keyservers.net -recv-keys ED75B5A4483DA07C \N - apt-key adv.
&& echo "deb http://repo.aptly.info/ squeeze main" >> /etc/apt/sources.list# Actualizar el repositorio APT e instalar los paquetes
Ejecutar apt-get -q update \ ~ -
&& apt-get -y install \N - \N - ud.
aptly=1.3.0 \N - aptly=1.3.0
bzip2 \N - bzip2
gpgv1 \N - gpgv1 \N - gpgv1 \N - gpgv1
graphviz \ ~ -
Supervisor
nginx \ ~ -
wget \ ~ - wget \ ~ -
xz-utils \N - para los que no tienen acceso a la información.
apt-utils \N - para la gestión de los recursos humanos.
&& apt-get clean \N -
&& rm -rf /var/lib/apt/lists/*# Instalar Configuración Apta
COPIAR assets/aptly.conf /etc/aptly.conf# Instalar scripts
COPIAR activos/*.sh /opt/# Instalar Nginx Config
RUN rm /etc/nginx/sites-enabled/*
COPY assets/supervisord.nginx.conf /etc/supervisor/conf.d/nginx.conf
RUN echo "daemon off;" >> /etc/nginx/nginx.conf# Ubicación del montaje de la fijación
VOLUMEN ["/opt/aptly" ]# Ejecutar la secuencia de comandos de inicio cuando el contenedor se inicia
ENTRYPOINT [ "/opt/startup.sh" ]
Tenga en cuenta que, a partir del 2.4.2019, aptly 1.3.0 sigue siendo la versión más reciente.
Conectando con el contenedor apto
docker exec -it aptly /bin/bash
Su contenedor, que en este caso se llama así, abre un terminal interactivo con /bin/bash. Todos los demás comandos se ejecutan dentro del contenedor.
Generación de las claves GPG
El script de docker mencionado anteriormente crea automáticamente las claves GPG por ti, pasando tu frase de paso a un archivo en el contenedor. El fragmento de script relevante es este:
¡#! /usr/bin/env bash
# Copyright 2016 Bryan J. Hong
# Licencia bajo la Licencia Apache, Versión 2.0cat < /opt/gpg_batch
%echo Generating a GPG key, might take a while
Tipo de clave: RSA
Longitud de la clave: 4096
Tipo de subclave: ELG-E
Longitud de subclave: 1024
Nombre-Real: ${FULL_NAME}
Nombre-Comentario: Aptly Repo Signing
Nombre-Email: ${EMAIL_ADDRESS}
Fecha de caducidad: 0
Frase de acceso: ${GPG_PASSWORD}
%pubring /opt/aptly/aptly.pub
%secring /opt/aptly/aptly.sec
%commit
%echo done
EOF
Se ejecuta si las claves no existen, desde el punto de entrada del contenedor:
# Si el par de claves GPG del repositorio no existe, créelo.
si [[ ! -f /opt/aptly/aptly.sec ]] || [[ ! -f /opt/aptly/aptly.pub ]]; entonces
echo "Generando nuevas claves gpg"
cp -a /dev/urandom /dev/random
/opt/gpg_batch.sh
# Si su sistema no tiene mucha entropía esto puede, tomar mucho tiempo
# Google cómo crear entropía "artificial" si esto se atasca
gpg1 -batch -gen-key /opt/gpg_batch
si no
echo "No es necesario generar nuevas claves gpg"
fi
Tenga en cuenta mi versión "mejorada" (gpg1 en lugar de especificar sólo gpg) - esto parece ser necesario para Ubuntu bionic beaver, ya que de lo contrario obtendrá gpg 2 por defecto.
Nota: ¡este archivo contendrá su frase de acceso! Por lo tanto, le recomiendo que lo elimine después de que la configuración inicial se haya completado.
Desafortunadamente, gpg1 no parece soportar el control de la frase de paso %ask. Por lo tanto, si quiere generar las claves por lotes, la contraseña de la clave debe estar en el archivo por lotes.
Publicar / exportar la clave pública GPG
mkdir -p /opt/aptly/public
gpg1 -export -armor > /opt/aptly/public/repository.picockpit.key
nombre la clave de forma adecuada. -armor se utiliza para exportar la clave en formato ASCII (en lugar de binario).
Tenga en cuenta que son dos guiones, espero que WordPress no los destruya. Además, aquí se utiliza gpg1 en lugar de sólo gpg
Crear un nuevo repositorio
aptly repo create -comment="Repositorio picockpit.com" -component="main" -distribution="stretch" pcp-repository
Crea un nuevo repositorio local, en el que puede añadir paquetes. Este repositorio aún no está publicado.
-comment : texto para describir el repositorio local
-componente: componente por defecto al publicar
-distribution: distribución por defecto (release) al publicar
pcp-repository: este es un nombre personalizado que le he dado a este repositorio local, puede usar el suyo aquí. Asegúrese de modificar los otros comandos en consecuencia y utilice el nombre que elija aquí.
Añadir paquetes .deb al repositorio
aptly repo add pcp-repository /opt/aptly/testpackage/
Aquí estoy añadiendo una carpeta de paquetes al repositorio local que creé en el paso anterior. aptly reconocerá los paquetes añadidos, así:
Crear instantánea
Aunque es posible publicar un repositorio directamente, se recomienda encarecidamente crear una instantánea y publicarla.
aptly snapshot create pcp-snapshot from repo pcp-repository
pcp-snapshot es un nombre personalizado, y pcp-repository el nombre que le diste al repositorio más arriba.
Publicar instantánea
aptly publish snapshot pcp-snapshot
Durante la publicación de la instantánea, se le pedirá su frase de contraseña gpg dos veces:
aptly publicará en el directorio /opt/aptly/public, que Nginx u otro servidor web de su elección servirá. No es necesario
Consulte también esta documentación:
Cambiar el repositorio publicado
Si ha cometido un error, y quiere cambiar el repositorio publicado por una instantánea diferente, puede utilizar aptly publish switch:
aptly publish switch stretch raspbian pcp-snapshot
Esto cambiará la distribución stretch, bajo la ruta raspbian, con la nueva instantánea pcp-snapshot.
Añadir su repositorio a un sistema
Importar la llave
curl -L http://192.168.1.2:3200/repository.picockpit.key | sudo apt-key add -
El comando obtiene la clave usando curl, y luego la pasa a apt-key. También hay una funcionalidad de obtención de claves de apt-key, pero depende de un paquete que no está instalado en Raspbian por defecto.
Si no lo hace, apt no podrá obtener los paquetes del nuevo repositorio y arrojará errores.
Añadir el repositorio
echo "deb http://192.168.1.2:3200/raspbian stretch main" | sudo tee -append /etc/apt/sources.list.d/picockpit.list
El subdirectorio bajo /etc/apt/sources.list.d sólo puede ser escrito por el usuario root. la opción -append asegura que el archivo no se sobrescriba, si es que ya existe.
También sería posible crear el archivo manualmente y, por ejemplo, usando nano, añadir la línea
deb http://192.168.1.2:3200/raspbian estiramiento principal
Instalar paquetes
sudo apt-get update
sudo apt-get install nombre del paquete
Esta captura de pantalla muestra que apt también está leyendo el nuevo repositorio.
instalar un paquete de muestra.
Creación de un paquete
Te remito a este excelente artículo sobre cómo crear un paquete Debian.
Sólo asegúrese de cambiar Arquitectura a armhf para la plataforma Raspberry Pi.
¿Necesita apoyo profesional?
Actualmente cobramos una tarifa plana de 1500 € diarios (+ impuestos). Estaremos encantados de ayudarte 🙂 .
Más información
- https://blog.packagecloud.io/eng/2014/10/28/howto-gpg-sign-verify-deb-packages-apt-repositories/
- https://wiki.debian.org/DebianRepository/Format
- https://github.com/urpylka/docker-aptly
Sobre los paquetes: