Das Paket existiert, aber nicht für dich
Ein Werkzeug liegt im AUR, oder nur als .deb, oder nur als GitHub-Release. Deine Distro hat es vor zwei Jahren paketiert — oder nie. Am Ende kompilierst du selbst oder verzichtest.
Open Source — MIT-Lizenz
Zero Layer ist ein universeller Linux-Paketmanager. Er installiert Software aus 13 verschiedenen Ökosystemen auf jeder Distribution, indem er Binärdateien bei der Installation übersetzt — nicht zur Laufzeit.
curl -Lo zl https://github.com/polpo21/zero_layer/releases/latest/download/zl-x86_64-unknown-linux-gnu
Eine Binärdatei. Kein Runtime, kein Daemon, keine Abhängigkeiten.
Das Problem
Jede Distribution bringt ihr eigenes Format, ihre eigenen Repositories und ihre eigene Vorstellung davon mit, wo Dateien hingehören. Die Software, die du willst, ist oft schon paketiert — nur nicht für dein System.
Ein Werkzeug liegt im AUR, oder nur als .deb, oder nur als GitHub-Release. Deine Distro hat es vor zwei Jahren paketiert — oder nie. Am Ende kompilierst du selbst oder verzichtest.
Container, virtuelle Maschinen und Kompatibilitätsschichten lösen das, indem sie eine Schicht hinzufügen. Die bezahlst du dauerhaft: Startverzögerung, Arbeitsspeicher, Plattenplatz und ein Runtime, das laufen muss.
Ein Tarball nach /opt zu entpacken funktioniert, bis eine Bibliothek umzieht. Nichts verfolgt die Dateien, nichts kennt die Abhängigkeiten, und nichts kann es sauber rückgängig machen.
Die Idee
Eine Linux-Binärdatei ist nicht an eine Distribution gebunden, sondern an wenige konkrete Fakten: welcher dynamische Linker sie lädt und wo ihre gemeinsamen Bibliotheken liegen. Beides steht in der ELF-Datei, und beides lässt sich umschreiben.
Zero Layer liest diese Felder mit goblin und schreibt sie mit elb so um, dass sie auf den echten Linker und die echten Bibliothekspfade deines Systems zeigen. Genau einmal, während der Installation.
Danach ist die Binärdatei schlicht eine native Binärdatei auf deinem Rechner. Kein Shim, kein Wrapper-Skript, keine Sandbox, kein überwachender Prozess. Daher der Name: die Schicht ist null.
gebaut für Arch
angepasst an diese Maschine
Derselbe Maschinencode. Er weiß jetzt nur, wo er wohnt.
Philosophie
Zero Layer bezieht Position. Das sind die Regeln, an denen sich der Code messen lassen muss.
Die gesamte Übersetzungsarbeit passiert genau einmal, während der Installation. Danach steht nichts mehr zwischen deinem Programm und dem Kernel.
Architektur, dynamischer Linker, libc, Bibliotheksverzeichnisse und Dateisystemaufbau werden vom laufenden System ermittelt statt fest einprogrammiert.
Jede Installation läuft in einer Transaktion, die festhält, was sie angefasst hat. Ein Fehler an beliebiger Stelle macht den gesamten Vorgang rückgängig.
redb statt SQLite, elb statt patchelf, rustls statt OpenSSL. In Rust geschrieben; die wenigen nativen Teile (Kompression, Kryptografie) sind einkompiliert, daneben muss also nichts installiert werden.
Existiert ein Paket in mehreren Ökosystemen, zeigt Zero Layer alle an und lässt dich wählen. Es entscheidet nie stillschweigend für dich.
Verlauf, Rollback, Waisen-Erkennung und Trockenlauf sind Kernfunktionen, keine Nachgedanken. Du kannst immer sehen, was passiert ist, und es zurücknehmen.
So funktioniert's
Zwischen deinem Befehl und einer lauffähigen Binärdatei liegen acht Stufen. Jede ist mit -v beobachtbar, und jeder Fehler rollt alles zurück.
Findet das Paket und durchläuft rekursiv seinen Abhängigkeitsbaum, inklusive Zyklenerkennung. Fehlt eine Abhängigkeit in der Hauptquelle, werden alle anderen aktiven Quellen abgefragt und du wählst.
quellenübergreifendFünf Kategorien werden geprüft, bevor irgendetwas geschrieben wird: Dateibesitz, Binärnamen, Bibliotheks-Sonames, deklarierte Konflikte und Versionsbedingungen.
5 KonfliktartenPakete werden direkt aus ihren nativen Repositories über vier parallele Threads geholt, mit Fortschrittsbalken und automatischer Wiederholung mit Backoff.
4 Threads · RetrySHA256-Prüfsummen werden erzwungen, GPG-Signaturen geprüft, sofern die Quelle sie liefert. Eine nicht überprüfbare Signatur wird anders gemeldet als eine falsche.
SHA256 + GPGDas Archivformat wird erkannt und entpackt — deb, rpm, tar, zst, xz, nar, squashfs, zip oder AppImage — und anschließend auf ein Standard-FHS-Layout normalisiert.
9 ArchivformateJede ELF-Binärdatei wird analysiert, dann werden Interpreter und RUNPATH passend zu deinem System umgeschrieben. Pakete mit mehreren Binärdateien werden parallel gepatcht; statische bleiben korrekterweise unangetastet.
goblin + elbDateien werden atomar innerhalb einer Transaktion abgelegt, die jede erzeugte Datei, jedes Verzeichnis, jeden Symlink und jeden Datenbankeintrag festhält. Jeder Fehler nimmt alles zurück.
atomar · RollbackDateien, Abhängigkeiten, Besitz und der Vorgang selbst werden in eine eingebettete Datenbank geschrieben — genau das macht why, size, doctor und rollback später möglich.
redb + GraphFunktionsumfang
Alles, was du von den Werkzeugen deiner Distribution erwartest — und das, was sie nie hatten.
ELF-Binärdateien werden mit goblin analysiert und bei der Installation mit elb gepatcht. Dynamischer Linker und RUNPATH werden für dein System umgeschrieben, sodass Pakete danach mit voller nativer Geschwindigkeit laufen.
Alle aktiven Quellen werden gleichzeitig abgefragt, Ergebnisse nach Relevanz bewertet und AUR-Binärvarianten automatisch gefunden.
Eine Installation gelingt vollständig oder hinterlässt keine Spur. Niemals ein halb geschriebener Zustand.
doctor, audit, why, size, diff und history beantworten die Fragen, bei denen Paketmanager dich sonst raten lassen.
Installiere Versionen nebeneinander und wechsle zwischen ihnen, oder starte eine flüchtige Umgebung, die beim Verlassen der Shell verschwindet.
Prüfsummen und Signaturen beim Hereinkommen, CVE-Abfragen über OSV.dev beim Hinausgehen, dazu Pinning, um alles einzufrieren, was sich nicht bewegen soll.
Quellen
Jede Quelle ist ein Plugin, das denselben Trait implementiert. Aktiviere pro Rechner, was du brauchst, oder filtere pro Befehl mit --from.
pacmanArch LinuxaurArch User RepositoryaptDebian · UbuntudnfFedora · RHELzypperopenSUSE · SLESapkAlpine LinuxxbpsVoid LinuxportageGentoo binhostnixnixpkgsflatpakFlathubsnapSnapcraft StoreappimageAppImageHubgithubGitHub ReleasesOb eine Quelle nutzbar ist, hängt von der Erreichbarkeit des Upstreams ab. Das Repository verfolgt den tatsächlichen Zustand jedes Plugins.
Befehle
Eine Binärdatei, fünfundzwanzig Befehle, Shell-Vervollständigung für bash, zsh und fish.
$ zl install firefox # pick from every source $ zl install firefox --from pacman # force one source $ zl install sharkdp/bat --from github $ zl install python --version 3.12 # side by side $ zl remove firefox --cascade # drop orphaned deps $ zl --dry-run install firefox # preview only $ zl run neofetch # run without installing
$ zl search vim # all sources, in parallel $ zl search vim --exact # exact names only $ zl search vim --from pacman,apt # limit the sweep $ zl info ripgrep # full metadata $ zl list --explicit # what you asked for $ zl sources list # enabled / disabled $ zl sources only pacman aur github
$ zl doctor # full system health check $ zl why libpcre2 # which package pulled it in $ zl size --sort # disk usage, largest first $ zl diff firefox # what an update would change $ zl audit # known CVEs via OSV.dev $ zl cache dedup # hardlink duplicate libs
$ zl history list # every operation, timestamped $ zl history rollback # undo the last one $ zl history rollback 3 # undo the last three $ zl pin firefox # freeze this version $ zl export # write zl-lock.json $ zl import zl-lock.json # reproduce elsewhere
$ zl env shell # throwaway env, dies on exit $ zl env shell myproject # named, persists $ zl env list $ zl env delete myproject $ zl switch python 3.12 # activate another version $ zl completions zsh # bash · zsh · fish
Unter der Haube
Vorhersehbare Ablage auf der Platte, eine Rust-Codebasis mit so wenig nativem Code wie möglich und eine Testsuite, die bei jedem Push läuft.
Alles liegt unter einem Verzeichnis, das dir gehört. Nimm bin in den PATH auf — sonst wird nichts am System angefasst.
~/.local/share/zl/ ├── bin/ symlinks — add to PATH ├── lib/ shared libraries ├── share/ data files ├── etc/ configuration ├── packages/ one dir per name-version ├── cache/ downloads ├── envs/ ephemeral environments └── zl.redb package database
Vergleich
Container und universelle Paketformate lösen dasselbe Problem, indem sie Software isolieren. Zero Layer löst es, indem es Software anpasst.
| Tool | Ansatz | Laufzeitkosten | Plattenkosten | Braucht Daemon |
|---|---|---|---|---|
| Zero Layer | Binärdateien bei Installation patchen | Keine | Gemeinsame Bibliotheken, dedupliziert | Nein |
| Docker / Podman | Vollständiges OS-Image pro App | Prozess- und Namespace-Overhead | Image-Schichten pro App | Ja |
| Flatpak | Mitgelieferte Runtimes | Sandbox und Portal-Umweg | Ein Runtime je App-Familie | Ja |
| Snap | Squashfs und Confinement | Mount- und Confinement-Schicht | Komprimiertes Image pro App | Ja |
| Manueller Tarball | Entpacken und hoffen | Keine | Was immer du kopiert hast | Nein |
Die manuelle Installation zieht beim Overhead mit Zero Layer gleich — und verliert bei allem anderen: nichts wird erfasst, nichts löst Abhängigkeiten auf, und nichts kann es rückgängig machen.
Erste Schritte
Ein Download, eine Zeile im Shell-Profil. Man braucht keinen Paketmanager, um den Paketmanager zu installieren.
v0.3.1 ist veröffentlicht, mit vorgebauten Binärdateien für x86_64 und aarch64, glibc und musl. Alles auf dieser Seite Beschriebene ist enthalten — kein Compiler nötig. Release-Notes →
Hol dir das neueste Release für deine Architektur. Nimm die zweite Variante, wenn du auf sudo verzichten willst.
$ curl -Lo zl https://github.com/polpo21/zero_layer/releases/latest/download/zl-x86_64-unknown-linux-gnu $ chmod +x zl && sudo mv zl /usr/local/bin/ # or, without sudo: $ mkdir -p ~/.local/bin && mv zl ~/.local/bin/ # other builds: zl-x86_64-unknown-linux-musl, # zl-aarch64-unknown-linux-gnu, zl-aarch64-unknown-linux-musl
Zero Layer verlinkt die installierten ausführbaren Dateien in sein eigenes bin-Verzeichnis.
# bash (~/.bashrc) or zsh (~/.zshrc) export PATH="$HOME/.local/share/zl/bin:$PATH" # fish fish_add_path ~/.local/share/zl/bin
Lass --from weg, und Zero Layer durchsucht alle aktiven Quellen und lässt dich wählen.
$ zl install ripgrep $ zl install sharkdp/bat --from github $ zl doctor # confirm everything is healthy
Lieber selbst bauen? Erfordert Rust 1.90 oder neuer. cargo build --release →
FAQ
~/.local/share/zl. Root ist nur relevant, wenn du die Binärdatei zl selbst nach /usr/local/bin legen willst — und auch das ist optional.--dry-run vorab ansehen.Kostenlos und quelloffen unter der MIT-Lizenz. Kein Konto, keine Telemetrie, kein Daemon.