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;

Hier is een webpagina die uitlegt waarom https niet noodzakelijk is voor de installatie van pakketten.

Een repository mapstructuur

Kijk eens naar de http://raspbian.raspberrypi.org/ de mapstructuur van het archief:

http://raspbian.raspberrypi.org/

afbeelding

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:

afbeelding

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:

afbeelding

afbeelding

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.

afbeelding

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.

afbeelding

...

afbeelding

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.

afbeelding

Hier staan de metadata voor de pakketten. Het bestand Packages is menselijk leesbaar (maar erg lang).

afbeelding

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.

afbeelding

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

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

afbeelding

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:

afbeelding

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

afbeelding

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

afbeelding

Deze screenshot laat zien dat apt de nieuwe repository ook aan het lezen is.

afbeelding

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?

Wij doen alles van Raspberry Pi voor de kost. Neem contact met ons op, als u professionele ondersteuning nodig heeft bij uw installatie.

We rekenen momenteel een vast tarief van 1500 € per dag (+ belastingen).

Verdere lectuur

Over pakketten: