Aktuelles PHP 8 auf dem Raspberry Pi installieren: So nutzt ihr inoffizielle Paketquellen

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:

  1. 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.
  2. 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.

Übersicht der unterstützten PHP-Versionen – Quelle: php.net

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.

Leave a Reply