Creare un repository Raspbian

Se volete ospitare il vostro repository Raspbian, questo articolo è per voi.

Un repository Raspbian consiste in una speciale struttura di directory su un webserver. I file, compresi i pacchetti, sono tutti statici - quindi questo repository potrebbe anche essere semplicemente ospitato su un'istanza Amazon S3, per esempio.

La voce sources.list in 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/ allungare l'ui principale

Queste sono le voci predefinite per i repository dei pacchetti su Raspbian.

La struttura è la seguente:

  • deb : sorgente per i pacchetti binari
  • http://raspbian.raspberrypi.org/raspbian/ : URL del repository
  • stretch : la "distribuzione" / release / nome in codice (in alcuni casi è anche possibile specificare le sottodirectory annidate più in profondità, per esempio stretch/updates)
  • main contrib non-free rpi : i componenti che ti interessano da questo repository, separati da uno spazio

NB: apt a partire da Debian / Raspbian Stretch include il supporto per https di default. Altrimenti dovreste installare il pacchetto apt-transport-https;

Ecco una pagina web che spiega perché https non è necessario per l'installazione del pacchetto.

Una struttura di directory del repository

Date un'occhiata al http://raspbian.raspberrypi.org/ struttura di directory del repository:

http://raspbian.raspberrypi.org/

immagine

Questa directory principale contiene diverse sottodirectory, e in particolare la raspbian.public.key

Alcune delle sottodirectory sono per scopi vari, ad esempio immagini - non necessarie per un normale repository Debian / Raspbian Raspberry Pi.

Di interesse qui sono i

  • mate
  • raspbian

sottodirectory, e il già menzionato raspbian.public.key.

La chiave è un file di testo, generato da GnuPG. Ecco come appare:

immagine

ecc.

Questa chiave è necessaria per verificare che state effettivamente comunicando con il giusto repository, che afferma di essere. Se ti fidi del repository, aggiungi la chiave al tuo portachiavi apt (vedi le istruzioni su come aggiungere la tua chiave e installare i pacchetti dal tuo nuovo repository di seguito).

Poi può essere usato da apt per verificare le firme dei metadati del repository APT. I pacchetti stessi di solito non sono firmati GPG / non vengono verificati. Fare riferimento all'articolo di packagecloud per i dettagli.

Repository come sottocartelle

mate e raspbian sono due repository diversi (per il Raspberry Pi in questo caso).

Nota: aptly - lo strumento per pubblicare il proprio repository spiegato più avanti - sarà predefinito al webroot, e mostrerà la cartella dists nel webroot, ma è anche possibile specificare un percorso in cui pubblicare.

Guarderemo la cartella raspbian, che per i nostri scopi è uno di questi repository:

immagine

immagine

La cartella dists contiene i rilasci / distribuzioni di Raspbian - nome in codice in sincronia con i rilasci di Debian. L'attuale stabile - a partire dalla 2.4.2019 - è Stretch.

Hanno il nome dei personaggi di Toy Story. La prossima uscita è Buster.

"stabile"è identico a "stretch" (attualmente). Punterà al più recente rilascio stabile.

immagine

Questa directory contiene diversi file necessari per il funzionamento degli strumenti apt. In particolare i file InRelease, Release e Release.gpg.

  • InRelease: firmato in linea
  • Release - va insieme a Release.gpg (firma)

questi file elencano i file indice della distribuzione e i loro hash.

immagine

...

immagine

un file InRelease di esempio, con la firma inline in basso.

È come una specie di mappa per apt - dove si possono trovare i file dell'elenco dei pacchetti e in quali formati (i formati .gz e .xz sono compressi) possono essere scaricati.

immagine

Qui vivono i metadati per i pacchetti. Il file Packages è leggibile all'uomo (ma molto lungo).

immagine

in particolare questo file contiene un link al "pool", per il pacchetto vero e proprio.

Nome del file: pool/rpi/g/gst-omx1.0/gstreamer1.0-omx_1.0.0.1-0+rpi12+jessiepmg_armhf.deb
rpi è il nome del componente, e i pacchetti sono ulteriormente suddivisi per prima lettera.

immagine

il piscina è usato per evitare la duplicazione dei pacchetti.

Guarda questo sito informativo per maggiori informazioni sul Debian Repository Format:

https://wiki.debian.org/DebianRepository/Format

Usare aptly - pubblicare il proprio repository, con i propri pacchetti

Aptly è uno strumento per impostare e pubblicare facilmente il proprio repository .deb - per Debian e i suoi fratelli e cugini.

Questo include Ubuntu, ma naturalmente anche Raspbian.

Quindi, se volete pubblicare un repository Raspbian, questo è il modo per farlo.

Impostare un contenitore Docker

Ho creato un contenitore Docker, basato su questo repository git:

https://github.com/urpylka/docker-aptly

cambiamenti che ho introdotto:

  • Da ubuntu:bionic
  • gnupg1
  • gpgv1
  • comando gpg eseguito esplicitamente come gpg1 (altrimenti le chiavi pubbliche e private saranno salvate in modo diverso, e tutto non funzionerà come previsto)

Pertanto ci saranno alcune spiegazioni aggiuntive di seguito. Nel complesso lo script di urpylka è un punto di partenza molto conveniente, se si desidera eseguire su Docker.

Inoltre, vi consiglio vivamente di usare docker-compose, invece di eseguire quei lunghi comandi docker run manualmente.

Ecco il mio dockerfile per il vostro riferimento

# Copyright 2019 Maximilian Batz
# Copyright 2018 Artem B. Smirnov
# Copyright 2018 Jon Azpiazu
# Copyright 2016 Bryan J. Hong
#
# Licenziato sotto la Licenza Apache, Versione 2.0 (la "Licenza");
# non puoi usare questo file se non in conformità con la licenza.
# È possibile ottenere una copia della licenza presso
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# A meno che non sia richiesto dalla legge applicabile o concordato per iscritto, il software
# distribuito sotto questa licenza è distribuito "COSÌ COM'È",
# SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, espresse o implicite.
# Vedere la licenza per il linguaggio specifico che regola i permessi e
# limitazioni della licenza.

Da ubuntu:bionic

LABEL maintainer=""

ENV DEBIAN_FRONTEND non interattivo

Eseguire apt-get -q update \
   && apt-get -y install \
   gnupg1 && apt-key adv -keyserver pool.sks-keyservers.net -recv-keys ED75B5A4483DA07C \
   && echo "deb http://repo.aptly.info/ spremere main" >> /etc/apt/sources.list

# Aggiornare il repository APT e installare i pacchetti
Eseguire apt-get -q update \
   && apt-get -y install \
     aptly=1.3.0 \
     bzip2 \
     gpgv1 \
     graphviz \
     supervisore \
     nginx \
     wget \
     xz-utils -
     apt-utils \
   && apt-get clean \
   && rm -rf /var/lib/apt/lists/*

# installa la configurazione giusta
COPIA assets/aptly.conf /etc/aptly.conf

# Installare gli script
COPIA asset/*.sh /opt/

# Installare Nginx Config
RUN rm /etc/nginx/sites-enabled/*
COPIA asset/supervisord.nginx.conf /etc/supervisor/conf.d/nginx.conf
RUN echo "daemon off;" >> /etc/nginx/nginx.conf

# Posizione di montaggio del binding
VOLUME [ "/opt/aptly" ]

# Eseguire lo script di avvio all'avvio del contenitore
ENTRYPOINT [ "/opt/startup.sh" ]

Nota, a partire dal 2.4.2019, aptly 1.3.0 è ancora la versione più recente.

Connettersi al contenitore aptly

docker exec -it aptly /bin/bash

Il vostro contenitore, che in questo caso ha un nome appropriato, apre un terminale interattivo con /bin/bash. Tutti gli altri comandi vengono eseguiti all'interno del contenitore.

Generare le chiavi GPG

Lo script docker menzionato sopra crea automaticamente le chiavi GPG per voi, passando la vostra passphrase in un file nel contenitore. Lo snippet dello script in questione è questo:

#! /usr/bin/env bash

# Copyright 2016 Bryan J. Hong
# Concesso in licenza secondo la Licenza Apache, versione 2.0

cat < /opt/gpg_batch
%echo Generating a GPG key, might take a while
Tipo di chiave: RSA
Lunghezza della chiave: 4096
Tipo di sottochiave: ELG-E
Sottochiave-Lunghezza: 1024
Nome-Reale: ${NOME_TUTTO}
Nome-Commento: Aptly Repo Signing
Nome-Email: ${INDIRIZZO_EMAIL}
Data di scadenza: 0
Passphrase: ${GPG_PASSWORD}
%pubring /opt/aptly/aptly.pub
%secring /opt/aptly/aptly.sec
%commit
%echo done
EOF

Questo viene eseguito se le chiavi non esistono, dall'entrypoint del contenitore:

# Se il keypair GPG del repository non esiste, createlo.
se [[ ! -f /opt/aptly/aptly.sec ]] || [[ ! -f /opt/aptly/aptly.pub ]]]; allora
   echo "Generazione di nuove chiavi gpg"
   cp -a /dev/urandom /dev/random
   /opt/gpg_batch.sh
   # Se il vostro sistema non ha molta entropia, questo potrebbe richiedere molto tempo
   # Google come creare entropia "artificiale" se questo si blocca
   gpg1 -batch -gen-key /opt/gpg_batch
else
   echo "Non c'è bisogno di generare nuove chiavi gpg"
fi

Notate la mia versione "migliorata" (gpg1 invece di specificare solo gpg) - questo sembra essere necessario per Ubuntu bionic beaver, altrimenti otterrete gpg 2 come default.

Nota: questo file conterrà la vostra passphrase! Perciò ti consiglio di rimuoverlo dopo che il setup iniziale è stato completato.

Purtroppo, gpg1 NON sembra supportare il controllo %ask-passphrase. Quindi, se volete fare la generazione in batch delle chiavi, la password della chiave deve essere nel file batch.

Pubblicare/esportare la chiave pubblica GPG

mkdir -p /opt/aptly/public

gpg1 -export -armor > /opt/aptly/public/repository.picockpit.key

nominare la chiave in modo appropriato. -armatura si usa per esportare la chiave in un formato ASCII (invece che binario).

Notate che questi sono due trattini, spero che WordPress non li distrugga. Inoltre, qui si usa gpg1 invece che solo gpg

Creare un nuovo repository

aptly repo create -comment="picockpit.com Repository" -component="main" -distribution="stretch" pcp-repository

Crea un nuovo repository locale, in cui è possibile aggiungere pacchetti. Questo repository non è ancora pubblicato.

-commento: testo per descrivere il repository locale

-componente: componente predefinito quando si pubblica

-distribuzione: distribuzione predefinita (release) quando si pubblica

pcp-repository: questo è un nome personalizzato che ho dato a questo repository locale, puoi usare il tuo qui. Assicurati di modificare gli altri comandi di conseguenza e usa il nome che hai scelto qui.

Aggiungere pacchetti .deb al repository

aptly repo add pcp-repository /opt/aptly/testpackage/

Qui sto aggiungendo una cartella di pacchetti al repository locale che ho creato nel passo precedente. aptly riconoscerà i pacchetti aggiunti, come questo:

immagine

Creare un'istantanea

Mentre è possibile pubblicare un repo direttamente, è fortemente raccomandato di creare uno snapshot, e pubblicare lo snapshot.

aptly snapshot create pcp-snapshot dal repo pcp-repository

pcp-snapshot è un nome personalizzato, e pcp-repository il nome che hai dato al repository più sopra.

Pubblicare l'istantanea

aptly pubblica snapshot pcp-snapshot

Durante la pubblicazione dell'istantanea, ti verrà richiesta la tua passphrase gpg due volte:

immagine

aptly pubblicherà nella directory /opt/aptly/public, che Nginx o un altro webserver di vostra scelta servirà. Non c'è bisogno di

Fate anche riferimento a questa documentazione:

Cambia il repository pubblicato

Se hai fatto un errore e vuoi cambiare il repository pubblicato con un'altra istantanea, puoi usare aptly publish switch:

aptly publish switch stretch raspbian pcp-snapshot

Questo cambierà la distribuzione stretch, sotto il percorso raspbian, con il nuovo snapshot pcp-snapshot.

Aggiungere il proprio repository a un sistema

Importare la chiave

curl -L http://192.168.1.2:3200/repository.picockpit.key | sudo apt-key add -

Il comando recupera la chiave usando curl, e poi la convoglia in apt-key. C'è anche una funzionalità di apt-key per il recupero della chiave, ma dipende da un pacchetto che non è installato su Raspbian in modo predefinito.

Se non lo fate, apt non sarà in grado di recuperare i pacchetti dal nuovo repository e darà degli errori!

Aggiungere il repository

echo "deb http://192.168.1.2:3200/raspbian stretch main" | sudo tee -append /etc/apt/sources.list.d/picockpit.list

immagine

La sottodirectory sotto /etc/apt/sources.list.d è scrivibile solo da root. il -append assicura che il file non venga sovrascritto, se dovesse già esistere.

Sarebbe anche possibile creare il file manualmente e, ad esempio, usando nano, aggiungere la linea

deb http://192.168.1.2:3200/raspbian tratto principale

Installare i pacchetti

sudo apt-get update

sudo apt-get install packagename

immagine

Questa schermata mostra che apt sta leggendo anche il nuovo repository.

immagine

installare un pacchetto di esempio.

Creare un pacchetto

Vi rimando a questo eccellente articolo su come creare un pacchetto Debian.

Assicuratevi solo di cambiare Architettura in armhf per la piattaforma Raspberry Pi.

Hai bisogno di supporto professionale?

Facciamo tutte le cose Raspberry Pi per vivere. Contattateci, se avete bisogno di un supporto professionale per la vostra configurazione.

Attualmente applichiamo una tariffa giornaliera fissa di 1500 € (+ tasse). Saremo lieti di aiutarvi 🙂

Ulteriori letture

Sui pacchetti: