Een Raspbian repository aanmaken
Als je je eigen Raspbian repository wilt hosten, dan is dit artikel voor jou.
Een Raspbian repository bestaat uit een speciale mappenstructuur op een webserver. De bestanden, inclusief de packages, zijn allemaal statisch - daarom zou deze repository ook gewoon gehost kunnen worden op een Amazon S3 instance, bijvoorbeeld.
De sources.list regel 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/ stretch hoofd ui
Dit zijn de standaard vermeldingen voor de pakket repositories op Raspbian.
De structuur is als volgt:
- deb : bron voor binaire pakketten
- http://raspbian.raspberrypi.org/raspbian/ : URL van het archief
- stretch : de "distributie" / release / codenaam (in sommige gevallen ook mogelijk om dieper geneste subdirectories op te geven, bv. stretch/updates)
- main contrib non-free rpi : de componenten waarin je geïnteresseerd bent uit dit archief, gescheiden door een spatie
NB: apt vanaf Debian / Raspbian Stretch bevat standaard ondersteuning voor https. Anders zou je het apt-transport-https pakket moeten installeren;
Een repository mapstructuur
Kijk eens naar de http://raspbian.raspberrypi.org/ de mapstructuur van het archief:
http://raspbian.raspberrypi.org/
Deze hoofddirectory bevat verschillende subdirectories, en met name de raspbian.public.key
Sommige van de submappen zijn voor diverse doeleinden, b.v. images - niet nodig voor een normaal Debian / Raspbian Raspberry Pi repository.
Van belang zijn hier de
- maat
- raspbian
subdirectories, en de reeds genoemde raspbian.public.key.
De sleutel is een tekstbestand, gegenereerd door GnuPG. Hier is hoe het eruit ziet:
enz.
Deze sleutel is nodig om te verifiëren dat je inderdaad communiceert met de juiste repository, wat het beweert te zijn. Als je de repository vertrouwt, voeg je de sleutel toe aan je apt keyring (zie voor instructies hoe je je eigen sleutel toevoegt en pakketten uit je eigen nieuwe repository installeert hieronder).
Dan kan het gebruikt worden door apt om de handtekeningen van de metagegevens van het APT-repository te verifiëren. De pakketten zelf zijn meestal niet GPG gesigneerd / worden niet geverifieerd. Raadpleeg het packagecloud-artikel voor details.
Repositories als submappen
mate en raspbian zijn twee verschillende repositories (voor de Raspberry Pi in dit geval).
Let op: aptly - de tool om je eigen repository te publiceren, hieronder uitgelegd - zal standaard de webroot gebruiken, en zal de dists map in de webroot tonen, maar je kunt ook een pad specificeren om onder te publiceren.
We zullen kijken naar de raspbian map, die voor onze doeleinden zo'n repository is:
De dists map bevat de releases / distributies van Raspbian - codenaam in sync met de Debian releases. De huidige stabiele - vanaf 2.4.2019 - zijn Stretch.
Ze zijn genoemd naar personages uit Toy Story. De aankomende uitgave is Buster.
"stabiel" is identiek aan "stretch" (momenteel). Het zal verwijzen naar de meest recente stabiele release.
Deze directory bevat verschillende bestanden die nodig zijn voor de werking van apt tools. Met name de InRelease, Release en Release.gpg bestanden.
- InRelease: ondertekend in-line
- Release - gaat samen met Release.gpg (handtekening)
deze bestanden bevatten de indexbestanden voor de distributie en hun hashes.
...
een voorbeeld InRelease bestand, met de inline handtekening onderaan.
Het is als een soort kaart voor apt - waar de Package listing bestanden kunnen worden gevonden, en in welke formaten ( .gz en .xz zijn gecomprimeerde formaten) ze kunnen worden gedownload.
Hier staan de metadata voor de pakketten. Het bestand Packages is menselijk leesbaar (maar erg lang).
met name dit bestand bevat een link naar de "pool", voor het eigenlijke pakket.
Bestandsnaam: pool/rpi/g/gst-omx1.0/gstreamer1.0-omx_1.0.0.1-0+rpi12+jessiepmg_armhf.deb
rpi is de naam van het onderdeel, en de pakketten zijn verder opgesplitst per eerste letter.
de zwembad directory wordt gebruikt om duplicatie van pakketten te voorkomen.
Kijk naar deze informatieve site voor meer informatie over het Debian Repository Formaat:
https://wiki.debian.org/DebianRepository/Format
Gebruik aptly - publiceer je eigen repository, met je eigen packages
Aptly is een programma voor het eenvoudig opzetten en publiceren van uw eigen .deb Repository - voor Debian en zijn broers en zussen.
Dit omvat Ubuntu, maar natuurlijk ook Raspbian.
Dus, als je een Raspbian repository wilt publiceren, dan is dit hoe je het doet.
Opzetten van een Docker container
Ik heb een Docker container gemaakt, gebaseerd op deze git repository:
https://github.com/urpylka/docker-aptly
veranderingen die ik heb ingevoerd:
- VAN ubuntu:bionic
- gnupg1
- gpgv1
- gpg commando expliciet uitvoeren als gpg1 (anders worden de publieke en private sleutels anders opgeslagen, en zal alles niet werken zoals verwacht)
Daarom zal er hieronder wat extra uitleg volgen. Over het algemeen is urpylka's script een heel handig startpunt, als je op Docker wilt draaien.
Verder raad ik je sterk aan om docker-compose te gebruiken, in plaats van die lange docker run commando's handmatig uit te voeren.
Hier is mijn dockerfile voor uw referentie
# Copyright 2019 Maximilian Batz
# Copyright 2018 Artem B. Smirnov
# Copyright 2018 Jon Azpiazu
# Copyright 2016 Bryan J. Hong
#
# Gelicentieerd onder de Apache Licentie, Versie 2.0 (de "Licentie");
# u mag dit bestand alleen gebruiken in overeenstemming met de Licentie.
# U kunt een kopie van de Licentie verkrijgen op
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Tenzij vereist door de toepasselijke wetgeving of schriftelijk overeengekomen, zal software
# gedistribueerd onder de Licentie wordt gedistribueerd op een "AS IS" BASIS,
# ZONDER GARRANTIES OF VOORWAARDEN VAN ENIGE NATUUR, hetzij uitdrukkelijk of impliciet.
# Zie de Licentie voor de specifieke taal die de permissies en
# beperkingen onder de Licentie.VAN ubuntu:bionic
LABEL maintainer=""
ENV DEBIAN_FRONTEND niet-interactief
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# Update APT repository & installeer pakketten
RUN apt-get -q update
&& apt-get -y install
aptly=1.3.0
bzip2
gpgv1
graphviz
supervisor.
nginx
wget
xz-utils
apt-utils
&& apt-get clean
&& rm -rf /var/lib/apt/lists/*# Installeer Aptly Configuratie
KOPIE assets/aptly.conf /etc/aptly.conf# Installeer scripts
KOPIE activa/*.sh /opt/# Installeer Nginx Config
RUN rm /etc/nginx/sites-enabled/*
KOPIE assets/supervisord.nginx.conf /etc/supervisor/conf.d/nginx.conf
RUN echo "daemon off;" >> /etc/nginx/nginx.conf# Bevestigingsplaats
VOLUME [ "/opt/aptly" ]# Opstartscript uitvoeren bij opstarten container
ENTRYPOINT [ "/opt/startup.sh" ]
Let op, vanaf 2.4.2019 is aptly 1.3.0 nog steeds de meest recente versie.
Verbinden met de toepasselijke container
docker exec -it aptly /bin/bash
Je container, die in dit geval een toepasselijke naam heeft, opent een interactieve terminal met /bin/bash. Alle andere commando's worden in de container uitgevoerd.
Genereren van de GPG-sleutels
Het hierboven genoemde docker script maakt automatisch GPG sleutels voor je aan, door je passphrase in te geven in een bestand in de container. Het relevante scriptfragment is dit:
#! /usr/bin/env bash
# Copyright 2016 Bryan J. Hong
# Gelicentieerd onder de Apache Licentie, Versie 2.0cat < /opt/gpg_batch
%echo Generating a GPG key, might take a while
Sleutel-type: RSA
Sleutel-lengte: 4096
Subkey-Type: ELG-E
Subkey-Lengte: 1024
Naam-Reëel: ${FULL_NAME}
Naam-beschrijving: Aptly Repo Signing
Naam-E-mail: ${EMAIL_ADDRESS}
Vervaldatum: 0
Passphrase: ${GPG_PASSWORD}
%pubring /opt/aptly/aptly.pub
%secring /opt/aptly/aptly.sec
%oezeggen
%echo done
EOF
Dit wordt uitgevoerd als de sleutels niet bestaan, vanaf het ingangspunt van de container:
# Als het GPG sleutelpaar van het archief niet bestaat, maak het dan aan.
als [[ ! -f /opt/aptly/aptly.sec ]] || [[ ! -f /opt/aptly/aptly.pub ]]; dan
echo "Genereren van nieuwe gpg sleutels"
cp -a /dev/urandom /dev/random
/opt/gpg_batch.sh
# Als uw systeem niet veel entropie heeft kan dit lang duren
# Google how-to creëer "kunstmatige" entropie als dit vastloopt
gpg1 -batch -gen-key /opt/gpg_batch
anders
echo "Geen noodzaak om nieuwe gpg sleutels te genereren"
fi
Let op mijn "verbeterde" versie (gpg1 in plaats van alleen gpg gespecificeerd) - dit lijkt nodig te zijn voor Ubuntu bionic beaver, omdat je anders gpg 2 als standaard krijgt.
Let op: dit bestand bevat uw passphrase! Daarom raad ik aan om het te verwijderen nadat de initiële setup is voltooid.
Helaas lijkt gpg1 de %ask-passphrase controle NIET te ondersteunen. Daarom moet, als u de sleutels in batch wilt genereren, het sleutelwachtwoord in het batchbestand staan.
Publiceren / exporteren van de GPG openbare sleutel
mkdir -p /opt/aptly/public
gpg1 -export -armor > /opt/aptly/public/repository.picockpit.key
geef de sleutel de juiste naam. -pantser wordt gebruikt om de sleutel in een ASCII formaat te exporteren (in tegenstelling tot binair).
Merk op dat dit twee streepjes zijn, ik hoop dat WordPress ze niet vernietigt. Ook is hier gpg1 gebruikt in plaats van alleen gpg
Een nieuw archief aanmaken
aptly repo create -comment="picockpit.com Repository" -component="main" -distribution="stretch" pcp-repository
Creëert een nieuw lokaal archief, waarin je pakketten kunt toevoegen. Deze repository is nog niet gepubliceerd.
-commentaar : tekst om het lokale archief te beschrijven
-component: standaard component bij publiceren
-distributie: standaard distributie (release) bij publicatie
pcp-repository: dit is een aangepaste naam die ik aan deze lokale repository heb gegeven, je kunt hier je eigen naam gebruiken. Zorg ervoor dat je de andere commando's aanpast en de naam gebruikt die je hier kiest.
.deb-pakketten toevoegen aan de repository
aptly repo add pcp-repository /opt/aptly/testpackage/
Hier voeg ik een map met packages toe aan de lokale repository die ik in de vorige stap heb aangemaakt. aptly zal de toegevoegde packages erkennen, zoals dit:
Momentopname maken
Hoewel het mogelijk is om een repo rechtstreeks te publiceren, wordt het sterk aangeraden om een snapshot te maken, en het snapshot te publiceren.
aptly snapshot create pcp-snapshot from repo pcp-repository
pcp-snapshot is een aangepaste naam, en pcp-repository is de naam die je aan de repository gegeven hebt, verder hierboven.
Momentopname publiceren
aptly publish snapshot pcp-snapshot
Tijdens het publiceren van het snapshot zal u tweemaal gevraagd worden naar uw gpg passphrase:
aptly zal publiceren naar de directory /opt/aptly/public, welke Nginx of een andere webserver van je keuze zal serveren. Geen noodzaak voor
Raadpleeg ook deze documentatie:
Schakel gepubliceerde repository
Als je een fout hebt gemaakt, en je wilt het gepubliceerde repository wisselen naar een ander snapshot, dan kun je aptly publish switch gebruiken:
aptly publish switch stretch raspbian pcp-snapshot
Dit zal de distributiestretch, onder het pad raspbian, omwisselen met de nieuwe snapshot pcp-snapshot.
Uw archief toevoegen aan een systeem
Importeer de sleutel
krul -L http://192.168.1.2:3200/repository.picockpit.key | sudo apt-key add -
Het commando haalt de sleutel op met curl, en stuurt het dan naar apt-key. Er is ook een apt-key key fetching functionaliteit, maar deze is afhankelijk van een pakket dat niet standaard op Raspbian is geïnstalleerd.
Als je dit niet doet, zal apt niet in staat zijn om pakketten uit de nieuwe repository op te halen, en zal het fouten geven!
De opslagplaats toevoegen
echo "deb http://192.168.1.2:3200/raspbian stretch main" | sudo tee -append /etc/apt/sources.list.d/picockpit.list
De subdirectory onder /etc/apt/sources.list.d is alleen beschrijfbaar door root. de -append zorgt ervoor dat het bestand niet wordt overschreven, als het al zou moeten bestaan.
Het zou ook mogelijk zijn om het bestand handmatig aan te maken, en bijv. met nano de regel
deb http://192.168.1.2:3200/raspbian stretch hoofd
Pakketten installeren
sudo apt-get update
sudo apt-get install packagename
Deze screenshot laat zien dat apt de nieuwe repository ook aan het lezen is.
een voorbeeldpakket installeren.
Een pakket creëren
Ik verwijs je naar dit uitstekende artikel hoe je een Debian pakket maakt.
Zorg er alleen voor dat je Architectuur verandert in armhf voor het Raspberry Pi platform.
Heb je professionele ondersteuning nodig?
We rekenen momenteel een vast tarief van 1500 € per dag (+ belastingen).
Verdere lectuur
- 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
Over pakketten: