Lese-Ansicht

Raspberry Pi OS ab sofort mit Dark Mode (dunkler Modus)

Vor circa zwei Monaten wurde das auf Wayland basierte Raspberry Pi OS Bookworm veröffentlicht. Bei dem Betriebssystem wurden seitdem Fehler ausgebessert und auch Finetuning vorgenommen. Anwender berichten Fehler, die während der Tests nicht aufgefallen sind und das Team selbst pflegt Verbesserungen ein, die zwar geplant waren, aber es nicht in die erste Version geschafft haben. Laut eigenen Angaben hat sich unter der Haube von Bookworm sehr viel getan. Die neueste Version kannst Du nun via Imager installieren. Bestehende Installationen darfst […]

Der Beitrag Raspberry Pi OS ab sofort mit Dark Mode (dunkler Modus) ist von bitblokes.de.

  •  

Fedora Asahi Remix installieren

Der »Fedora Asahi Remix« ist eine für moderne Macs (Apple Silicon) optimierte Version von Fedora 39. Ich habe mich mit Asahi Linux ja schon vor rund zwei Jahren beschäftigt. Seither hat sich viel getan. Zeit also für einen neuen Versuch! Dieser Beitrag beschreibt die Installation des Fedora Asahi Remix auf einem Mac Mini mit M1-CPU. In einem zweiten Artikel fasse ich die Konfiguration und meine praktischen Erfahrungen zusammen.

Installationsstart

Die Projektseite von Asahi Linux empfiehlt, die Installation von Asahi Linux in einem Terminal wie folgt zu starten:

curl https://alx.sh | sh

Ich habe bei solchen Dingen immer etwas Bauchweh, zumal das Script sofort nach dem sudo-Passwort fragt. Was, wenn irgendjemand alx.sh gekapert hat und mir ein Script unterjubelt, das einen Trojaner installiert? Daher:

curl https://alx.sh -o alx.sh
less alx.sh
sh alx.sh 

Die Kontrolle hilft auch nur bedingt. Das Script ist nur wenige Zeilen lang und lädt alle erdenklichen weiteren Tools herunter. Aber der Code sieht zumindest so aus, als würde er tatsächlich Asahi Linux installieren, keine Malware. Eine echte Garantie, dass das alles gefahrlos ist, gibt auch less nicht. Nun gut …

Zuerst aufräumen

Auf meinem Mac fristet eine uralte Asahi-Installation schon seit Jahren ein Schattendasein. Ich wollte das neue Asahi Linux einfach darüber installieren — aber das Installationsprogramm bietet dazu keine Möglichkeit. Die richtige Vorgehensweise sieht so aus: Zuerst müssen die drei damals eingerichteten Partitionen gelöscht werden. Dann kann das Installationsprogramm den partitionsfreien Platz auf der SSD für eine Neuinstallation nutzen.

Dankenswerterweise hat Asahi-Chefentwickler Hector Martin auf einer eigenen Seite eine Menge Know-how zur macOS-Partitionierung zusammengefasst. Dort gibt es auch gleich ein Script, mit dem alte Asahi-Linux-Installationen entfernt werden können. Gesagt, getan!

curl -L https://github.com/AsahiLinux/asahi-installer/raw/main/tools/wipe-linux.sh -o wipe-linux.sh
less wipe-linux.sh
sh wipe-linux.sh

THIS SCRIPT IS DANGEROUS!
DO NOT BLINDLY RUN IT IF SOMEONE JUST SENT YOU HERE.
IT WILL INDISCRIMINATELY WIPE A BUNCH OF PARTITIONS
THAT MAY OR MAY NOT BE THE ONES YOU WANT TO WIPE.

You are much better off reading and understanding this guide:
https://github.com/AsahiLinux/docs/wiki/Partitioning-cheatsheet

Press enter twice if you really want to continue.
Press Control-C to exit.

Started APFS operation on disk1
Deleting APFS Container with all of its APFS Volumes
Unmounting Volumes
Unmounting Volume "Asahi Linux - Data" on disk1s1
Unmounting Volume "Asahi Linux" on disk1s2
Unmounting Volume "Preboot" on disk1s3
Unmounting Volume "Recovery" on disk1s4
Unmounting Volume "Update" on disk1s5
...

Bei meinem Test hat das Script exakt getan, was es soll. Ein kurzer Test mit diskutil zeigt, dass sich zwischen Partition 2 und 3 eine Lücke von rund 200 GiB befindet. Dort war vorher Asahi Linux, und dorthin soll das neue Asahi Linux wieder installiert werden.

Zurück an den Start

Nach diesen Vorbereitungsarbeiten (natürlich habe ich vorher auch ein Backup aller wichtiger Daten erstellt, eh klar …) habe ich den zweiten Versuch gestartet.

sh alx.sh 

Bootstrapping installer:
  Checking version...
  Version: v0.7.1
  Downloading...
  Extracting...
  Initializing...

The installer needs to run as root.
Please enter your sudo password if prompted.
Password:*******

Welcome to the Asahi Linux installer!

This installer will guide you through the process of setting up
Asahi Linux on your Mac.

Please make sure you are familiar with our documentation at:
  https://alx.sh/w

Press enter to continue.

Collecting system information...
  Product name: Mac mini (M1, 2020)
  SoC: Apple M1
  Device class: j274ap
  Product type: Macmini9,1
  Board ID: 0x22
  Chip ID: 0x8103
  System firmware: iBoot-10151.81.1
  Boot UUID: 284E...
  Boot VGID: 284E...
  Default boot VGID: 284E...
  Boot mode: macOS
  OS version: 14.3 (23D56)
  OS restore version: 23.4.56.0.0,0
  Main firmware version: 14.3 (23D56)
  No Fallback System Firmware / rOS
  SFR version: 23.4.56.0.0,0
  SystemRecovery version: 22.7.74.0.0,0 (13.5 22G74)
  Login user: kofler

Collecting partition information...
  System disk: disk0

Collecting OS information...

Nach der Darstellung einiger Infos ermittelt das Script eine Partitionstabelle und bietet dann an, Asahi Linux im freien Bereich der Disk zu installieren (Option f).

Partitions in system disk (disk0):
  1: APFS [Macintosh HD] (795.73 GB, 6 volumes)
    OS: [B*] [Macintosh HD] macOS v14.3 [disk3s1s1, 284E...]
  2: (free space: 198.93 GB)
  3: APFS (System Recovery) (5.37 GB, 2 volumes)
    OS: [  ] recoveryOS v14.3 [Primary recoveryOS]

  [B ] = Booted OS, [R ] = Booted recovery, [? ] = Unknown
  [ *] = Default boot volume

Using OS 'Macintosh HD' (disk3s1s1) for machine authentication.

Choose what to do:
  f: Install an OS into free space
  r: Resize an existing partition to make space for a new OS
  q: Quit without doing anything

» Action (f): f

Im nächsten Schritt haben Sie die Wahl zwischen verschiedenen Fedora-Varianten. Ich habe mich für Gnome entschieden:

Choose an OS to install:
  1: Fedora Asahi Remix 39 with KDE Plasma
  2: Fedora Asahi Remix 39 with GNOME
  3: Fedora Asahi Remix 39 Server
  4: Fedora Asahi Remix 39 Minimal
  5: UEFI environment only (m1n1 + U-Boot + ESP)

» OS: 2

Jetzt beginnt die eigentliche Installation. Leider haben Sie keine Möglichkeit, auf die Partitionierung oder Verschlüsselung Einfluss zu nehmen. Es werden zwei kleine Partitionen für /boot (500 MiB) und /boot/efi eingerichtet (1 GiB). Den restlichen Platz füllt ein btrfs-Dateisystem ohne Verschlüsselung. Immerhin können Sie bei Bedarf festlegen, dass nicht der gesamte partitionsfreie Platz von Fedora Asahi Linux genutzt wird.

Downloading OS package info...
- 

Minimum required space for this OS: 14.94 GB

Available free space: 198.93 GB

How much space should be allocated to the new OS?
  You can enter a size such as '1GB', a fraction such as '50%',
  the word 'min' for the smallest allowable size, or
  the word 'max' to use all available space.

» New OS size (max): max

The new OS will be allocated 198.93 GB of space,
leaving 167.94 KB of free space.

Enter a name for your OS
» OS name (Fedora Linux with GNOME):  <return>

Using macOS 13.5 for OS firmware
Downloading macOS OS package info...
Creating new stub macOS named Fedora Linux with GNOME
Installing stub macOS into disk0s5 (Fedora Linux with GNOME)
Preparing target volumes...
Checking volumes...
Beginning stub OS install...
Setting up System volume...
Setting up Data volume...
Setting up Preboot volume...
Setting up Recovery volume...
Wrapping up...

Stub OS installation complete.

Adding partition EFI (524.29 MB)...
  Formatting as FAT...
Adding partition Boot (1.07 GB)...
Adding partition Root (194.83 GB)...
Collecting firmware...
Installing OS...
  Copying from esp into disk0s4 partition...
  Copying firmware into disk0s4 partition...
  Extracting boot.img into disk0s7 partition...
  Extracting root.img into disk0s6 partition...
Downloading extra files...
  Downloading gstreamer1-plugin-openh264-1.22.1-1.fc39.aarch64.rpm (1/3)...
  Downloading mozilla-openh264-2.3.1-2.fc39.aarch64.rpm (2/3)...
  Downloading openh264-2.3.1-2.fc39.aarch64.rpm (3/3)...
Preparing to finish installation...
Collecting installer data... 

To continue the installation, you will need to enter your macOS
admin credentials.

Password for kofler: **********

Setting the new OS as the default boot volume...
Installation successful!
Install information:
  APFS VGID: 0E76...
  EFI PARTUUID: 8d47...

Help us improve Asahi Linux!
We'd love to know how many people are installing Asahi and on what
kind of hardware. Would you mind sending a one-time installation
report to us?

This will only report what kind of machine you have, the OS you're
installing, basic version info, and the rough install size.
No personally identifiable information (such as serial numbers,
specific partition sizes, etc.) is included. You can view the
exact data that will be sent.

Report your install?
  y: Yes
  n: No
  d: View the data that will be sent

» Choice (y/n/d): y

Your install has been counted. Thank you! ❤

Zuletzt zeigt das Installations-Script genaue Anweisungen für den ersten Start von Asahi Linux an:

To be able to boot your new OS, you will need to complete one more step.
Please read the following instructions carefully. Failure to do so
will leave your new installation in an unbootable state.

Press enter to continue.

When the system shuts down, follow these steps:

1. Wait 25 seconds for the system to fully shut down.
2. Press and hold down the power button to power on the system.
   * It is important that the system be fully powered off before this step,
     and that you press and hold down the button once, not multiple times.
     This is required to put the machine into the right mode.
3. Release it once you see 'Loading startup options...' or a spinner.
4. Wait for the volume list to appear.
5. Choose 'Fedora Linux with GNOME'.
6. You will briefly see a 'macOS Recovery' dialog.
   * If you are asked to 'Select a volume to recover',
     then choose your normal macOS volume and click Next.
     You may need to authenticate yourself with your macOS credentials.
7. Once the 'Asahi Linux installer' screen appears, follow the prompts.

If you end up in a bootloop or get a message telling you that macOS needs to
be reinstalled, that means you didn't follow the steps above properly.
Fully shut down your system without doing anything, and try again.
If in trouble, hold down the power button to boot, select macOS, run
this installer again, and choose the 'p' option to retry the process.

Press enter to shut down the system.

Ich habe den Installationsprozess auch in Screenshots dokumentiert:

Asahi-Linux, Teil 1

Asahi-Installation, Teil 2

Reboot

Das Script fährt nun macOS herunter. Zum Neustart drücken Sie die Power-Taste und halten diese ca. 15 Sekunden lang gedrückt, bis ein Auswahlmenü erscheint. Dort wählen Sie Asahi Linux. Dieses wird allerdings nicht gleich gestartet, vielmehr muss nun die Bootkonfiguration fertiggestellt werden. Ich habe die folgenden Schritte mit Fotos dokumentiert.

Fedora Linux auswählen
Bootloader Installation
Bootloader-Installation (Forts.)
Bootloader-Installation (Forts.)
Bootloader-Installation (Forts.)
Bootloader-Installation (Forts.)
Meldungen beim ersten »echten« Linux-Bootprozess. »Failed to load« klingt schlimm, aber unmittelbar danach geht es zum Glück weiter.
Geschafft! Jetzt muss nur noch die Fedora-Installation abgeschlossen werden.

Fedora-Installation abschließen

Fedora Linux läuft zum ersten Mal. Nun müssen Sie einige grundlegende Konfigurationsschritte erledigen (User-Name + Passwort, WLAN, Sprache, Tastaturlayout, Update).

Wechseln zwischen macOS und Fedora

Der Bootprozess ist jetzt so eingerichtet, dass bei jedem Neustart automatisch Fedora gestartet wird. Wenn Sie macOS verwenden möchten, müssen Sie den Rechner zuerst komplett herunterfahren. Dann drücken Sie wieder die Power-Taste, halten Sie ca. 15 Sekunden gedrückt, bis das OS-Menü erscheint, und wählen macOS.

Unter macOS können Sie das Default-OS voreinstellen. Es ist aber leider nicht möglich, den Mac so zu konfigurieren, dass bei jedem Bootprozess automatisch das Auswahlmenü erscheint. Sie müssen sich für eine Hauptvariante entscheiden. Jeder Bootprozess in ein anderes OS bleibt mühsam (Power-Taste 15 Sekunden drücken …).

Default-OS einstellen

Geekbench

Wie schnell ist Linux im Vergleich zu macOS? Ich habe auf meinem Mac Mini M1 Geekbench 6 jeweils unter macOS und unter Fedora Asahi ausgeführt. Das Ergebnis: im Rahmen der Messgenauigkeit etwa gleich schnell.

               Single     Multi Core
---------- ----------   ------------
macOS            2360           8050
Fedora           2357           7998

Quellen/Links

  •  

Ubuntu 24.04 LTS wird Linux 6.8 Kernel erhalten

Es sieht ganz danach aus, als würde Canonical dem bald erscheinenden Ubuntu 24.04 LTS Noble Numbat den Linux-Kernel 6.8 spendieren. Die Entscheidung kommt etwas überraschend, da viele mit Kernel 6.6 LTS gerechnet haben. Linux-Kernel 6.8 soll erst im März als stabile Version erscheinen und daher ist die Sache eher knapp. Ubuntu 24.04 LTS erscheint laut Zeitplan Ende April. Im Ubuntu Discourse findest Du alle Details zu Linux-Kernel 6.8 in Ubuntu 24.04 LTS. Es gibt übrigens auch ein PPA für Version […]

Der Beitrag Ubuntu 24.04 LTS wird Linux 6.8 Kernel erhalten ist von bitblokes.de.

  •  

Canonical: Neues Werbeformat für Ubuntu Pro

Das Unternehmen Canonical ist der Herausgeber der beliebten Linux Distribution Ubuntu. Während alle sechs Monate eine Ubuntu Ausgabe erscheint, kommt jede vierte Ausgabe als LTS Ausgabe. Das bedeutet Long Term Support und steht für Langzeitpflege. Eine Ubuntu LTS Version erhält 5 Jahre LTS Support. Demnach erhält die derzeit aktuelle Ubuntu 22.04 LTS Version von Canonical...

Der Beitrag Canonical: Neues Werbeformat für Ubuntu Pro erschien zuerst auf MichlFranken.

  •  

MQTT-Broker Mosquitto als Docker Container installieren

Ein MQTT-Broker ist die Schnittstelle zwischen vielen IoT-Sensoren und Geräten, die Sensordaten auswerten oder Aktoren steuern. Das MQTT-Protokoll ist offen und sehr weit verbreitet. Es findet in der Industrie Anwendungen, ist aber auch in Smart Homes ist MQTT weit verbreitet.
MQTT ist ein sehr schlankes und schnelles Protokoll. Es wird in Anwendungen mit niedriger Bandbreite gerne angewendet.

MQTT funktioniert, grob gesagt, folgendermaßen: IoT-Geräte können Nachrichten versenden, die von anderen IoT-Geräten empfangen werden. Die Vermittlungsstelle ist ein sogenannter MQTT-Broker. Dieser empfängt die Nachrichten von den Clients. Gleichzeitig können diese Nachrichten von anderen Clients abonniert werden. Die Nachrichten werden in sog. Topics eingestuft, die hierarchisch angeordnet sind, z.B. Wohnzimmer/Klima/Luftfeuchtigkeit.

Home Assistant, oder ein anderer Client, kann diesen Topic abonnieren und den Nachrichteninhalt („Payload„) auswerten (z.B. 65%).

Home Assistant OS vs. Home Assistant Container

In Home Assistant OS und Supervisor gibt es ein Addon, das einen MQTT-Broker installiert. Das ist sehr einfach, komfortabel und funktioniert wohl recht zurverlässig. In den Installationsarten Home Assistant Container und Core gibt es diese Möglichkeit nicht. Hier muss man manuell einen MQTT-Broker aufsetzen.

In diesem Artikel beschäftige ich mich damit, wie man den MQTT-Brocker Mosquitto über Docker installiert. Anschließend zeige ich, wie man die Konfigurationsdatei gestaltet und eine Verbindung zu Home Assistant herstellt. Das Ergebnis ist dann ungefähr so, als hätte man das Addon installiert. Los gehts!

Schritt für Schritt: MQTT-Broker Mosquitto mit Docker installieren

Als MQTT-Broker verwende ich die weit verbreitete Software Mosquitto von Eclipse. Dieser wird auch von Home Assistant bevorzugt und ist derjenige Broker, den das Addon installieren würde.
Für diese Anleitung wird vorausgesetzt, dass Docker bereits installiert ist und eine SSH-Verbindung zum Server hergestellt werden kann.

Schritt 1: Zunächst erstellen wir ein paar Ordner, die wir später benötigen. Mosquitto wird später so konfiguriert, dass in diese Ordner alle wichtigen Dateien abgelegt werden. Dadurch kann man auf dem Filesystem des Servers Mosquitto konfigurieren und beobachten.

$ mkdir mosquitto
$ mkdir mosquitto/config 
$ mkdir mosquitto/data 
$ mkdir mosquitto/log

Schritt 2: Nun wird die Konfigurationsdatei für Mosquitto erstellt. Über diese Datei kann man das Verhalten von Mosquitto steuern.

$ nano config/mosquitto.conf
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
log_dest stdout
password_file /mosquitto/config/mosquitto.passwd
allow_anonymous false
listener 1883

Schritt 3: Mit dem folgenden Befehl lädt man sich das aktuelle Image von Eclipse Mosquitto auf den Server.

$ docker pull eclipse-mosquitto

Schritt 4: Mit dem folgenden Befehl wird der Docker-Container gestartet. Das ist der Schlüsselmoment, jetzt muss alles klappen.

$ docker run -it -p 1883:1883 -p 9001:9001 --name mosquitto -v /home/pi/mosquitto/config:/mosquitto/config -v /home/pi/mosquitto/data:/mosquitto/data -v /home/pi/mosquitto/log:/mosquitto/log eclipse-mosquitt

Die Flags bedeuten hierbei folgendes:

  • -p 1883:1883 Der genannte Port ist die Standardeinstellung für MQTT. Alles was auf diesen Port am Server ankommt, wird in den Mosquitto-Container geleitet.
  • -p 9001:9001 Über diesen Port laufen die Websocket-Anwendungen. Falls das nicht benötigt wird, kann man das weg lassen
  • name mosquitto Über diesen kurzen Namen können wir den Docker-Container steuern
  • -v <filesystem-Pfad>:<Container-Pfad> Die in Schritt 1 erstellten Ordner werden in den Container eingebunden

Wer lieber Docker Compose verwendet, trägt diesen Eintrag in seine *.yaml ein:

services:
    eclipse-mosquitto:
        stdin_open: true
        tty: true
        ports:
            - 1883:1883
            - 9001:9001
        restart: unless-stopped
        container_name: mosquitto
        volumes:
            - /home/pi/mosquitto/config:/mosquitto/config
            - /home/pi/mosquitto/data:/mosquitto/data
            - /home/pi/mosquitto/log:/mosquitto/log
        image: eclipse-mosquitto

Schritt 5: Checken, ob der Container ordnungsgemäß läuft. In der folgenden Liste sollte eine Zeile mit dem Mosquitto-Docker auftauchen. Dieser sollte außerdem „up“ sein. Falls nicht, nochmal versuchen den Container zu starten und kontrollieren, ob er läuft.

$ docker container ls -a
CONTAINER ID   IMAGE          COMMAND   CREATED        STATUS        PORTS    NAMES
xxxxxxxxx   eclipse-mosquitto "/init"   3 minutes ago   Up 2 minutes  [...]   mosquitto

Schritt 6: Sehr gut, der Container läuft. Es wird dringend empfohlen, den MQTT-Broker so abzusichern, dass nur angemeldete User darauf zugreifen können. Das ist ja schon in Schritt 2 in die Konfigurationsdatei geschrieben worden. Mit dem folgenden Befehl melden wir uns in der Shell innerhalb des Containers an und erstellen einen Benutzer. In diesem Beispiel mosquitto. Im Anschluss an diesen Befehl wird man zweimal gebeten, das Passwort für den User festzulegen. Ist das geschafft, läuft der MQTT-Broker auf dem Server. Herzlichen Glückwunsch!

$ docker exec -it mosquitto sh // öffnet die Shell innerhalb des Dockers
mosquitto_passwd -c /mosquitto/config/mosquitto.passwd mosquitto

Optional Schritt 7: Den MQTT-Broker bindet man in Home Assistant ein, indem man auf EinstellungenGeräte und Dienste+ Integration hinzufügen klickt. Im Suchfenster nach „MQTT“ suchen und die Zugangsdaten eingeben.
Die Server-Adresse findet man übrigens am schnellsten über ifconfig heraus.

The post MQTT-Broker Mosquitto als Docker Container installieren first appeared on bejonet - Linux | Smart Home | Technik.

  •  

Linux Desktop wie Windows oder macOS – so passe ich Gnome und Cinnamon an

Viele von euch haben mich oft gefragt, wie ich meine Desktops anpasse, wenn sie meine Anpassungen in den Videos sehen. Aus diesem Grund präsentiere ich heute ein etwas anderes Format, in dem ich euch zeige, wie ich meine Desktops gestalte. Kurze Zusammenfassung der Ausgangslage: Dies ist eine Fortsetzung meines Beitrags von 2020 über die Anpassung...

Der Beitrag Linux Desktop wie Windows oder macOS – so passe ich Gnome und Cinnamon an erschien zuerst auf MichlFranken.

  •  

LibreOffice Getting Started Guide 7.6 ist verfügbar

Der Getting Started Guide von LibreOffice wurde aktualisiert. Ab sofort gibt es Version 7.6. In der neuesten Versionen werden auch Funktionen behandelt, die für LibreOffice 7.6 spezifisch sind. Das Handbuch richtet sich an alle, die einen Schnellstart mit LibreOffice 7.6 benötigen. Im Buch werden Writer (Textverarbeitung), Calc (Tabellenkalkulation), Impress (Präsentationen), Draw (Vektorzeichnungen), Math (Gleichungseditor) und Base (Datenbank) vorgestellt. Du kannst den Leitfaden von der Dokumentations-Website sowie aus dem Bücherregal herunterladen. Du kannst den Getting Started Guide 7.6 als PDF oder […]

Der Beitrag LibreOffice Getting Started Guide 7.6 ist verfügbar ist von bitblokes.de.

  •  

Firefox .deb Paket unter Linux Mint, Ubuntu, Debian … installieren

Ab Mozilla Firefox 122 bietet das Unternehmen nun ein .deb Paket für Linux an. Du kannst den Browser damit unter Ubuntu und Derivaten wie Linux Mint sowie Debian und Derivaten installieren. Mozilla hat eine Anleitung zur Verfügung gestellt, wie Du Firefox als .deb unter Debian, Linux Mint oder Ubuntu und so weiter installieren kannst. Der Vorteil der hier gezeigten Methode ist, dass Du immer die aktuelle Version von Firefox erhältst, sobald sie veröffentlicht wurde. Du musst unter Ubuntu auch nicht […]

Der Beitrag Firefox .deb Paket unter Linux Mint, Ubuntu, Debian … installieren ist von bitblokes.de.

  •  

Tauche ein in die Zukunft: Fedora Silverblue im Test

Fedora Silverblue ist eine Variante des Fedora-Betriebssystems, die sich durch ihre innovative Ansätze in Bezug auf Softwareverwaltung und Systemkonfiguration auszeichnet. Hier sind einige der wichtigsten Merkmale von Fedora Silverblue Fedora Silverblue im Überblick Fedora Silverblue präsentiert eine aufregende Perspektive auf das Fedora-Betriebssystem, indem es sich auf Unveränderlichkeit, fortschrittliche Systemverwaltung und moderne Softwarebereitstellung konzentriert. Mit einem...

Der Beitrag Tauche ein in die Zukunft: Fedora Silverblue im Test erschien zuerst auf MichlFranken.

  •  

GPIO Reloaded III: Kamera

Das ist der dritte Teil einer Mini-Serie zur GPIO-Nutzung am Raspberry Pi 5:

  • GPIO Reloaded I: Python (gpiozero, lgpio, gpiod, rpi-lgpio)
  • GPIO Reloaded II: Bash (gpiod, gpioget, gpioset, pinctrl)
  • GPIO Reloaded III: Kamera (rpicam-xxx, Picamera2)

Genau genommen hat die Kamera-Nutzung nicht unmittelbar etwas mit GPIOs zu tun. Allerdings ist für die Kommunikation mit der Kamera ebenfalls der neu im Pi 5 integrierte RP1-Chip verantwortlich. Der Chip ist der Grund, weswegen alte Kamera-Tools auf dem Raspberry Pi 5 nicht mehr funktionieren. Bevor Sie zu schimpfen beginnen: Der RP1 hat viele Vorteile. Unter anderem können Sie nun zwei Kameras gleichzeitig anschließen und nutzen und höhere Datenmengen übertragen (wichtig für Videos).

Beachten Sie, dass Sie beim Raspberry Pi 5 zum Kamera-Anschluss ein neues, schmaleres Kabel benötigen!

Kamera-Modul 3 mit neuem, FPC-kompatiblen Kabel
Kamera-Modul 3 mit einem neuen Anschlusskabel mit schmaler Kontaktleiste

Veraltet: raspistill, raspivid, picamera2

Im Terminal bzw. in Bash-Scripts funktionieren raspistill, raspivid usw. nicht mehr. Sie müssen stattdessen rpicam-still, rpicam-vid etc. einsetzen.

In Python-Scripts müssen Sie Abschied vom picamera-Modul nehmen. Stattdessen gibt es das vollkommen neue Modul Picamera2. Es bietet (viel) mehr Funktionen, ist aber in der Programmierung komplett inkompatibel. Vorhandene Scripts können nicht portiert werden, sondern müssen neu entwickelt werden.

Sowohl die rpicam-xxx-Kommandos als auch das Picamera2-Modul greifen auf die ebenfalls neue Bibliothek libcamera2 zurück.

Im einfachsten Anwendungsfall erzeugen Sie ein Picamera2-Objekt, machen mit der Methode start_and_capture_file ein Foto und speichern dieses in eine Datei. Dabei kommt die volle Auflösung der Kamera zur Anwendung, beim Camera Module 3 immerhin fast 4600×2600 Pixel.

#!/usr/bin/env python3
# Beispieldatei camera.py
from picamera2 import Picamera2
cam = Picamera2()
# ein Foto machen und speichern
cam.start_and_capture_file("test.jpg")

Anstelle von start_and_capture_file gibt es zwei weitere Methoden, um ebenso unkompliziert Bilderfolgen bzw. Videos aufzunehmen:

# 10 Bilder im Abstand von 0,5 Sekunden aufnehmen
# mit Dateinamen in der Form series-0003.jpg
cam.start_and_capture_files("series-{:0>4d}.jpg", 
                            num_files=10, 
                            delay=0.5)
# Video über 10 Sekunden aufnehmen (640x480 @ 30 Hz, H.264/AVC1)
cam.start_and_record_video("test.mp4", duration=10)

rpicam-xxx-Kommandos

Zum Test der Kamera sowie zur Aufnahme von Bildern und Videos stehen die folgenden neuen Kommandos zur Auswahl:

  • rpicam-hello: zeigt für fünf Sekunden der Preview-Fenster mit dem Bild der Kamera an
  • rpicam-jpeg: nimmt ein Foto auf und speichert es als JPEG-Datei
  • rpicam-still: nimmt ein Foto auf und speichert es (mehr Optionen als rpicam-jpeg, Optionen etwas kompatibler zu raspistill)
  • rpicam-vid: nimmt ein Video auf und speichert es oder gibt den Video-Stream an externe Tools (livav/ffmpeg) weiter
  • rpicam-raw: speichert RAW-Videomaterial in einer Datei

Die Kommandos sind mit all ihren Optionen großartig dokumentiert. Es gibt zwar keine man-Seiten, aber dafür liefern die Kommandos mit der Option -h eine lange Liste aller Optionen (z.B. rpicam-still -h). Ich beschränke mich hier auf einige einfache Anwendungsbeispiele.

# fünf Sekunden lang ein Vorschaufenster anzeigen, dann 
# ein Foto aufnehmen und speichern
rpicam-jpeg -o image.jpg

# ohne Vorschau, Aufnahme nach einer Sekunde (1000 ms)
rpicam-jpeg -n -t 1000 -o image.jpg

# wie oben, aber Debugging-Ausgaben nicht anzeigen
rpicam-jpeg -n -t 1000 -v 0 -o image.jpg 

# Bildgröße 1280x800
rpicam-jpeg --width 1280 --height 800 -o image.jpg

# heller/dunkler (EV Exposure Compensation)
rpicam-jpeg --ev 0.5  -o brighter.jpg
rpicam-jpeg --ev -0.5 -o darker.jpg

# erstellt ein 10 Sekunden langes Video (10.000 ms) 
# 640x480@30Hz, H264-Codec
rpicam-vid -t 10000 -o test.mp4

# wie vorher, aber höhere Auflösung
rpicam-vid --width 1024 --height 768 -t 10000 -o test.mp4

Falls Sie mehr als eine Kamera angeschlossen haben, können Sie diese mit rpicam-hello --list-cameras auflisten. Die bei einer Aufnahme gewünschte Kamera können Sie mit der Option rpicam-xxx --camera <n> festlegen.

picamera2-Modul für Python-Scripts

picamera2 ist ein relativ neues Python-Modul. Es ersetzt das früher gebräuchliche Modul picamera. Der Hauptvorteil von picamera2 besteht darin, dass das Modul zu aktuellen Raspberry-Pi-Modellen kompatibel ist. Beim Raspberry Pi 5 kommt picamera2 auch mit dem Fall zurecht, dass Sie zwei Kameras gleichzeitig an Ihren Minicomputer angeschlossen haben.

Eine umfassende Referenz aller Klassen und Methoden finden Sie in der exzellenten Dokumentation (nur im PDF-Format verfügbar), die allerdings weit mehr technische Details behandelt, als Sie jemals brauchen werden. Eine Menge Beispiel-Scripts finden Sie auf GitHub.

Mit create_still_configuration können Sie in diversen optionalen Parametern Einstellungen vornehmen. Das resultierende Konfigurationsobjekt übergeben Sie dann an die configure-Methode. Wichtig ist, dass Sie das Foto nicht mit start_and_capture_file aufnehmen, sondern dass Sie die Methoden start und capture_file getrennt ausführen. Die folgenden Zeilen zeigen, wie Sie ein Bild in einer Auflösung von 1024×768 Pixel aufnehmen. Die sleep-Aufforderung verbessert die Qualität des Bilds. Sie gibt der Kamera-Software etwas Zeit, um die Aufnahme zu fokussieren und richtig zu belichten.

#!/usr/bin/env python3
from picamera2 import Picamera2, Preview
import time

# ein Foto in reduzierter Auflösung aufnehmen
cam = Picamera2()
myconfig = cam.create_still_configuration(
  main={"size": (1024, 768)} )
cam.configure(myconfig)
cam.start()
time.sleep(0.5)
cam.capture_file("1024x768.jpg")

Mit Transformationen können Sie das aufgenommene Bild vertikal und horizontal spiegeln. Falls Sie die Kamerakonfiguration während der Ausführung eines Scripts ändern möchten, müssen Sie die Kamera vorher stoppen und danach neu starten.

# (Fortsetzung des obigen Listings)
cam.stop()
from libcamera import Transform
mytrans = Transform(hflip=True)
myconfig = cam.create_still_configuration(
  main={"size": (1024, 768)},
  transform=mytrans)  
cam.configure(myconfig)
cam.start()
time.sleep(0.5)
cam.capture_file("1024x768-hflip.jpg")

Massive Video-Probleme

Bei der Aufnahme von Videos haben Sie die Wahl zwischen drei Encodern, die die aufgenommenen Bilder in Video-Dateien umzuwandeln:

  • H264Encoder (Hardware-Encoder für H.264, kommt per Default zum Einsatz, max. 1080p@30 Hz)
  • MJPEGEncoder (Hardware-Encoder für Motion JPEG = MJPEG)
  • JpegEncoder (Software-Encoder für MJPEG)

Hardware-Encoding steht nur auf dem Raspberry Pi 4 (H.264 und MJPEG) und dem Raspberry Pi 5 (nur H.264) zur Verfügung. Beim Raspberry Pi 5 läuft der MJPEGEncoder also per Software.

Das folgenden Script soll ein Video im Format 720p aufnehmen und gleichzeitig ein Vorschaubild anzeigen. Dabei soll der H.264-Codec eingesetzt werden.

#!/usr/bin/env python3
from picamera2 import Picamera2, Preview
from picamera2.encoders import H264Encoder, Quality
import time
cam = Picamera2()
myconfig = cam.create_video_configuration(
    main={"size": (1280, 720)})        # Auflösung 720p
myencoder = H264Encoder()
cam.configure(myconfig)
cam.start_preview(Preview.QTGL)
time.sleep(0.5)
cam.start_recording(myencoder, 
                    "test-720p.mp4", 
                    quality=Quality.MEDIUM)
time.sleep(10)
cam.stop_recording()
cam.stop_preview()

Das Script zeigt zwar keine Fehlermeldungen an, allerdings lässt sich die Video-Datei nicht abspielen, weder mit VLC am Raspberry Pi noch mit anderen Video-Playern auf anderen Rechnern. Ich habe tagelang mit den Video-Funktionen von Picamera2 experimentiert, aber die resultierenden Videos waren meist schwarz oder enthielten nur ein Bild, das am Beginn der Aufnahme entstanden ist. Auch die auf der folgenden Seite gesammelten Beispiel-Scripts zum Video-Recording funktionierten bei meinen Tests entweder gar nicht oder nur mit Einschränkungen:

https://github.com/raspberrypi/picamera2/tree/main/examples

Fazit: Die Video-Funktionen von Picamera2 sind aktuell (Anfang 2024) ebenso ambitioniert wie unausgereift. Es ist zu hoffen, dass neue Versionen von libcamera und Picamera2 und eine bessere Dokumentation der Grundfunktionen in Zukunft Abhilfe schaffen. Was nützen coole Spezial-Features, wenn es schon bei den einfachsten Grundfunktionen Probleme gibt?

Quellen/Links

  •  

Ubuntu 24.04 LTS erhält 12 Jahre lang Updates

Nur noch wenige Monate bis zur lange erwarteten Freigabe der nächsten Ubuntu Long-Term-Support-Version (LTS), nämlich Ubuntu 24.04 LTS “Noble Numbat”. Nicht zu vergessen ist, dass Canonical im Dezember letzten Jahres einen Fahrplan geteilt hat, der zeigte, woran das Desktop-Team für Ubuntu 24.04 arbeitete. Selbst die frühere Ubuntu 23.10-Version könnte als starker Indikator dafür dienen, was...

Der Beitrag Ubuntu 24.04 LTS erhält 12 Jahre lang Updates erschien zuerst auf MichlFranken.

  •  

Chemnitzer Linux-Tage 2024

Unter dem Motto „Zeichen setzen“ finden am 16. und 17. März 2024 wieder die Chemnitzer Linux-Tage statt. Die Veranstalter hoffen wieder auf einen großen Zuspruch im Hörsaalgebäude der TU Chemnitz an der Reichenhainer Straße.

Eintrittskarten zur Veranstaltung wird es im Vorverkauf geben. Da die Anzahl der Tickets aber begrenzt ist, wird es an der Tageskasse nur Restkarten geben.

Auch 2024 haben sich die Chemnitzer Linux-Tage einen Platz an einem März-Wochenende gesucht. Also Kalender gezückt und den 16. und 17. März 2024 dick einkreisen! Es lohnt sich bestimmt.

Eintrittskarten sind an der Tageskasse erhältlich.

Wir freuen uns sehr, euch im März vor Ort in Chemnitz in gewohnter Umgebung wiederzusehen. Über unsere Pressemitteilungen, Social Media könnt ihr euch diesbezüglich auf dem Laufenden halten.

Quelle: chemnitzer.linux-tage.de
  •  

GPIO Reloaded II: Bash

Das ist der zweite Teil einer Mini-Serie zur GPIO-Nutzung am Raspberry Pi 5:

  • GPIO Reloaded I: Python (gpiozero, lgpio, gpiod, rpi-lgpio)
  • GPIO Reloaded II: Bash (gpiod, gpioget, gpioset, pinctrl)
  • GPIO Reloaded III: Kamera (rpicam-xxx, Picamera2)

Zu den wichtigsten Neuerungen beim Raspberry Pi 5 zählt nicht nur der viel schnellere SoC (System-on-a-Chip), sondern auch ein eigener I/O-Controller, der als eigener Chip realisiert ist (RP1). Dieser I/O-Chip bringt mit sich, dass etablierte Mechanismen zur GPIO-Steuerung nicht mehr funktionieren. Besonders stark betroffen sind Kommandos, die im Terminal oder in Bash-Scripts aufgerufen werden.

Veraltet: WiringPi, »gpio«, »raspi-gpio« und »pigpiod/pigs«

Im Verlauf eines Jahrzehnts haben sich diverse Kommandos etabliert, die mittlerweile veraltet sind. Dazu zählt das Kommando gpio aus dem WiringPi-Projekt, das bereits 2019 eingestellt wurde. Ebenfalls verabschieden müssen Sie sich von dessen Nachfolger-Kommando raspi-gpio: Das Kommando ist nicht mit dem neuen I/O-Chip RP1 kompatibel. Glücklicherweise lässt sich das Kommando relativ einfach durch pinctrl ersetzen.

Deutlich ärgerlicher ist, dass auch der beliebte Dämon pigpiod und das dazugehörende Kommando pigs der Kompatibilität zu RP1 zum Opfer gefallen ist. Absurderweise kann der Dienst Anfang 2024 im Raspberry-Pi-Konfigurationsprogramm als GPIO-Fernzugriff scheinbar weiterhin aktiviert werden.

Der »GPIO-Fernzugriff« kann scheinbar weiterhin aktiviert werden. Er ist aber inkompatibel zum Pi 5!

journalctl -u pigpiod beweist aber, dass der Dienst nicht funktioniert:

journalctl -u pigpiod

systemd[1]: Starting pigpiod.service - Daemon required to control GPIO pins via pigpio...
systemd[1]: Started pigpiod.service - Daemon required to control GPIO pins via pigpio.
pigpiod[88161]: 2023-12-29 11:02:24 gpioHardwareRevision: unknown rev code (d04170)
pigpiod[88161]: 2023-12-29 11:02:24 initCheckPermitted:
pigpiod[88161]: +---------------------------------------------------------+
pigpiod[88161]: |Sorry, this system does not appear to be a raspberry pi. |
pigpiod[88161]: |aborting.                                                |
pigpiod[88161]: +---------------------------------------------------------+
pigpiod[88161]: Can't initialise pigpio library
systemd[1]: pigpiod.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: pigpiod.service: Failed with result 'exit-code'.

Das Problem ist bekannt, aber es sieht nicht so aus, als könnte es behoben werden: https://github.com/joan2937/pigpio/issues/589

gpioget und gpioset

Welche Kommandos funktionieren dann noch? Sie haben die Wahl zwischen den gpioxxx-Kommandos aus dem Paket gpiod sowie pinctrl (siehe den folgenden Abschnitt). Das Paket gpiod ist standardmäßig installiert. Die darin enthaltenen Kommandos nutzen zur Kommunikation mit dem Kernel die Device-Dateien /dev/gpiochip<n> und die Bibliothek libgpiod2.

Der größte Nachteil der Kommandos gpioget, gpioset usw. besteht darin, dass Sie als ersten Parameter die GPIO-Chip-Nummer angeben müssen. Diese variiert je nach Raspberry-Pi-Modell. Bei den Modellen der Serie 1 bis 4 müssen Sie die Nummer 0 angeben, ab Modell 5 die Nummer 4.

# LED ein- und ausschalten, die über den GPIO 7 gesteuert wird
# (= Pin 26 des J8-Headers)

# gpioset auf dem Raspberry Pi 5
gpioset 4 7=1; sleep 3; gpioset 4 7=0

# gpioset auf dem Raspberry Pi 1 bis 4
gpioset 0 7=1; sleep 3; gpioset 0 7=0

Warum variiert die GPIO-Chip-Nummer? Weil beim Raspberry Pi 4 die Kernel-Schnittstelle /dev/gpiochip0 für die GPIO-Steuerung verantwortlich ist (das sind in den BCM 2711 integrierte Funktionen), beim Pi 5 aber der RP1 (ein externer Chip) mit der Kernel-Schnittstelle /dev/gpiochip4. Informationen darüber, welche GPIO-Schnittstellen es gibt und welche GPIO-Funktion wie »verdrahtet« ist, geben die Kommandos gpiodetect und gpioinfo. Die folgenden Ausgaben gelten für den Raspberry Pi 5:

gpiodetect  

  gpiochip0 [gpio-brcmstb@107d508500] (32 lines)
  gpiochip1 [gpio-brcmstb@107d508520] ( 4 lines)
  gpiochip2 [gpio-brcmstb@107d517c00] (17 lines)
  gpiochip3 [gpio-brcmstb@107d517c20] ( 6 lines)
  gpiochip4 [pinctrl-rp1]             (54 lines)


gpioinfo    

  gpiochip0 - 32 lines:
    line   0:   "-"              unused   input  active-high 
    line   1:   "2712_BOOT_CS_N" "spi10 CS0" output active-low
    line   2:   "2712_BOOT_MISO" unused   input active-high 
    ...
  gpiochip1 - 4 lines:
    line   0: "WIFI_SDIO_D0"     unused   input active-high 
    line   1: "WIFI_SDIO_D1"     unused   input active-high 
    ...
  gpiochip2 - 17 lines:
    line   0: "RP1_SDA"          unused   input  active-high 
    line   1: "RP1_SCL"          unused   input  active-high 
    line   2: "RP1_RUN" "RP1 RUN pin"     output active-high 
    ...
  gpiochip3 - 6 lines:
    line   0: "HDMI0_SCL"        unused   input  active-high 
    line   1: "HDMI0_SDA"        unused   input  active-high 
    ...
  gpiochip4 - 54 lines:
    line   0: "ID_SD"            unused   input  active-high 
    line   1: "ID_SC"            unused   input  active-high 
    line   2: "PIN3"             unused   input  active-high 
    line   3: "PIN5"             unused   input  active-high 
    line   4: "PIN7"        "onewire@0"   output active-high
    line   5: "PIN29"       "onewire@0"   output active-low
    line   6: "PIN31"            unused   input  active-high 
    line   7: "PIN26"            unused   input  active-high 
    line   8: "PIN24"            unused   input  active-high 
    line   9: "PIN21"            unused   input  active-high 
    line  10: "PIN19"            unused   input  active-high 
    ...
    line  28: "PCIE_RP1_WAKE"    unused   input  active-high 
    line  29: "FAN_TACH"         unused   input  active-high 
    line  30: "HOST_SDA"         unused   input  active-high 
    line  31: "HOST_SCL"         unused   input  active-high 
    line  32: "ETH_RST_N"   "phy-reset"  output  active-low 
    ...

Um Scripts zu programmieren, die universell funktionieren, können Sie die folgenden Zeilen in den Code einbauen:

# chip=4 für RPi5, chip=0 für ältere Modelle
if gpiodetect | grep -q "pinctrl-rp"; then
  chip=4
else
  chip=0
fi

In der einfachsten Form schalten Sie mit gpioset einen GPIO-Ausgang auf High oder Low. In den folgenden Beispielen bezieht sich der erste Parameter auf die gpiochip-Nummer. 7 gibt die GPIO-Nummer in BCM-Nomenklatur an, 1 oder 0 den gewünschten Zustand:

gpioset $chip 7=1   # GPIO 7 (Pin 26) auf High stellen
gpioset $chip 7=0   # GPIO 7 (Pin 26) auf Low stellen

Sie können auch mehrere Ausgänge auf einmal steuern (hier GPIO 7, 8 und 25):

gpioset $chip 7=0 8=1 25=0 

Durch diverse Optionen können Sie weitere Funktionen steuern (siehe auch man gpioset):

  • --bias=as-is|disable|pull-down|pull-up aktiviert die internen Pull-up- oder Pull-down-Widerstände.
  • --mode=exit|wait|time|signal gibt an, wie lange das Kommando laufen soll. Standardmäßig gilt exit, das Kommando wird also sofort beendet. Mit wait wartet das Programm, bis der Benutzer [Return] drückt. Bei der Einstellung time können Sie mit --sec=<n> oder --usec=<n> die gewünschte Wartezeit einstellen. signal bedeutet, dass das Programm weiterläuft, bis es mit [Strg]+[C] beendet wird.

  • --background führt das Kommando als Hintergrunddienst weiter.

gpioget funktioniert analog zu gpioset: Sie übergeben im ersten Parameter die gpiochip-Nummer (in aller Regel 0), im zweiten Parameter die BCM-Nummer des GPIOs, dessen Input Sie auswerten wollen. Das Ergebnis des Kommandos lautet 0 oder 1, je nachdem, welchen Zustand der Eingang hat.

gpioget $chip 9   # Zustand von GPIO 9 (Pin 21) auslesen
0

pinctrl

Auch mit pinctrl aus dem Paket raspi-utils können Sie GPIO-Funktionen steuern. Der Vorteil von pinctrl besteht darin, dass das Kommando zur Zeit mit allen Raspberry-Pi-Modellen kompatibel ist. Eine Fallunterscheidung, ob das Script auf einem alten oder neuen Modell mit RP1-Chip läuft, entfällt. Außerdem ist das Kommando syntaktisch weitestgehend zu raspi-gpio kompatibel.

Gegen den Einsatz des Kommandos spricht der Umstand, dass das Kommando laut pinctrl -h (der einzigen mir bekannten Dokumentation) nur für Debugging-Zwecke gedacht ist.

Die folgende Aufzählung fasst die wichtigsten Anwendungen des Kommandos zusammen:

  • pinctrl get [gpionr] ermittelt den aktuellen Status aller GPIOs bzw. des angegebenen GPIOs.
  • pinctrl funcs [gpionr] ermittelt, welche alternativen Funktionen der angegebene GPIO bzw. alle GPIOs erfüllen können.

  • pinctrl set gpionr options verändert den Status des angegeben GPIOs. Mögliche Optionen sind:

    • ip = Input
    • op = Output
    • dl = Zustand Low (Drive Low)
    • dh = Zustand High (Drive High)
    • pu = Pull-up-Widerstand aktiv
    • pd = Pull-down-Widerstand aktiv
    • pn = keine Pull-up/down-Funktion
    • a0 bis a7 = alternative Funktion n aktivieren
    • no = Deaktivieren (no function)

Soweit sich sinnvolle Kombinationen ergeben, dürfen mehrere der obigen Optionen auf einmal übergeben werden, jeweils getrennt durch Leerzeichen. Welche alternative Funktionen ein GPIO unterstützt und wie sie nummeriert sind, geht aus pinctrl funcs hervor.

Das folgende Kommando ermittelt, welche Funktionen der GPIO mit der BCM-Nummer 23 unterstützt. Auf dem Raspberry Pi ist dieser GPIO mit Pin 16 des J8-Headers verbunden. GPIO23 kann diverse Funktionen übernehmen:

pinctrl funcs 23

  23, PIN16/GPIO23, SD0_CMD, DPI_D19, I2S0_SDO1, SCL3, 
  I2S1_SDO1, SYS_RIO023, PROC_RIO023, PIO23

Wenn Sie über Pin 26 (BCM-Nummer 07) eine Leuchtdiode angeschlossen haben, dann können Sie die LED wie folgt ein- und ausschalten:

pinctrl set 7 op dh   # LED an Pin 26 ein
pinctrl set 7 op dl   # LED an Pin 26 aus

Quellen/Links

  •  

GPIO Reloaded I: Python

Dieser Artikel ist der Auftakt einer Mini-Serie, die sich mit der Script-Programmierung des Raspberry Pi 5 beschäftigt. Geplant sind drei Artikel:

  • GPIO Reloaded I: Python (gpiozero, lgpio, gpiod, rpi-lgpio)
  • GPIO Reloaded II: Bash (gpiod, gpioget, gpioset, pinctrl)
  • GPIO Reloaded III: Kamera (rpicam-xxx, Picamera2)

Hinter den Kulissen hat sich mit der Vorstellung des Raspberry Pi 5 mehr geändert, als es in den ersten Testberichten den Anschein hatte. Schuld daran ist der neue I/O-Chip RP1, der unter anderem für die Kommunikation mit der GPIO-Leiste und der Kamera zuständig ist. Der RP1 bringt natürlich viele Vorteile mit sich (u.a. die Möglichkeit, zwei Kameras anzuschließen und größere Bild- bzw. Videomengen zu verarbeiten); er führt aber auch dazu, dass über Jahre etablierte Module und Kommandos nicht mehr funktionieren. Ja, die Raspberry Pi Foundation hat vorgearbeitet und empfiehlt schon eine Weile alternative Werkzeuge. Aber aus Bequemlichkeit blieben viele Programmierer bei langjährig bewährten Tools. Damit ist jetzt Schluss. Wer den Pi 5 als Maker-Tool nutzen will, muss umlernen.

Wo ist das Problem?

In der Vergangenheit gab es mehrere GPIO-Kommuniktionsmechanismen, z.B. das Lesen/Schreiben von sysfs-Dateien (sys/class/gpio) bzw. das direkte Verändern von Speicherbereichen. Diese Verfahren haben schon in der Vergangenheit oft Probleme bereitet. Beim Raspberry Pi 5 funktionieren sie schlicht nicht mehr. Neue Verfahren verwenden die lgpio-Bibliothek, die wiederum auf eine neue Kernel-Schnittstelle zurückgreift. Diese ist nach außen hin durch die Device-Dateien /dev/gpiochip* sichtbar.

Aus Python-Sicht ist insbesondere das Modul rpi.gpio betroffen. Es ist inkompatibel zum Pi 5 und es gibt anscheinend auch keine Pläne, den Code RP1-kompatibel zu reorganisieren.

Welche Alternativen gibt es?

Schon seit einiger Zeit empfiehlt die Raspberry Pi Foundation, das gpiozero-Modul zu verwenden. Es stellt für den Einstieg gut geeignete Klassen wie LED oder Button zur Verfügung, eignet sich aber auch für anspruchsvollere Maker-Aufgaben.

Wenn Sie sich partout nicht mit gpiozero anfreunden wollen, gibt es drei Alternativen: lgpio, gpiod und rpi-lgpio.

gpiozero

Das Python-Modul gpiozero macht die Steuerung von Hardware-Komponenten durch GPIOs besonders einfach. Für häufig benötigte Hardware-Komponenten gibt es eigene Klassen. Dazu zählen unter anderem:

  • LED (Leuchtdiode ein-/ausschalten)
  • PWMLED (Helligkeit einer Leuchtdiode mit Software Pulse Width Modulation steuern)
  • RGBLED (dreifarbige LED, die über drei GPIO-Ausgänge gesteuert wird)
  • TrafficLights (Kombination aus einer roten, gelben und grünen Leuchtdiode)
  • MotionSensor (für PIR-Bewegungssensoren)
  • LightSensor (Lichtdetektor)
  • Button (Taster)
  • Buzzer (Summer)
  • Motor (zur Steuerung von zwei GPIOs für Vorwärts- und Rückwärts-Signale)
  • Robot (zur Steuerung mehrerer Motoren)
  • MCP3008 (für den gleichnamigen A/D-Converter)

Das Modul gpiozero ist umfassend dokumentiert:

https://gpiozero.readthedocs.io/en/latest

Ein Hello-World-Beispiel sieht so aus:

#!/usr/bin/env python3
from gpiozero import LED
import time
myled = LED(7)    # BCM-Nummer 7 = Pin 26 des J8-Headers
print("LED ein")
myled.on()
time.sleep(1)
print("LED aus und Programmende")
myled.off()

Dieses Script setzt voraus, dass Pin 26 der GPIO-Leiste (intern BCM/GPIO 7) über einen Vorwiderstand mit einer Leuchtdiode verbunden ist. Anstelle der GPIO-Nummer gibt es einige alternative Adressierungsverfahren, wobei Sie den gewünschente GPIO-Kontakt als Zeichenkette angeben:

# alternative, gleichwertige Schreibweisen
myled = LED(7)          # GPIO 7 = BCM-Nummer 7
myled = LED("GPIO7")    # GPIO 7 (Achtung, nicht "GPIO07")
myled = LED("BCM7")     # BCM 7  (nicht "BCM07")
myled = LED("BOARD26")  # Pin 26 auf der GPIO-Leiste des Boards
myled = LED("J8:26")    # Pin 26 des J8-Headers (= GPIO-Leiste)

lgpio

lgpio (der Projektname lautet noch kürzer lg) ist eine C-Bibliothek zur lokalen Steuerung der GPIOs. Das gerade erwähnte Modul gpiozero verwendet intern seit Version 2.0 die lgpio-Bibliothek. Alternativ stellt das gleichnamige lgpio-Modul eine direkte Python-Schnittstelle zur lgpio-Bibliothek her. Deren Funktionen sind Hardware-näher implementiert. Der GPIO-Zugriff verbirgt sich also nicht hinter Klassen wie LED oder Button, vielmehr werden die GPIO-Schnittstellen direkt angesprochen.

Ein Hello-World-Beispiel mit lgpio sieht so aus:

#!/usr/bin/env python3
import lgpio, time

# Zugriff auf /dev/gpiochip4 für RP1-Chip
handle = lgpio.gpiochip_open(4)

# Raspberry Pi 4 und früher:
# handle = lgpio.gpiochip_open(0)

# GPIO 7 = Pin 26 als Output verwenden
led = 7
lgpio.gpio_claim_output(handle, led)  

# LED zehnmal ein- und ausschalten
for i in range(10):
    print("LED ein")
    lgpio.gpio_write(handle, led, 1)
    time.sleep(1)
    print("LED aus")
    lgpio.gpio_write(handle, led, 0)
    time.sleep(1)

# nichts blockieren
lgpio.gpiochip_close(handle)

Beachten Sie, dass die Initialisierung des Handles für den GPIO-Zugriff je nach Modell variiert! Bei den älteren Raspberry-Pi-Modellen bis einschließlich 4B/400 müssen Sie handle = lgpio.gpiochip_open(0) ausführen. Beim Raspberry Pi 5 ist für die GPIO-Steuerung dagegen der neue RP1-Chip zuständig, den Sie mit gpiochip_open(4) ansprechen. (Die richtige Chip-Nummer stellen Sie am einfachsten mit dem Kommando gpioinfo aus dem Paket gpiod fest. Der hier benötigte Kontakt GPIO7 heißt in gpioinfo ein wenig verwirrend PIN7.)

Wenn Sie mit Python ein lgpio-Script schreiben wollen, das auf allen Pi-Modellen funktioniert, müssen Sie Code zur Erkennung des Pi-Modells integrieren.

Weiterer Codebeispiele finden Sie hier:

rpi-lgpio

Was tun, wenn Sie Code für ältere Modelle entwickelt haben, den Sie nun für den Raspberry Pi 5 portieren möchten? Am schnellsten wird dies oft mit dem neuen Modul rpi-lgpio gelingen, das weitgehende Kompatibilität zu rpi.gpio verspricht.

Vor der Installation müssen Sie das in Raspberry Pi OS standardmäßig installierte Modul rpi.gpio installieren. Eine Parallelinstallation beider Module ist ausgeschlossen, weil rpi.gpio und rpi-lgpio den gleichen Modulnamen verwenden (import RPi.GPIO).

sudo apt remove python3-rpi.gpio

Da es in Raspberry Pi OS für rpi-lgpio kein fertiges Paket, installieren Sie dieses am einfachsten mit pip. Da es kein passendes Systempaket gibt, sind keine Konflikte zu erwarten. Wenn Sie die Option --break-system-packages dennoch vermeiden möchten, müssen Sie eine virtuelle Python-Umgebung einrichten.

pip install --break-system-packages rpi-lgpio

Das obige pip-Kommando installiert das Modul lokal, also nur für Ihren Account. Wenn Sie Ihr Script in einem anderen Account ausführen möchten (z.B. als Cron-Job), stellen Sie dem Kommando sudo voran und installieren so rpi-lgpio systemweit.

Nach diesen Vorbereitungsarbeiten sollten viele Ihre alten Scripts ohne Änderungen laufen. Einige Sonderfälle sind hier dokumentiert:

https://rpi-lgpio.readthedocs.io/en/release-0.4/differences.html

Die folgenden Zeilen zeigen einmal mehr eine Schleife zum Ein- und Ausschalten einer Leuchtdiode:

#!/usr/bin/env python3
# Das Script setzt voraus, dass vorher 
# rpi-lgpio installiert wurde!
import RPi.GPIO as gpio
import time

# BCM-GPIO-Nummern verwenden
gpio.setmode(gpio.BCM)

# LED an Pin 26 = GPIO 7 
gpio.setup(7, gpio.OUT)

# LED über Pin 26 fünf Mal ein- und ausschalten
for _ in range(5):
    print("LED ein")
    gpio.output(7, gpio.HIGH)
    time.sleep(1)
    print("LED aus")
    gpio.output(7, gpio.LOW)
    time.sleep(1)

# alle vom Script benutzten GPIOs/Pins wieder freigeben
gpio.cleanup()

gpiod

Das Python-Modul gpiod wird durch das Paket python3-libgpiod zur Verfügung gestellt, das unter Raspberry Pi OS standardmäßig installiert ist. Das Modul stellt eine Python-Schnittstelle zur Bibliothek libgpiod her. Diese Bibliothek ist wiederum eine Alternative zu der schon erwähnten lgpio-Bibliothek. Da es zum Python-Modul kaum Dokumentation gibt, ist gpiod nur für Entwickler von Interesse, die mit libgpiod bereits C-Programme entwickelt haben. Als Ausgangspunkt für eine eigene Recherche eignen sich die beiden folgenden Seiten:

Das folgende Minibeispiel zeigt, wie Sie eine LED an Pin 26 (GPIO 7) fünf mal ein- und ausschalten:

#!/usr/bin/env python3
import gpiod, time
chip = gpiod.Chip('gpiochip4')  # RP1 (Raspberry Pi 5)
led = chip.get_line(7)          # GPIO 7 = Pin 26 des J8-Headers
led.request(consumer="example", type=gpiod.LINE_REQ_DIR_OUT)

for _ in range(5):              # 5x ein- und ausschalten
    led.set_value(1)
    time.sleep(1)
    led.set_value(0)
    time.sleep(1)

Quellen/Links

  •  

PHP8.2-fpm für Nextcloud 28

Dieser Beitrag baut auf dem Artikel „PHP7.4-fpm auf PHP8.1-fpm für Nextcloud“ auf.

Im Januar 2023 hatte ich erklärt, wie ich mein Raspberry Pi OS 11 (basierend auf Debian 11 Bullseye), durch Einbinden einer Fremdquelle, von PHP7.4-fpm auf PHP8.1-fpm aktualisiert habe. Warum ich zu diesem Zeitpunkt die Version 8.1 installiert habe, ist recht einfach zu beantworten. Die aktuelle Version Nextcloud 25 war noch nicht kompatibel zu PHP 8.2. Erst mit Nextcloud 26 war ein Upgrade möglich.

Nun habe ich mich nach der Aktualisierung auf Nextcloud 28 entschieden auf PHP 8.2 zu wechseln. Da ich den FastCGI-Prozessmanager FPM bevorzuge, unterscheidet sich das Upgrade etwas von einer herkömmlichen PHP-Installation.

Unterstützungszeiträume der aktuellen PHP-Versionen
Quelle: https://www.php.net/supported-versions.php

Installation

Zuerst wird das System auf den aktuellen Stand gebracht.

sudo apt update && sudo apt upgrade -y

Ein Check zeigt, welche PHP-Version momentan aktiv ist.

php -v

Hier die Ausgabe:

PHP 8.1.27 (cli) (built: Dec 21 2023 20:17:59) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.27, Copyright (c) Zend Technologies
with Zend OPcache v8.1.27, Copyright (c), by Zend Technologies

Jetzt werden alle benötigten Pakete nachinstalliert (auch das von Nextcloud 28 verlangte bz2 und der von mir eingesetzte Redis-Server).

sudo apt install php8.2 php8.2-mbstring php8.2-gd php8.2-curl php8.2-imagick php8.2-intl php8.2-bcmath php8.2-gmp php8.2-mysql php8.2-zip php8.2-xml php8.2-apcu libapache2-mod-php8.2 php8.2-bz2 php8.2-redis

Nun wird via CLI die PHP-Version von 8.1 auf 8.2 mit

sudo update-alternatives --config php

umgestellt.

sudo update-alternatives --config php
Es gibt 5 Auswahlmöglichkeiten für die Alternative php (welche /usr/bin/php bereitstellen).

  Auswahl      Pfad                  Priorität Status
------------------------------------------------------------
  0            /usr/bin/php.default   100       automatischer Modus
  1            /usr/bin/php.default   100       manueller Modus
  2            /usr/bin/php7.4        74        manueller Modus
* 3            /usr/bin/php8.1        81        manueller Modus
  4            /usr/bin/php8.2        82        manueller Modus
  5            /usr/bin/php8.3        83        manueller Modus
sudo update-alternatives --config php
Es gibt 5 Auswahlmöglichkeiten für die Alternative php (welche /usr/bin/php bereitstellen).

  Auswahl      Pfad                  Priorität Status
------------------------------------------------------------
  0            /usr/bin/php.default   100       automatischer Modus
  1            /usr/bin/php.default   100       manueller Modus
  2            /usr/bin/php7.4        74        manueller Modus
  3            /usr/bin/php8.1        81        manueller Modus
* 4            /usr/bin/php8.2        82        manueller Modus
  5            /usr/bin/php8.3        83        manueller Modus

Ein abschließender Check zeigt die aktuelle Version.

php -v
PHP 8.2.14 (cli) (built: Dec 21 2023 20:18:00) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.14, Copyright (c) Zend Technologies
with Zend OPcache v8.2.14, Copyright (c), by Zend Technologies

Ist die Ausgabe korrekt, kann PHP8.1-fpm deaktiviert, PHP8.2-fpm installiert und aktiviert werden.

sudo a2disconf php8.1-fpm
sudo apt install php8.2-fpm
sudo a2enconf php8.2-fpm

Der Restart des Webservers führt nun die Änderungen aus.

sudo service apache2 restart

Nextcloud-Konfiguration

Da in der Nextcloud nun wieder die bekannten Fehlermeldungen auftauchen, heißt es, diese schrittweise abzuarbeiten. Dazu wird die neue php.ini geöffnet

sudo nano /etc/php/8.2/fpm/php.ini

und die Werte für memory_limit sowie session_lifetime wie empfohlen angepasst.

memory_limit = 512M
session.gc_maxlifetime = 3600

Der Block

opcache.enable=1
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=10000
opcache.memory_consumption=256
opcache.save_comments=1
opcache.revalidate_freq=1

für den Zwischenspeicher OPchache wird ans Ende der php.ini gesetzt.

Zur Optimierung von PHP8.2-fpm werden speziell für das Modell Raspberry Pi 4 mit 4GB RAM in der Datei www.conf mit

sudo nano /etc/php/8.2/fpm/pool.d/www.conf

folgende Werte von

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

auf

pm = dynamic
pm.max_children = 120
pm.start_servers = 12
pm.min_spare_servers = 6
pm.max_spare_servers = 18

angepasst und der Dienst neu gestartet.

sudo service php8.2-fpm restart

Danach muss in der apcu.ini das Command Line Interface des PHP Cache noch aktiviert werden, indem

sudo nano /etc/php/8.2/mods-available/apcu.ini

folgende Zeile am Ende eingetragen wird.

apc.enable_cli=1

Ist dies geschehen, wird der Webserver ein letztes Mal neu gestartet.

sudo service apache2 restart

Fazit

Die Umstellung bringt zwar im Moment keine erkennbaren Vorteile, jedoch verschafft es wieder ein wenig Zeit und senkt den Druck das eigentliche Raspberry Pi OS 11 Bullseye durch die aktuelle Version 12 Bookworm zu ersetzen.

  •  

PHP-FPM – Eine Einführung in den FastCGI Process Manager für PHP

PHP-FPM (FastCGI Process Manager) ist eine leistungsstarke Erweiterung für den PHP-Interpreter, die die Ausführung von PHP-Skripten optimiert und verbessert. Entwickelt, um die Skalierbarkeit von PHP-basierten Webanwendungen zu erhöhen, spielt PHP-FPM eine entscheidende Rolle in modernen Webserver-Umgebungen.

Hintergrund

Traditionell wurde PHP als Modul für Webserver wie Apache bereitgestellt. Dieser Ansatz hatte jedoch seine Einschränkungen, insbesondere wenn es um die Verwaltung von Ressourcen und die Skalierung von Webanwendungen ging. PHP-FPM wurde als Lösung für diese Herausforderungen entwickelt, indem es die FastCGI-Protokollspezifikation implementiert und PHP-Skripte als separate Prozesse ausführt.

Vorteile von PHP-FPM

1. Ressourcenverwaltung:

PHP-FPM ermöglicht eine effiziente Verwaltung von Ressourcen, indem es separate Prozesse für jede Anforderung erstellt. Dadurch wird der Arbeitsspeicher besser genutzt und die Gesamtleistung der Webanwendung verbessert.

2. Skalierbarkeit:

Durch die Nutzung von PHP-FPM können Webentwickler ihre Anwendungen leichter skalieren, da sie die Anzahl der gleichzeitig ausgeführten PHP-Prozesse steuern können. Dies ist besonders wichtig in Umgebungen mit starkem Datenverkehr.

3. Isolierung von Anwendungen:

Jede PHP-Anwendung wird in ihrem eigenen Prozess isoliert, wodurch Konflikte zwischen verschiedenen Anwendungen vermieden werden. Dies trägt zur Stabilität des Gesamtsystems bei.

4. Anpassbare Konfiguration:

PHP-FPM bietet eine umfangreiche Konfiguration, die es Administratoren ermöglicht, Parameter wie Prozessprioritäten, Anzahl der Kinderprozesse und andere Einstellungen zu optimieren.

Konfiguration und Verwendung

Die Konfiguration von PHP-FPM erfolgt über die php-fpm.conf-Datei und optionale Pool-Konfigurationsdateien. Administratoren können Parameter anpassen, um die Leistung und Ressourcennutzung nach den Anforderungen ihrer Anwendung zu optimieren.

Die Integration von PHP-FPM in Webserver wie Nginx oder Apache erfolgt durch die Konfiguration von FastCGI-Servern. Dies ermöglicht eine reibungslose Kommunikation zwischen dem Webserver und PHP-FPM.

Fazit

PHP-FPM hat sich als wesentliches Werkzeug für die Verwaltung von PHP-Anwendungen in produktiven Umgebungen etabliert. Durch die Bereitstellung von effizienter Ressourcennutzung, Skalierbarkeit und Anwendungsisolierung spielt PHP-FPM eine Schlüsselrolle bei der Gewährleistung der Leistungsfähigkeit von PHP-Webanwendungen. Bei der Entwicklung und Verwaltung von Webanwendungen ist es wichtig, die Vorteile von PHP-FPM zu verstehen und richtig zu konfigurieren, um eine optimale Leistung zu gewährleisten.

  •  

SSD der Nextcloud ersetzen

Der Black Friday ist für den Einzelhandel ein willkommenes Datum, um Waren an den Mann bzw. die Frau zu bringen. In dieser Zeit wird Lagerware abverkauft, um Platz für Neues zu schaffen. Der Endverbraucher profitiert meist durch Rabatte und Nachlässe auf interessante Artikel.

Angelockt durch solch ein Angebot, habe ich mir eine externe 2TB-SSD zugelegt, um den Speicher meiner Nextcloud zu erweitern. Im Vorfeld hatte ich mir hierzu schon einige Gedanken gemacht, wie ich die alte 500GB SSD durch das neue und größere Speichermedium ersetze.

Nextcloud auf dem Raspberry Pi mit SanDisk SSD (2 TB)
Raspberry Pi mit SanDisk SSD

Die perfekte Lösung für mich war das Duplizieren der Quelle mit Clonezilla. Hierbei wurden beide Festplatten an den Rechner angeschlossen, Clonezilla gestartet und mit device-device ein Duplikat erstellt. Bei diesem musste dann nur noch die Partition vergrößert werden. Da der Zielfestplatte die selbe UUID vergeben wurde, waren im Anschluss keine weiteren Maßnahmen erforderlich.

Clonezilla Auswahl device-device
Clonezilla device-device
  •  
❌