- SteamOS 3 „Holo“ ist eine Arch-basierte Distribution für das Steam Deck, doch um das Problem beim Aufwachen aus dem Suspend auf einem Wohnzimmer-PC zu beheben, musste ein Kernel-Commit zurückgenommen und sogar das rootfs-Image direkt geforkt werden
- Die Update-Struktur nutzt ein A/B-Verfahren: Ein neues schreibgeschütztes rootfs wird auf die inaktive Partition installiert und anschließend wird neu gestartet;
/etcbewahrt Änderungen per overlayfs - Die Kernel-Patches von Valve entstehen aus Source-Tarballs wie
linux-neptune-61-6.1.52.valve9-1.src.tar.gzauf dem pacman-Source-Mirror: Daraus wird ein Bare-Git-Repository geklont, anschließend werden Pakete mit eigenen Tags und PKGBUILD gebaut - Beim Repacking des rootfs wird
rootfs.img.caibxaus einem SteamOS-RAUC-Bundle extrahiert und zu einem Image zusammengesetzt; danach folgen Btrfs-UUID-Änderung, Paketaustausch, Änderung derbuildid, Austausch der Update-URLs und RAUC-Zertifikate und schließlich erneutes Bündeln als RAUC bundle - Ein eigener Webserver liefert
live.json; wennQueryUrl,ImagesUrlundMetaUrlvonsteamos-atomupdgeändert werden, lassen sich auch bestehende SteamOS-Installationen auf das eigene Image aktualisieren
Warum SteamOS für einen Wohnzimmer-PC geforkt wurde
- SteamOS 3 „Holo“ ist eine Arch-basierte Linux-Distribution von Valve Software für den tragbaren PC-Gaming-Handheld Steam Deck
- Das Update-Verfahren ist als atomares A/B-Update aufgebaut: Ein neues schreibgeschütztes rootfs wird auf die inaktive Partition heruntergeladen, dann wird in diese Partition neu gestartet
- Nutzer können
steamos-devmodeausführen, die rootfs-Sperre aufheben und die pacman-Datenbank normalisieren, um das System wie eine gewöhnliche Linux-Distribution zu behandeln - Ziel war es, statt eines leicht zu umgehenden Wegs über
steamos-devmodeeinen sauberen Fork zu erstellen, bei dem das rootfs-Image selbst verändert werden kann - Auf dem Wohnzimmer-PC funktionierte SteamOS fast vollständig, nur das Aufwachen aus dem Suspend schlug fehl
- Andere Distributionen mit Mainline- oder Stable-Kernel konnten auf demselben Computer aus dem Suspend aufwachen
- Nach dem Auffinden der Valve-Kernelquellen und einem
git bisectstellte sich heraus, dass ein Commit, der offenbar das Aufwachen aus dem Suspend auf Steam-Deck-Hardware behebt, auf diesem PC Probleme verursachte - Diesen Commit zurückzunehmen und den Kernel selbst zu bauen, war der unmittelbare Auslöser für die gesamte Arbeit
- Eine direkte Nutzung von Arch oder Ähnlichem wäre ebenfalls möglich gewesen, doch wenn schon eine Linux-Distribution für Spieleausführung angepasst werden muss, ist es vorzuziehen, auf das von Valve getestete Paketset zu setzen
Partitionen und Update-Struktur von SteamOS
- Ein SteamOS-System verwendet acht Partitionen
- Die EFI system partition enthält den Stage-1-Bootloader und Metadaten zur Auswahl des A/B-Partitionssets
- Jedes A/B-Set enthält GRUB als Stage-2-Bootloader, das Root-Dateisystem und eine
/var-Partition - Der restliche Speicherplatz wird von einer einzelnen
home-Partition belegt
- Beim Booten werden zusätzlich mehrere Pseudo-Dateisysteme eingehängt
- Fast ein Dutzend Verzeichnisse wie
/var/log,/root,/nixwerden per Bind Mount aus/home/.steamos/offloadeingebunden, um Daten dauerhaft zu speichern
- Fast ein Dutzend Verzeichnisse wie
/etcwird per overlayfs behandelt- Änderungen werden in
/var/lib/overlays/etc/uppergespeichert - Einträge, die üblicherweise in
/etcerhalten bleiben müssen, etwamachine-idoder NetworkManager-Verbindungen, bleiben bestehen - Nicht veränderte Konfigurationsdateien können aktualisiert werden
- Dieses Verfahren ermöglicht in einer A/B-Partitionsstruktur sowohl das Beibehalten von Konfigurationsdateien als auch Updates, ganz ohne Paketmanager-Logik
- Änderungen werden in
- Systemupdates werden gestartet, wenn der Steam-Client oder ein Terminalnutzer
steamos-updateausführt- Dieser Befehl startet das Python-Programm
steamos-atomupd-client - Der Client sendet aktuelle OS-Informationen und die Update-Channel-Einstellungen des Nutzers an die URL in
/etc/steamos-atomupd/client.conf, um nach neuen Updates zu suchen
- Dieser Befehl startet das Python-Programm
- Wenn ein neues Update vorhanden ist, antwortet der Server mit dem Pfad zu einem RAUC bundle
- Der Client lädt das Bundle herunter und führt
rauc installaus - RAUC prüft die Bundle-Signatur und sucht nach
rootfs.img.caibx - Mit
casync extractwerden neue Image-Chunks heruntergeladen und auf die inaktive rootfs-Partition geschrieben - Ein Post-Install-Skript synchronisiert selektiv Daten von der aktiven
/var-Partition in die inaktive/var-Partition und ändert die Stage-1-Bootloader-Konfiguration auf der EFI system partition, damit in das neue Partitionsset gebootet wird
- Der Client lädt das Bundle herunter und führt
Pakete aus Valves Kernelquellen bauen
- Valve verwendet in SteamOS einen stark modifizierten Linux-Kernel; die Quellen sind downloadbar
- Die Quellen des aktuellen SteamOS-Images finden sich auf Valves pacman-Mirror unter
sources/holo-3.5undsources/jupiter-3.5 - Zum Zeitpunkt des Schreibens war der Kernel des Stable-Images
6.1.52-valve9-1-neptune-61; der zugehörige Source-Tarball ist 2,9 GiB groß - Der Tarball ist so groß, weil er den vollständigen Linux-Git-Tree enthält
- Im Tarball befinden sich unter anderem
PKGBUILD,config,config-neptuneundarchlinux-linux-neptune/ archlinux-linux-neptune/ist kein normaler direkt nutzbarer Working Tree, sondern ein Bare Repository
- Im Tarball befinden sich unter anderem
- Das PKGBUILD verweist als Source auf ein privates GitLab-Repository in der Form
git+ssh://git@gitlab.steamos.cloud/jupiter/linux-integration.git#tag=$_tag- Ein direkter Clone oder ein Link auf Commits ist nicht möglich
- Aus den
makepkg-Quellen lässt sich ein Snapshot mit der vollständigen Commit-Historie jedes Tags erhalten - Dank dieser Struktur konnte der Commit, der den Suspend des Wohnzimmer-PCs kaputt machte, per Bisect gefunden werden
- Die Arbeitsweise besteht darin, das Bare Repository in einen normalen Working Tree zu klonen und eigene Branches und Tags zu pflegen
- Das Beispiel erstellt aus dem Tag
6.1.52-valve9einen Branchmy-branch - Eigene Änderungen werden auf einen separaten Git-Host hochgeladen, und die
sourceim PKGBUILD wird auf dieses Repository und ein eigenes Tag geändert - Als Beispiel-Repository dient linux
- Das Beispiel erstellt aus dem Tag
- Kernelpakete lassen sich mit
makepkgbauenmakepkg MAKEFLAGS=-j$(nproc)oder ein Update von/etc/makepkg.confist nützlich, wenn es sich nicht um eine kleine VM handelt- Soweit untersucht, nutzten auch SteamOS-spezifische Pakete eine ähnliche Struktur mit einem Git-Repository als erster
source
- Um spätere Schritte zu erleichtern, wird ein eigenes pacman-Repo eingerichtet
- Pakete werden in ein Verzeichnis gelegt, dann wird
repo-add $REPO_NAME.db.tar.zst [PACKAGES...]ausgeführt und das Ergebnis auf einen Webhost hochgeladen - Dieses Repo hilft später auch dabei, dass Werkzeuge korrekt funktionieren, falls
steamos-devmodeausgeführt wird
- Pakete werden in ein Verzeichnis gelegt, dann wird
Root filesystem beziehen und mounten
- Da keine Release-Engineering-Skripte gefunden wurden, wurde der Ansatz gewählt, ein vorhandenes Root filesystem nach Bedarf neu zu packen
- Das Skript ohne Erläuterungen und Kommentare liegt unter fauxlo
- Übliche Wege, ein SteamOS-rootfs-Image zu erhalten, sind der Kauf eines Steam Decks oder das Herunterladen des Steam-Deck-Recovery-Images; beides erfordert jedoch die Zustimmung zum Steam End User License Agreement
- Die aktuelle Release-Version lässt sich aus dem Snapshot-JSON ermitteln, das offenbar als Fallback-URL des Update-Systems dient
- Zum Zeitpunkt des Schreibens war die Stable-Version
20231122.1 - Für den Preview-Channel gibt es ein separates Snapshot-JSON
- Zum Zeitpunkt des Schreibens war die Stable-Version
- Der rootfs-Download folgt derselben Reihenfolge wie
steamos-atomupd-client- Die
.raucb-Datei, ein RAUC bundle, wird heruntergeladen - Aus dem Bundle, einem SquashFS-Dateisystem, wird
rootfs.img.caibxextrahiert - Mit
casync extractwerden Chunks aus dem.castrStore geholt undrootfs.imgerzeugt - Die URL des
.castrStore ergibt sich, indem in der RAUC-Bundle-URL.raucbdurch.castrersetzt wird - Dieses Verhalten ist in
steamos-atomupdfest verdrahtet - Das Automatisierungsskript liegt unter fetch-current.sh
- Die
- Die benachbarten Dateien
.img.zipund.img.zstsind kein rootfs, sondern separate bootfähige Recovery-Images- Aus einem Recovery-Image kann auch die rootfs-Partition extrahiert und im nächsten Schritt verwendet werden
- Sie war jedoch nicht bitgenau identisch mit dem per RAUC und casync bezogenen Image, und zum erneuten Erstellen eines Update-Bundles werden diese Werkzeuge ohnehin benötigt
- Vor dem Ändern des rootfs muss die Filesystem-UUID geändert werden
- Wird beim Update von einem bestehenden SteamOS-Image auf ein Custom-Image die UUID nicht geändert, haben zwei unterschiedliche Filesystems dieselbe UUID
- Dieser Zustand kann Probleme verursachen
- Ein Beispiel ist
btrfstune -fu rootfs.img
- Valve verwendet ein Btrfs-Image mit zstd-Kompression
- Um die Kompression während der Änderungen beizubehalten, wird es mit
mount -o compress=zstd rootfs.img rootfsgemountet - SteamOS nutzt die
readonly-Subvolume-Eigenschaft von Btrfs, daher wird sie mitbtrfs property set -ts rootfs ro falsedeaktiviert
- Um die Kompression während der Änderungen beizubehalten, wird es mit
- Änderungen an Paketen wie dem Linux-Kernel können Skripte auslösen, die
/devund/procbenötigendevtmpfsundprocwerden unterhalb des rootfs gemountet- Auf
/tmp,/run,/varund/homewird tmpfs gemountet, damit nicht in Verzeichnisse geschrieben wird, die im gebooteten System gemountet werden - Die
/etc/resolv.confdes Hosts wird per Bind Mount eingebunden, damit Namensauflösung im chroot funktioniert
Pakete ersetzen und Image-Metadaten ändern
- Das eigene Repository wird als erster Repo-Eintrag in
/etc/pacman.confhinzugefügt- Dadurch haben eigene Pakete Vorrang, selbst wenn in Valves Repo Pakete mit neuerer Version liegen
- Auch nach einem späteren Ausführen von
steamos-devmodekönnen eigene Pakete erneut installiert werden
- Ein Beispiel-Repo-Stanza verwendet
[fauxlo],Server = https://fauxlo.ili.fyi/pacman/$archundSigLevel = NeverSigLevel = Nevererlaubt Pakete auch ohne Paketsignatur- Um GPG-signierte Pakete zu installieren, muss der pacman-Keyring befüllt werden
- Statt den leeren Keyring unter
/etc/pacman.d/gnupganzufassen, wird ein neuer Keyring auf tmpfs befüllt
- Die Paketinstallation erfolgt in der Form
pacman --sysroot rootfs --noconfirm -Sy linux-neptune-61- Im tatsächlichen Skript wird
-yvermieden und nur die Datenbank des eigenen Repos hinter pacman synchronisiert - Dadurch lässt sich der Zustand anderer Repositories auf den Zeitpunkt fixieren, zu dem das ursprüngliche Image gebaut wurde
- Das ist eine Entscheidung, um die im Image-Diff sichtbaren Änderungen zu reduzieren
- Im tatsächlichen Skript wird
steamos-atomupdliest die aktuelle Image-Version und Build-ID aus/lib/steamos-atomupd/manifest.json; falls diese Datei fehlt, wird/etc/os-releaseverwendet- Wenn die Build-ID des vom Server bereitgestellten Updates mit der des aktuellen Images identisch ist, wird das Update abgelehnt
- Sie ist außerdem nützlich, um zu erkennen, welches Image gerade läuft
- Die Build-ID muss zwingend das Format
YYYYMMDD.Nhaben- Passt das Format nicht, beendet sich
steamos-atomupdmit einem Python-Traceback - Um manuelles Hochzählen zu vermeiden, kann für
NHHMMSSoder ein Unix-Timestamp verwendet werden - Sowohl
buildidinmanifest.jsonals auchBUILD_IDinos-releasewerden geändert - Ein Bash-Skriptausschnitt dafür befindet sich in repack.sh
- Passt das Format nicht, beendet sich
- RAUC nutzt X.509-Zertifikate für die Vertrauenseinstellungen
- Das vertrauenswürdige Zertifikat liegt in
/etc/rauc/keyring.pem - Ein einfaches self-signed certificate reicht aus
- Das neue Zertifikat wird nach
rootfs/etc/rauc/keyring.peminstalliert
- Das vertrauenswürdige Zertifikat liegt in
- Auch die URLs in
rootfs/etc/steamos-atomupd/client.confwerden auf den eigenen Server geändertQueryUrlImagesUrlMetaUrl
- Solange die Größe des 5-GiB-Btrfs-Images nicht überschritten wird, sind weitere Änderungen möglich
- Wenn ein SteamOS-Gerät im Netzwerk beispielsweise als
hostname.localgefunden werden soll, kannrootfs/usr/lib/systemd/resolved.conf.d/00-disable-mdns.confentfernt werden - Das ließe sich auch über die
/etc-Overlay-Konfiguration überschreiben, wurde aber als umständlich eingeschätzt
- Wenn ein SteamOS-Gerät im Netzwerk beispielsweise als
- Änderungen, die sich ohne Image leicht durchführen lassen, sollten grundsätzlich nicht ins rootfs aufgenommen werden
- Firefox ließe sich zwar im rootfs installieren
- Dann müsste das Image aber bei jedem Firefox-Sicherheitsupdate erneut repackt werden
rootfs aushängen und RAUC bundle erstellen
- Nach Abschluss der Änderungen wird das Filesystem wieder als read-only markiert
btrfs property set -ts rootfs ro true
- Nicht genutzte Blöcke werden mit
fstrim -v rootfsdiscardet - Zum Aushängen ist
umount --recursive rootfsnützlich- Damit lassen sich auch die zuvor gemounteten Pseudo-Dateisysteme gemeinsam behandeln
- Vor dem Erstellen des RAUC bundle werden casync store und Blob-Index erzeugt
- Beispiel:
casync make --store=rootfs.img.castr bundle/rootfs.img.caibx rootfs.img
- Beispiel:
- Das RAUC bundle benötigt drei Dateien
manifest.raucmrootfs.img.caibxUUIDmit der Filesystem-UUID
manifest.raucmenthält Update-Informationen und Informationen zum rootfs-Imagecompatible=steamos-amd64version=$versionsha256sizefilename=rootfs.img.caibx
- Die Datei
UUIDwird mitblkid -s UUID -o value rootfs.img >bundle/UUIDerzeugt - Sobald die drei Dateien vorbereitet sind, wird
rauc bundleausgeführt- Zertifikat und Schlüssel werden mit
--signing-keyring,--certund--keyangegeben - Das Ergebnis ist
rootfs.img.raucb
- Zertifikat und Schlüssel werden mit
rootfs.img.raucbundrootfs.img.caibxwerden auf den Webserver hochgeladen, auf denImagesUrlinclient.confzeigt- Beide Dateien müssen im selben Verzeichnis liegen
Eigener Update-Server und Anwendung
- Der für
QueryUrlundMetaUrlverwendete Webserver muss JSON-Dateien bereitstellen - In einer einfachen Konfiguration reicht eine einzelne
live.json- Das Objekt
.minor.candidates[0].imagemuss mit/lib/steamos-atomupd/manifest.jsonim Image übereinstimmen update_pathist der Pfad, den der Update-Client anImagesUrlanhängt, um das Bundle herunterzuladen
- Das Objekt
- Die Beispielkonfiguration für Caddy rewritet die Requests, die
steamos-atomupdanQueryUrlundMetaUrlsendet, auflive.json/updateswird auf/live.jsonrewritet/meta/*/*/*/*.jsonund/meta/*/*/*/*/*.jsonwerden auf/live.jsonrewritetfile_server browsewird verwendet
- Die tatsächlichen
QueryUrlundMetaUrlvon SteamOS scheinen mehr Logik zu enthalten, doch auch mit dieser Konfiguration kannsteamos-atomupdein neues Update finden - Es gibt Logik, die ein Update vermeidet, wenn das bereits beworbene Image aktuell ausgeführt wird
- Um eine bestehende SteamOS-Installation auf das eigene Image zu aktualisieren, müssen
/etc/rauc/keyring.pemund/etc/steamos-atomupd/client.confgeändert werdensteamos-readonly disableist nicht nötig- Die Änderungen landen im
/etc-Overlay - Nach dem Ausführen von
steamos-updatesollte erwogen werden, diese Änderungen aus/var/lib/overlays/etc/upperzu bereinigen
- Es scheint möglich, eines der Valve-Recovery-Images so zu ändern, dass das rootfs durch ein eigenes Image ersetzt wird, um eine modifizierte SteamOS-Variante zu installieren; dieser Weg wurde jedoch nicht getestet
1 Kommentare
Hacker-News-Kommentare
Ich mag solche Beiträge, in denen jemand die Software/das OS seiner eigenen Geräte tiefgehend anpasst. Schön ist auch, dass man sich beim Steam Deck keine Sorgen um Tivoization machen muss.
Am interessantesten fand ich im Artikel die
/nix-Partition. Ich wusste nicht, dass das Steam Deck nixpkgs unterstützt; beim Nachlesen stellte sich heraus, dass es zwar keine Standardinstallation ist, man es aber auf das Gerät bringen kann, ohne das gesamte OS zu forken.Den Nix-Store kann man an einem beliebigen beschreibbaren Ort ablegen, und dann muss man
$PATHnur auf ein Verzeichnis mit symbolischen Links zeigen lassen.Ein wirklich gründlicher und interessanter Beitrag. Persönlich würde ich wohl nie so weit gehen.
Mit Linux habe ich nur in meiner Raspberry-Pi-Zeit herumgespielt, und selbst da vielleicht zu 1 %, daher wirkt der Autor auf mich beeindruckend.
Ähnlich wie https://github.com/kiler129/relax-intel-rmrr, aber das ist nicht mein Repository.
Die eigentliche Ursache ließe sich nur durch ein ROM-Update des Herstellers beheben, aber mein alter DL360 wird von HPE nicht mehr unterstützt.
Der Patch selbst ist nur eine Änderung in einer Zeile, aber Kernel-Updates sind mühsam. Man muss das SRPM herunterladen, und da es kein Git-Repository gibt, das SRPM entpacken, den Patch anwenden, danach neu bauen und installieren.
Es gibt bereits Distributionen, die auf SteamOS-Komponenten basieren und auf die Nutzung mit PC und Controller zugeschnitten sind. ChimeraOS enthält sogar EmuDeck, ein Zusatztool für das Steam Deck, und läuft in meiner Umgebung ziemlich problemlos.
Ich habe eine GPU bestellt, um Steam Headless auf meinem unRaid-NAS-Server als schickes Docker-Image laufen zu lassen und mich von einem Windows-Laptop aus mit einem Client wie Moonlight zu verbinden.
Wenn das gut funktioniert, ist das deutlich besser, als zusätzlich Gaming-Desktop-Hardware zu kaufen, während das NAS die meiste Zeit im Leerlauf ist. Allerdings muss ich die Nvidia-Karte im Leerlauf halten, wenn sie nicht genutzt wird. Hoffentlich geht das mit einem Aufruf von
nvidia-persistenced.1: https://github.com/Steam-Headless/docker-steam-headless
1: https://github.com/games-on-whales/gow
https://kubevirt.io/user-guide/virtual_machines/host-devices...
Deklaratives, cloud-natives Starten von Spielen!
kubectl apply -f crysis.yamlHeute habe ich RAUC(https://rauc.io/) kennengelernt. Ich hatte mich gefragt, wie Valve den A/B-Update-Ansatz umgesetzt hat.
Vermisst man nicht ein bisschen Netscapes Meteorregen-Favicon?
Interessanter Beitrag. A/B-Upgrades wirken etwas übertrieben. Wenn etwas schiefgeht, kann man schließlich eine Live-Distribution starten oder ein Recovery-System einer älteren Version auf einer separaten Partition installieren.
Nachdem ich in den letzten Jahren NixOS genutzt hatte, bin ich wieder zu Arch zurückgekehrt; davor hatte ich Arch schon lange verwendet, und ich glaube, die Sorgen des Autors gehen daneben.
Arch ist definitiv eine sehr ernsthafte und ausgereifte Distribution und vertrauenswürdiger als Valve.
Der Grund für meinen Wechsel zu Arch war die Paketqualität. Das Haupt-Repository wird wirklich schnell aktualisiert, und im AUR gibt es viele nützliche Pakete.
Dass sich ein System nach einem fehlgeschlagenen Upgrade automatisch wiederherstellt, ist bei einem wartungsarmen OS heute fast unverzichtbar.
Ich halte die Qualität der NixOS-Pakete im Allgemeinen für hoch.
In letzter Zeit habe ich ein Legion Go, ein Gaming-Handheld, in die Finger bekommen und beschäftige mich dadurch mehr mit Linux. Früher wirkte es auf mich wie endlos vergeudete Bastelzeit, und weil die Kompatibilität mit Dingen, die ich tatsächlich nutzen wollte, eingeschränkt war, habe ich es gemieden.
Als ich über unveränderliche Dateisysteme las und darüber, dass traditionelles Linux beliebiger Software allzu leicht Root-Rechte einräumt, wurde ich neugierig.
Im Moment nutze ich NixOS. Das kann definitiv zu vergeudeter Bastelzeit werden, ist aber gut zum Erkunden. Man kann verschiedene Komponenten leicht ausprobieren und, wenn man sie nicht behalten will, bis auf etwas Verschmutzung in
~/.configvollständig entfernen. Auch das Patchen vor der Installation ist trivial, sodass sich Kernel-Patches, die Linux auf ungewöhnlicher Hardware wie Gaming-Handhelds nutzbar machen, leicht hinzufügen lassen.Eine NixOS-Community namens Jovian rekonstruiert Valves beliebige SteamOS-Tarballs als getaggte Commits auf GitHub, sodass man sich die Quellen ansehen kann wie ein Valve-Mitarbeiter. Mit ein paar zusätzlichen Zeilen in der Nix-Konfiguration kann man seine eigene Kopie von SteamOS auf NixOS installieren.
Das sind offensichtlich Linux-Experten, und am Quellcode sieht man, dass sie die Valve-Pakete unverändert übernehmen, abgesehen von einfachen Anpassungen wie dem Prüfen statt Hardcodieren der Position des Power-Buttons.
Wenn man eine unverfälschte SteamOS-Erfahrung möchte, aber keinen eigenen Mirror für Valves Update-System betreiben will, oder wenn man Valves Quellen erkunden möchte, ohne 3-GB-Tarballs herunterzuladen, ist Jovian einen Blick wert.
Installationsanleitung: https://jovian-experiments.github.io/Jovian-NixOS/getting-st...
Valve-Quellen-Mirror: https://github.com/orgs/Jovian-Experiments/repositories?type...
bazzite.gg macht das ebenfalls ausgesprochen gut. Auf AMD-Hardware funktionierte 120Hz VRR direkt, und HDR-Unterstützung kann man auch im Alpha-Test ausprobieren.
„Bazzite ist ein OCI-Image, das als alternatives Betriebssystem für das Steam Deck genutzt werden kann, und eine sofort spielbereite, SteamOS-ähnliche Umgebung für Desktop-Computer, Wohnzimmer-Home-Theater-PCs und mehrere Handheld-PCs.“
https://github.com/ublue-os/bazzite/
Selbst wenn man kein Interesse daran hat, lohnt sich die README. Die Liste der enthaltenen Dinge ist enorm lang, und besonders für Gamer oder Streamer sind viele Punkte dabei, die ziemlich cool und nützlich wirken.
Ich habe mich nicht tief genug eingearbeitet, um es in einem HN-Kommentar knapp und perfekt zu erklären, aber im Kern liegt unter Root eine schreibgeschützte, verifizierte Linux-Distribution, auf die Pakete als Schichten aufgesetzt werden. Die Struktur ist stark von serverseitigen Containern inspiriert.
Ziel ist es, sicherer, zuverlässiger, reproduzierbarer und leichter anpassbar zu sein als traditionelles Linux. Man schreibt die gewünschten Pakete in ein Container-Manifest; wenn ein Upgrade erscheint, führt man das Upgrade aus und installiert die Pakete anschließend wieder darüber.
https://universal-blue.org/guide/fork-your-own/
Und weil es ein unveränderliches OS ist, kann man bei Problemen auf ein vorheriges Image zurückrollen.
Meistens lief das entweder auf dem Steam Deck oder in einer virtuellen Maschine mit GPU-Passthrough, jeweils mit Bazzite, und es ist wirklich gut gemacht.
Wohnzimmer-PC — sagt man inzwischen HTPC oder „Media Center“ nicht mehr so oft?