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/
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:
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:
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.
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.
...
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.
Hier befinden sich die Metadaten für die Pakete. Die Datei Packages ist für Menschen lesbar (aber sehr lang).
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.
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.0cat < /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:
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:
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
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
Dieser Screenshot zeigt, dass apt auch das neue Repository liest.
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 berechnen derzeit einen pauschalen Tagessatz von 1500 € (+Steuern). Wir helfen Ihnen gerne 🙂
Weitere Lektüre
- 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
Über Pakete: