Erstellen eines Raspbian-Repositorys

Wenn Sie Ihr eigenes Raspbian-Repository hosten wollen, ist dieser Artikel genau das Richtige für Sie.

Ein Raspbian-Repository besteht aus einer speziellen Verzeichnisstruktur auf einem Webserver. Die Dateien, einschließlich der Pakete, sind alle statisch - daher könnte dieses Repository auch einfach auf einer Amazon-S3-Instanz gehostet werden, zum Beispiel.

Der Eintrag 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/ Haupt-UI strecken

Dies sind die Standard-Einträge für die Paket-Repositories auf Raspbian.

Die Struktur ist wie folgt:

  • deb : Quelle für Binärpakete
  • http://raspbian.raspberrypi.org/raspbian/ : URL des Repositorys
  • stretch : die "Distribution" / das Release / der Codename (in manchen Fällen ist es auch möglich, tiefer verschachtelte Unterverzeichnisse anzugeben, z.B. stretch/updates)
  • main contrib non-free rpi : die Komponenten, an denen Sie interessiert sind, aus diesem Repository, getrennt durch ein Leerzeichen

NB: apt enthält ab Debian / Raspbian Stretch standardmäßig Unterstützung für https. Andernfalls müssen Sie das Paket apt-transport-https installieren;

Hier ist eine Webseite, die erklärt, warum https für die Paketinstallation nicht erforderlich ist.

Eine Repository-Verzeichnisstruktur

Werfen Sie einen Blick auf die http://raspbian.raspberrypi.org/ Repository-Verzeichnisstruktur:

http://raspbian.raspberrypi.org/

Bild

Dieses Hauptverzeichnis enthält mehrere Unterverzeichnisse, vor allem das Verzeichnis raspbian.public.key

Einige der Unterverzeichnisse sind für verschiedene Zwecke gedacht, z.B. für Images - nicht notwendig für ein normales Debian / Raspbian Raspberry Pi Repository.

Von Interesse sind hier die

  • Kumpel
  • raspbian

Unterverzeichnisse, und die bereits erwähnten raspbian.public.key.

Der Schlüssel ist eine Textdatei, die von GnuPG erzeugt wird. So sieht er aus:

Bild

usw.

Dieser Schlüssel wird benötigt, um zu überprüfen, ob Sie tatsächlich mit dem richtigen Repository kommunizieren, das es vorgibt zu sein. Wenn Sie dem Repository vertrauen, fügen Sie den Schlüssel zu Ihrem apt-Schlüsselbund hinzu (siehe Anweisungen zum Hinzufügen Ihres eigenen Schlüssels und zur Installation von Paketen aus Ihrem eigenen neuen Repository weiter unten).

Dann kann es von apt verwendet werden die Signaturen der Metadaten des APT-Repositoriums zu überprüfen. Die Pakete selbst sind in der Regel nicht GPG-signiert / werden nicht verifiziert. Weitere Informationen finden Sie im packagecloud-Artikel.

Repositories als Unterordner

mate und raspbian sind zwei verschiedene Repositories (in diesem Fall für den Raspberry Pi).

Bitte beachten Sie: aptly - das weiter unten beschriebene Tool zum Veröffentlichen Ihres eigenen Repositorys - zeigt standardmäßig den Ordner dists im Webroot an, aber Sie können auch einen Pfad angeben, unter dem Sie veröffentlichen möchten.

Wir werden uns den raspbian-Ordner ansehen, der für unsere Zwecke ein solches Repository darstellt:

Bild

Bild

Der dists-Ordner enthält die Veröffentlichungen / Distributionen von Raspbian - mit dem gleichen Codenamen wie die Debian-Veröffentlichungen. Die aktuelle stabile Version - ab 2.4.2019 - ist Dehnen.

Sie sind nach Toy Story-Figuren benannt. Die nächste Veröffentlichung ist Buster.

"stabil" ist identisch mit "stretch" (derzeit). Es verweist auf die letzte stabile Version.

Bild

Dieses Verzeichnis enthält mehrere Dateien, die für das Funktionieren der apt-Werkzeuge erforderlich sind. Vor allem die Dateien InRelease, Release und Release.gpg.

  • InRelease: inline signiert
  • Release - gehört zu Release.gpg (Signatur)

Diese Dateien listen die Indexdateien für die Distribution und ihre Hashes auf.

Bild

...

Bild

eine InRelease-Beispieldatei, mit der Inline-Signatur am unteren Ende.

Es ist wie eine Art Landkarte für apt - wo die Dateien der Paketliste zu finden sind und in welchen Formaten (.gz und .xz sind komprimierte Formate) sie heruntergeladen werden können.

Bild

Hier befinden sich die Metadaten für die Pakete. Die Datei Packages ist für Menschen lesbar (aber sehr lang).

Bild

Diese Datei enthält insbesondere einen Link zum "Pool" für das eigentliche Paket.

Dateiname: pool/rpi/g/gst-omx1.0/gstreamer1.0-omx_1.0.0.1-0+rpi12+jessiepmg_armhf.deb
rpi ist der Name der Komponente, und die Pakete sind weiter nach dem Anfangsbuchstaben unterteilt.

Bild

die Pool wird verwendet, um die Duplizierung von Paketen zu vermeiden.

Blick auf diese informative Website für weitere Informationen über das Debian-Repository-Format:

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

Verwendung von aptly - Veröffentlichung Ihres eigenen Repositorys mit Ihren eigenen Paketen

Aptly ist ein Werkzeug zum einfachen Einrichten und Veröffentlichen Ihres eigenen .deb-Repositorys - für Debian und seine Geschwister und Cousins.

Dazu gehört Ubuntu, aber natürlich auch Raspbian.

Wenn Sie also ein Raspbian-Repository veröffentlichen möchten, gehen Sie wie folgt vor.

Einen Docker-Container einrichten

Ich habe einen Docker-Container erstellt, der auf diesem Git-Repository basiert:

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

Änderungen, die ich eingeführt habe:

  • VON ubuntu:bionic
  • gnupg1
  • gpgv1
  • gpg-Befehl explizit als gpg1 ausführen (sonst werden die öffentlichen und privaten Schlüssel unterschiedlich gespeichert, und alles funktioniert nicht wie erwartet)

Daher wird es im Folgenden einige zusätzliche Erklärungen geben. Im Großen und Ganzen ist das Skript von urpylka ein sehr praktischer Ausgangspunkt, wenn man auf Docker laufen möchte.

Außerdem empfehle ich Ihnen dringend, docker-compose zu verwenden, anstatt diese langen docker run-Befehle manuell auszuführen.

Hier ist mein Dockerfile für Ihre Referenz

# Copyright 2019 Maximilian Batz
# Copyright 2018 Artem B. Smirnov
# Copyright 2018 Jon Azpiazu
# Urheberrecht 2016 Bryan J. Hong
#
# lizenziert unter der Apache License, Version 2.0 (die "Lizenz");
# dürfen Sie diese Datei nur in Übereinstimmung mit der Lizenz verwenden.
# Sie können eine Kopie der Lizenz erhalten unter
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Sofern nicht durch geltendes Recht vorgeschrieben oder schriftlich vereinbart, darf Software
#, das unter dieser Lizenz vertrieben wird, wird auf einer "AS IS" BASIS vertrieben,
# OHNE GEWÄHRLEISTUNGEN ODER BEDINGUNGEN JEGLICHER ART, weder ausdrücklich noch stillschweigend.
# Siehe die Lizenz für die spezifische Sprache, die Berechtigungen und
# Einschränkungen unter der Lizenz.

VON ubuntu:bionic

LABEL maintainer=""

ENV DEBIAN_FRONTEND nicht interaktiv

RUN 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/ squeeze main" >> /etc/apt/sources.list

# APT-Repository aktualisieren und Pakete installieren
RUN apt-get -q update \
   && apt-get -y install \
     aptly=1.3.0 \
     bzip2 \
     gpgv1 \
     graphviz \
     Aufsichtsperson \
     nginx \
     wget \
     xz-utils \
     apt-utils \
   && apt-get clean \
   && rm -rf /var/lib/apt/lists/*

# richtig installieren Konfiguration
COPY assets/aptly.conf /etc/aptly.conf

# Skripte installieren
COPY assets/*.sh /opt/

# Nginx-Konfiguration installieren
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

# Bindungsmontageort
VOLUME [ "/opt/aptly" ]

# Startskript beim Starten des Containers ausführen
ENTRYPOINT [ "/opt/startup.sh" ]

Beachten Sie, dass ab dem 2.4.2019 aptly 1.3.0 immer noch die aktuellste Version ist.

Anschluss an den entsprechenden Container

docker exec -it aptly /bin/bash

Ihr Container, der in diesem Fall treffend benannt ist, öffnet ein interaktives Terminal mit /bin/bash. Alle anderen Befehle werden innerhalb des Containers ausgeführt.

Generierung der GPG-Schlüssel

Das oben erwähnte Docker-Skript erstellt automatisch GPG-Schlüssel für Sie, indem es Ihre Passphrase in eine Datei im Container einträgt. Der entsprechende Skriptausschnitt lautet wie folgt:

#! /usr/bin/env bash

# Urheberrecht 2016 Bryan J. Hong
# lizenziert unter der Apache License, Version 2.0

cat < /opt/gpg_batch
%echo Generating a GPG key, might take a while
Schlüssel-Typ: RSA
Schlüssellänge: 4096
Unterschlüssel-Typ: ELG-E
Unterschlüssel-Länge: 1024
Name-Real: ${FULL_NAME}
Name-Kommentar: treffend Repo-Signierung
Name-Email: ${EMAIL_ADDRESS}
Verfallsdatum: 0
Passphrase: ${GPG_PASSWORT}
%pubring /opt/aptly/aptly.pub
%secring /opt/aptly/aptly.sec
%Verpflichtung
%echo done
EOF

Dieser wird, wenn die Schlüssel nicht existieren, vom Einstiegspunkt des Containers aus ausgeführt:

# Wenn das GPG-Schlüsselpaar für das Repository nicht existiert, erstellen Sie es.
if [[ ! -f /opt/aptly/aptly.sec ]]] || [[ ! -f /opt/aptly/aptly.pub ]]; dann
   echo "Neue gpg-Schlüssel generieren"
   cp -a /dev/urandom /dev/random
   /opt/gpg_batch.sh
   # Wenn Ihr System nicht viel Entropie hat, kann dies sehr lange dauern.
   # Google, wie man "künstliche" Entropie erzeugt, falls diese hängen bleibt
   gpg1 -batch -gen-key /opt/gpg_batch
sonst
   echo "Keine Notwendigkeit, neue gpg-Schlüssel zu erzeugen"
fi

Beachten Sie meine "verbesserte" Version (gpg1 statt nur gpg angegeben) - dies scheint für Ubuntu bionic beaver notwendig zu sein, da Sie sonst standardmäßig gpg 2 erhalten.

Hinweis: Diese Datei enthält Ihre Passphrase! Daher empfehle ich, sie nach Abschluss der Ersteinrichtung zu entfernen.

Leider scheint gpg1 die %ask-Passphrase-Kontrolle NICHT zu unterstützen. Wenn Sie also eine Batch-Generierung der Schlüssel durchführen wollen, muss das Schlüsselkennwort in der Batch-Datei enthalten sein.

Veröffentlichen/Exportieren des öffentlichen GPG-Schlüssels

mkdir -p /opt/aptly/public

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

benennen Sie den Schlüssel entsprechend. -armor wird verwendet, um den Schlüssel im ASCII-Format (im Gegensatz zum Binärformat) zu exportieren.

Beachten Sie, dass dies zwei Bindestriche sind, ich hoffe, WordPress zerstört sie nicht. Außerdem wird hier gpg1 statt nur gpg verwendet

Ein neues Repository erstellen

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

Erzeugt ein neues lokales Repository, in das Sie Pakete hinzufügen können. Dieses Repository wird noch nicht veröffentlicht.

-comment : Text zur Beschreibung des lokalen Repositorys

-component: Standardkomponente bei der Veröffentlichung

-distribution: Standardverteilung (Release) bei der Veröffentlichung

pcp-repository: Dies ist ein benutzerdefinierter Name, den ich diesem lokalen Repository gegeben habe, Sie können hier Ihren eigenen verwenden. Stellen Sie sicher, dass Sie die anderen Befehle entsprechend ändern und den hier gewählten Namen verwenden.

.deb-Pakete zum Repository hinzufügen

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

Hier füge ich einen Ordner mit Paketen zu dem lokalen Repository hinzu, das ich im vorherigen Schritt erstellt habe. aptly wird die hinzugefügten Pakete wie folgt bestätigen:

Bild

Schnappschuss erstellen

Es ist zwar möglich, ein Projektarchiv direkt zu veröffentlichen, es wird jedoch dringend empfohlen, einen Snapshot zu erstellen und diesen zu veröffentlichen.

aptly snapshot create pcp-snapshot aus dem Repository pcp-repository

pcp-snapshot ist ein benutzerdefinierter Name, und pcp-repository ist der Name, den Sie dem Repository weiter oben gegeben haben.

Schnappschuss veröffentlichen

Schnappschuss mit aptly veröffentlichen pcp-snapshot

Während der Veröffentlichung des Snapshots werden Sie zwei Mal nach Ihrer gpg-Passphrase gefragt:

Bild

aptly veröffentlicht im Verzeichnis /opt/aptly/public, das Nginx oder ein anderer Webserver Ihrer Wahl ausliefert. Keine Notwendigkeit für

Siehe dazu auch diese Dokumentation:

Veröffentlichtes Repository wechseln

Wenn Sie einen Fehler gemacht haben und das veröffentlichte Repository gegen einen anderen Snapshot austauschen möchten, können Sie aptly publish switch verwenden:

aptly publish switch stretch raspbian pcp-snapshot

Dadurch wird die Distribution stretch, unter dem Pfad raspbian, mit dem neuen Snapshot pcp-snapshot ausgetauscht.

Hinzufügen Ihres Repositorys zu einem System

Importieren Sie den Schlüssel

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

Der Befehl holt sich den Schlüssel mit curl und leitet ihn dann in apt-key ein. Es gibt auch eine apt-key-Funktion zum Abrufen von Schlüsseln, die jedoch von einem Paket abhängt, das auf Raspbian standardmäßig nicht installiert ist.

Wenn Sie dies nicht tun, wird apt nicht in der Lage sein, Pakete aus dem neuen Repository zu holen, und wird Fehler ausgeben!

Das Repository hinzufügen

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

Bild

Das Unterverzeichnis unter /etc/apt/sources.list.d ist nur von root beschreibbar. Das -append stellt sicher, dass die Datei nicht überschrieben wird, falls sie bereits existieren sollte.

Es wäre auch möglich, die Datei manuell zu erstellen, und z.B. mit nano die Zeile

deb http://192.168.1.2:3200/raspbian Stretch-Main

Pakete installieren

sudo apt-get update

sudo apt-get install Packungsname

Bild

Dieser Screenshot zeigt, dass apt auch das neue Repository liest.

Bild

ein Beispielpaket zu installieren.

Ein Paket erstellen

Ich verweise Sie auf diesen ausgezeichneten Artikel, wie man ein Debian-Paket erstellt.

Achten Sie nur darauf, dass Sie die Architektur in armhf für die Raspberry Pi-Plattform.

Sie brauchen professionelle Unterstützung?

Wir beschäftigen uns beruflich mit dem Raspberry Pi. Kontaktieren Sie uns, wenn Sie professionelle Unterstützung bei Ihrer Einrichtung benötigen.

Wir berechnen derzeit einen pauschalen Tagessatz von 1500 € (+Steuern). Wir helfen Ihnen gerne 🙂

Weitere Lektüre

Über Pakete: