Mit der Paketverwaltung haben wir bereits als zentrale Anlaufstelle zum installieren neuer Programme vorgestellt. Es enthält viele nützliche Programme, aber nicht alle. Es gibt verschiedene Möglichkeiten, um Programme zu installieren, die es dort noch nicht gibt. Einer davon ist das Hinzufügen von Drittanbieter-Paketquellen, diesen Weg möchte ich dir im folgenden erklären.
Warum Drittabieter-Paketquellen nutzen?
Es gibt hauptsächlich zwei Gründe:
- Ihr möchtet ein Programm installieren, das in den offiziellen Paketquellen nicht enthalten ist. Der Entwickler oder Hersteller bietet aber eine eigene Paketquelle an, die er selbst pflegt.
- Das gewünschte Programm gibt es zwar in den offiziellen Paketquellen, aber in einer deutlich älteren Version – du benötigst jedoch eine aktuellere.
Gerade letzteres kann ein Problem sein: Debian testet gründlich und ist eher konservativ. Da das Raspberry Pi OS auf Debian aufbaut, dauert es hier noch etwas länger.
Schauen wir uns das am Beispiel von PHP an. PHP ist ein gängiges Beispiel, da neuere Versionen hier oft Verbesserungen oder sogar neue Funktionen mitliefern. Zum Erstellungszeitpunkt erhalten wir über die Raspberry Pi OS Paketquellen PHP 7.3.29 vom Juli 2021. Im 7.3 Zweig wäre die aktuellste Version 7.3.31. Es gibt aber zwei neuere Zweige: 7.4.24 und eine Hauptversion höher 8-0.11.

Was sind Drittanbieter-Paketquellen?
Im zuvor erwähnten Video habe ich die Funktionsweise des Paketsystems apt erklärt. Dies stammt von Debian und wird auch auf dem Raspberry Pi OS eingesetzt. Die dort gezeigten Paketquellen werden von der Raspberry Pi Organisation geprüft. Sie stellen dabei sicher, dass die Pakete funktionieren und es möglichst zu keinen Konflikten mit anderen Paketen kommt. Außerdem werden die Programme auf Überwachungs- und Schadsoftware geprüft, um deren Sicherheit zu gewähren.
Jeder kann eine eigene Paketquelle erstellen, beispielsweise der Hersteller einer Software. Hier finden diese beiden Prüfungen allerdings nicht statt: Der Eigentümer der Paketquelle ist komplett Eigenständig dafür verantwortlich, dass seine Software keine Probleme verursacht und frei von Schadsoftware ist. Für uns als Nutzer bedeutet das: Wenn wir eine inoffizielle Paketquelle hinzufügen, müssen wir dem Autor vertrauen. Und darauf achten, dass er Aktualisierungen möglichst zeitnah einspielt.
Man sollte daher sparsam und sorgsam mit inoffiziellen Paketquellen umgehen. Eine gute Anlaufstelle sind Hersteller, die bereits seit längerem eine solche Paketquelle zuverlässig pflegen.
Wie füge ich eine inoffizielle Paketquelle zu meinem Raspberry Pi hinzu?
Für PHP demonstriere ich dies am deb.sury.org Repository. Es stammt von einem Debian-Entwickler mit 20 Jahren Erfahrung, der seit Jahren die aktuellsten stabilen PHP-Versionen dort bereitstellt. Ein offizielles Debian-Projekt ist es jedoch nicht, er betreibt es privat.
Zunächst müssen wir den Schlüssel des Repositories hinzufügen. Er dient zur Sicherheit, um Manipulationen auf dem Transportweg durchs Internet auszuschließen. Man findet den Link dazu meist auf der Projektseite oder in der Dokumentation.
wget -O /tmp/php.gpg https://packages.sury.org/php/apt.gpg
sudo mv /tmp/php.gpg /etc/apt/trusted.gpg.d/
Es gibt verschiedene Wege, um die Paketquelle selbst hinzuzufügen. In jedem Falle wird dabei ein Eintrag bzw. eine Liste in /etc/apt angelegt. Die Hauptdatei ist /etc/apt/sources.list, sie enthält die offiziellen Paketquellen vom Raspberry Pi OS. Man kann dort eigene hinzufügen. Übersichtlicher ist es jedoch, wenn man eine eigene Datei in /etc/apt/sources.list.d anlegt. Sie muss die Endung .list besitzen, damit sie geladen wird. Mit echo und tee schreiben wir einen Eintrag in die Datei /etc/apt/sources.list.d/php.list und aktualisieren anschließend die Paketquellen sowie Pakete:
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
sudo apt update
sudo apt upgrade
Welche PHP-Versionen durch das neue Repo verfügbar sind, sehen wir beispielsweise durch die Eingabe von php gefolgt von der Tab-Taste:
$ php <Tab>
php php7.3 php8.0 phpdismod phpenmod phpquery
Variante 1: Ihr habt bereits Apache mit PHP installiert und möchtet auf die neueste Version upgraden
Hier seid ihr richtig, wenn ihr zuvor bereits die PHP-Version aus dem Standard-Repo installiert habt, wie im vorherigen Beitrag gezeigt. Im Apache2 Webserver müssen wir nun das alte PHP 7 Modul deaktivieren und das neue von Version 8 aktivieren. Wie das aktiviert heißt, lässt sich auf zwei Wegen herausfinden: sudo a2dismod php und die <Tab> Taste drücken. Dann wird der Name automatisch vervollständigt, etwa php7.3 in diesem Beispiel. Alternativ sieht man dies auch im Verzeichnis /etc/apache2/mods-enabled/, wenn man mit grep nach php sucht:
$ sudo a2dismod php7.3
# Alternativ
$ ls -l /etc/apache2/mods-enabled/ | grep php
lrwxrwxrwx 1 root root 29 Okt 10 16:25 php7.3.conf -> ../mods-available/php7.3.conf
lrwxrwxrwx 1 root root 29 Okt 10 16:25 php7.3.load -> ../mods-available/php7.3.load
Die neue PHP-Version ermitteln wir auf die gleiche Art- und Weise. Allerdings mit a2enmod:
$ sudo a2enmod php8.0
# Alternativ
$ ls -l /etc/apache2/mods-available | grep php
-rw-r--r-- 1 root root 855 Jul 2 06:04 php7.3.conf
-rw-r--r-- 1 root root 102 Jul 2 06:04 php7.3.load
-rw-r--r-- 1 root root 855 Sep 24 00:03 php8.0.conf
-rw-r--r-- 1 root root 101 Sep 24 00:03 php8.0.load
$ sudo systemctl restart apache
Es macht Sinn, abschließend noch die alten Pakete zu bereinigen:
sudo apt autoremove
Variante 2: PHP ist noch nicht installiert
Das ist der einfachste Fall: Ihr könnt direkt die neueste Version installieren, zum Erstellzeitpunkt war das die Version 8.0. Falls noch nicht geschehen, vorher Apache oder den gewünschten Webserver installieren:
$ sudo apt install apache2
$ sudo apt install php8.0 php8.0-mysql php8.0-mbstring
Die Pakete php8.0-mysql und php8.0-mbstring sind optional, werden in den meisten Fällen aber benötigt.
Finaler Test: Funktioniert PHP 8?
So erhalten wir nach dem Neustart des Apache2 Dienstes die derzeit aktuellste stabile PHP 8 Version:

Installation von PHP-Erweiterungen
Auch einige Erweiterungen werden für die neue PHP-Version angeboten. Eine Liste erhält man beispielsweise durch die Autovervollständigung:
$ sudo apt install php8.0-
Display all 147 possibilities? (y or n) y
php8.0-amqp php8.0-curl-dbgsym php8.0-gmagick-dbgsym php8.0-interbase php8.0-memcached php8.0-pgsql php8.0-rrd-dbgsym php8.0-tidy php8.0-xsl
php8.0-amqp-dbgsym php8.0-dba php8.0-gmp php8.0-interbase-dbgsym php8.0-memcache-dbgsym php8.0-pgsql-dbgsym php8.0-smbclient php8.0-tidy-dbgsym php8.0-yac
php8.0-apcu php8.0-dba-dbgsym php8.0-gmp-dbgsym php8.0-intl php8.0-memcached-dbgsym php8.0-phpdbg php8.0-smbclient-dbgsym php8.0-uopz php8.0-yac-dbgsym
php8.0-apcu-dbgsym php8.0-decimal php8.0-gnupg php8.0-intl-dbgsym php8.0-mongodb php8.0-phpdbg-dbgsym php8.0-snmp php8.0-uopz-dbgsym php8.0-yaml
php8.0-ast php8.0-decimal-dbgsym php8.0-gnupg-dbgsym php8.0-ldap php8.0-mongodb-dbgsym php8.0-protobuf php8.0-snmp-dbgsym php8.0-uploadprogress php8.0-yaml-dbgsym
php8.0-ast-dbgsym php8.0-dev php8.0-grpc php8.0-ldap-dbgsym php8.0-msgpack php8.0-protobuf-dbgsym php8.0-soap php8.0-uploadprogress-dbgsym php8.0-zip
php8.0-bcmath php8.0-ds php8.0-grpc-dbgsym php8.0-lz4 php8.0-msgpack-dbgsym php8.0-pspell php8.0-soap-dbgsym php8.0-uuid php8.0-zip-dbgsym
php8.0-bcmath-dbgsym php8.0-ds-dbgsym php8.0-http php8.0-lz4-dbgsym php8.0-mysql php8.0-pspell-dbgsym php8.0-solr php8.0-uuid-dbgsym php8.0-zmq
php8.0-bz2 php8.0-enchant php8.0-http-dbgsym php8.0-mailparse php8.0-mysql-dbgsym php8.0-psr php8.0-solr-dbgsym php8.0-vips php8.0-zmq-dbgsym
php8.0-bz2-dbgsym php8.0-enchant-dbgsym php8.0-igbinary php8.0-mailparse-dbgsym php8.0-oauth php8.0-psr-dbgsym php8.0-sqlite3 php8.0-vips-dbgsym php8.0-zstd
php8.0-cgi php8.0-fpm php8.0-igbinary-dbgsym php8.0-maxminddb php8.0-oauth-dbgsym php8.0-raphf php8.0-sqlite3-dbgsym php8.0-xdebug php8.0-zstd-dbgsym
php8.0-cgi-dbgsym php8.0-fpm-dbgsym php8.0-imagick php8.0-maxminddb-dbgsym php8.0-odbc php8.0-raphf-dbgsym php8.0-ssh2 php8.0-xhprof
php8.0-cli php8.0-gd php8.0-imagick-dbgsym php8.0-mbstring php8.0-odbc-dbgsym php8.0-readline php8.0-ssh2-dbgsym php8.0-xhprof-dbgsym
php8.0-cli-dbgsym php8.0-gd-dbgsym php8.0-imap php8.0-mbstring-dbgsym php8.0-opcache php8.0-readline-dbgsym php8.0-swoole php8.0-xml
php8.0-common php8.0-gearman php8.0-imap-dbgsym php8.0-mcrypt php8.0-opcache-dbgsym php8.0-redis php8.0-swoole-dbgsym php8.0-xml-dbgsym
php8.0-common-dbgsym php8.0-gearman-dbgsym php8.0-inotify php8.0-mcrypt-dbgsym php8.0-pcov php8.0-redis-dbgsym php8.0-sybase php8.0-xmlrpc
php8.0-curl php8.0-gmagick php8.0-inotify-dbgsym php8.0-memcache php8.0-pcov-dbgsym php8.0-rrd php8.0-sybase-dbgsym php8.0-xmlrpc-dbgsym
Möchten wir beispielsweise Bilder bearbeiten, kann man verschiedene Erweiterungen wie Imagick oder GD installieren. Curl ist ebenfalls eine beliebte Erweiterung, um HTTP-Anfragen durchzuführen. Damit diese geladen werden und in PHP verfügbar sind, anschließend den Apache2 Webserver neu starten:
$ sudo apt install php8.0-imagick
$ sudo systemctl restart apache
Aufbau eines Eintrages in der Paketliste
Werfen wir einen kurzen Blick auf den Eintrag, den wir soeben angelegt haben:
$ cat /etc/apt/sources.list.d/php.list
deb https://packages.sury.org/php/ buster main
deb gibt das Format an. Unter Debian und dem Raspberry Pi OS ist deb das Standardformat für Pakete. Alternativ gibt es auch noch deb-src, womit man den Quellcode herunterladen kann – beispielsweise um ihn zu prüfen oder Änderungen vorzunehmen.
Nach der URL folgt die Distribution. Bei mir ist das Debian 10 Buster, wie man über lsb_release -c ermitteln kann. Welche Versionen unterstützt werden, variiert je nach Paketquelle. Hier sind es beispielsweise die LTS-Versionen von Debian.
Die Kategorie main steht für freie Software aus offiziellen Quellen. Es gibt noch contrib für freie Software, die Abhängigkeiten zu nicht freier Software besitzt. Ist das Programm selbst nicht frei, steht es in der Gruppe non-free. Entsprechend der Debian-Philosophie sinkt damit die Vertrauensstufe, da proprietäre Software aufgrund der fehlenden Transparenz in der Regel nicht überprüft werden kann. In unserem PHP-Beispiel ist das wenig relevant, da PHP komplett frei ist.