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/

imagen

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:

imagen

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:

imagen

imagen

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.

imagen

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.

imagen

...

imagen

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.

imagen

Aquí viven los metadatos de los paquetes. El archivo Paquetes es legible para los humanos (pero muy largo).

imagen

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.

imagen

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.0

cat < /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í:

imagen

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:

imagen

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

imagen

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

imagen

Esta captura de pantalla muestra que apt también está leyendo el nuevo repositorio.

imagen

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?

Nos ganamos la vida con todo lo relacionado con Raspberry Pi. Póngase en contacto con nosotros si necesita ayuda profesional para su instalación.

Actualmente cobramos una tarifa plana de 1500 € diarios (+ impuestos). Estaremos encantados de ayudarte 🙂 .

Más información

Sobre los paquetes: