Open source — licenza MIT

Un solo comando. Qualsiasi pacchetto. Qualsiasi distro.

Zero Layer è un gestore di pacchetti universale per Linux. Installa software proveniente da 13 ecosistemi diversi su qualunque distribuzione, traducendo i binari al momento dell'installazione — non durante l'esecuzione.

curl -Lo zl https://github.com/polpo21/zero_layer/releases/latest/download/zl-x86_64-unknown-linux-gnu

Un solo binario. Nessun runtime, nessun demone, nessuna dipendenza.

Prende i pacchetti da
  • pacman
  • AUR
  • apt
  • dnf
  • zypper
  • apk
  • xbps
  • portage
  • nix
  • flatpak
  • snap
  • AppImage
  • GitHub
sorgenti di pacchetti
13
overhead a runtime
0ms
test, CI verde
357
demoni in background
0

Il problema

Il packaging su Linux è frammentato per costruzione

Ogni distribuzione ha il proprio formato, i propri repository e la propria idea di dove vadano i file. Il software che ti serve è spesso già pacchettizzato — solo non per il tuo sistema.

Il pacchetto esiste, ma non per te

Uno strumento è nell'AUR, o solo come .deb, o solo come release su GitHub. La tua distro l'ha pacchettizzato due anni fa, oppure mai. Finisci per compilarlo a mano o per rinunciarci.

Le soluzioni alternative costano prestazioni

Container, macchine virtuali e livelli di compatibilità risolvono il problema aggiungendo un livello. E lo paghi per sempre: latenza all'avvio, memoria, disco e un runtime che deve restare in esecuzione.

Le installazioni manuali marciscono in silenzio

Scompattare un tarball in /opt funziona finché una libreria non si sposta. Nulla tiene traccia dei file, nulla conosce le dipendenze e nulla è in grado di annullare l'operazione.

L'idea

Tradurre una volta sola, all'installazione

Un binario Linux non è legato a una distribuzione: è legato a pochi fatti concreti, ovvero quale linker dinamico lo carica e dove si trovano le sue librerie condivise. Entrambi sono scritti dentro il file ELF, ed entrambi si possono riscrivere.

Zero Layer legge quei campi con goblin e li riscrive con elb perché puntino al linker e ai percorsi reali del tuo sistema. Lo fa una volta sola, durante l'installazione.

Da quel momento il binario è semplicemente un binario nativo sulla tua macchina. Nessuno shim, nessuno script wrapper, nessuna sandbox e nessun processo di supervisione. Da qui il nome: il livello è zero.

  • Nessun runtime di container da installare o mantenere attivo
  • Nessuna penalità prestazionale — è lo stesso codice macchina
  • I file finiscono in directory normali, che puoi ispezionare
  • Tutto è tracciato e ogni installazione è annullabile
/usr/bin/rgELF 64-bit LSB · x86-64

compilato per Arch

PT_INTERP
/usr/lib/ld-linux-x86-64.so.2
RUNPATH
—
NEEDED
libpcre2-8.so.0 · libc.so.6

adattato a questa macchina

PT_INTERP
/lib64/ld-linux-x86-64.so.2
RUNPATH
$ORIGIN/../lib:~/.local/share/zl/lib
NEEDED
libpcre2-8.so.0 · libc.so.6

Stesso codice macchina. Ora sa solo dove si trova.

Filosofia

Sei principi dietro ogni scelta

Zero Layer ha una posizione precisa. Queste sono le regole a cui il codice deve rispondere.

Zero overhead dopo l'installazione

Tutto il lavoro di traduzione avviene una volta sola, durante l'installazione. Dopo non resta nulla tra il tuo programma e il kernel.

Rilevare, mai dare per scontato

Architettura, linker dinamico, libc, directory delle librerie e struttura del filesystem vengono rilevati dal sistema in esecuzione, non scritti a mano nel codice.

Atomico o niente

Ogni installazione avviene dentro una transazione che registra ciò che ha toccato. Un errore in qualsiasi punto annulla l'intera operazione.

Un binario, nessuna libreria di sistema

redb al posto di SQLite, elb al posto di patchelf, rustls al posto di OpenSSL. Scritto in Rust; le poche parti native (compressione, crittografia) sono compilate dentro, quindi non c'è nient'altro da installare.

La fonte la scegli tu

Quando un pacchetto esiste in più ecosistemi, Zero Layer li mostra tutti e ti lascia scegliere. Non decide mai al posto tuo in silenzio.

Reversibile per impostazione predefinita

Cronologia, rollback, rilevamento degli orfani e dry-run sono funzioni centrali, non ripensamenti. Puoi sempre vedere cos'è successo e tornare indietro.

Come funziona

Cosa succede quando digiti install

Tra il tuo comando e un binario funzionante ci sono otto fasi. Ognuna è osservabile con -v, e qualsiasi errore riporta tutto indietro.

  1. Risoluzione

    Trova il pacchetto e percorre ricorsivamente l'albero delle dipendenze, rilevando i cicli. Se una dipendenza manca nella sorgente principale, vengono interrogate tutte le altre attive e scegli tu.

    risoluzione cross-sorgente
  2. Controllo conflitti

    Cinque categorie vengono verificate prima di scrivere qualsiasi cosa: proprietà dei file, nomi dei binari, soname delle librerie, conflitti dichiarati e vincoli di versione.

    5 tipi di conflitto
  3. Download

    I pacchetti sono scaricati direttamente dai repository nativi su quattro thread paralleli, con barre di avanzamento e ritentativi automatici con backoff.

    4 thread · retry
  4. Verifica

    I checksum SHA256 sono obbligatori e le firme GPG vengono controllate quando la sorgente le fornisce. Una firma non verificabile viene segnalata diversamente da una errata.

    SHA256 + GPG
  5. Estrazione

    Il formato dell'archivio viene riconosciuto e scompattato — deb, rpm, tar, zst, xz, nar, squashfs, zip o AppImage — poi normalizzato in una struttura FHS standard.

    9 formati di archivio
  6. Patch

    Ogni binario ELF viene analizzato, poi interprete e RUNPATH vengono riscritti per il tuo sistema. I pacchetti con più binari sono patchati in parallelo; quelli statici vengono giustamente lasciati intatti.

    goblin + elb
  7. Installazione

    I file sono collocati in modo atomico dentro una transazione che registra ogni file, directory, symlink e riga di database creata. Qualsiasi errore annulla tutto.

    atomico · rollback
  8. Tracciamento

    File, dipendenze, proprietà e l'operazione stessa vengono scritti in un database integrato: è ciò che rende possibili in seguito why, size, doctor e rollback.

    redb + grafo

Funzionalità

Un gestore di pacchetti completo, non una demo

Tutto quello che ti aspetti dagli strumenti della tua distro, più ciò che non hanno mai avuto.

Traduzione nativa dei binari

I binari ELF vengono analizzati con goblin e modificati con elb durante l'installazione. Linker dinamico e RUNPATH sono riscritti per il tuo sistema, così i pacchetti girano poi a piena velocità nativa.

  • goblin
  • elb
  • PT_INTERP
  • RUNPATH

13 sorgenti in parallelo

Ogni sorgente attiva viene interrogata simultaneamente, i risultati sono ordinati per rilevanza e le varianti binarie AUR vengono trovate in automatico.

Transazioni atomiche

Un'installazione o si completa o non lascia traccia. Mai stati scritti a metà.

Diagnostica integrata

doctor, audit, why, size, diff e history rispondono alle domande su cui di solito i gestori di pacchetti ti lasciano a indovinare.

  • zl doctor
  • zl why
  • zl size
  • zl audit
  • zl diff

Multi-versione e ambienti

Installa più versioni affiancate e passa dall'una all'altra, oppure crea un ambiente effimero che sparisce quando esci dalla shell.

Attento alla sicurezza

Checksum e firme in entrata, ricerca di CVE su OSV.dev in uscita, più il pinning per congelare ciò che non vuoi si muova.

Sorgenti

Tredici ecosistemi, un'unica interfaccia

Ogni sorgente è un plugin che implementa lo stesso trait. Attiva quelle che vuoi per ogni macchina, o filtra per singolo comando con --from.

  • pacmanArch Linux
  • aurArch User Repository
  • aptDebian · Ubuntu
  • dnfFedora · RHEL
  • zypperopenSUSE · SLES
  • apkAlpine Linux
  • xbpsVoid Linux
  • portageGentoo binhost
  • nixnixpkgs
  • flatpakFlathub
  • snapSnapcraft Store
  • appimageAppImageHub
  • githubGitHub Releases
  • Vedi lo stato dei plugin

La disponibilità di una sorgente dipende dalla raggiungibilità dell'upstream. Il repository tiene traccia dello stato reale di ogni plugin.

Comandi

L'interfaccia, dall'inizio alla fine

Un binario, venticinque comandi, completamenti per bash, zsh e 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

Sotto il cofano

Costruito per essere noioso dove conta

Struttura prevedibile su disco, un codice in Rust con il minimo indispensabile di codice nativo e una suite di test che gira a ogni push.

Dove finiscono le cose

Tutto vive sotto un'unica directory che ti appartiene. Aggiungi bin al PATH e nient'altro nel sistema viene toccato.

Vincoli di progetto

  • Binario unico, nessuna libreria di sistema da installare
  • RUNPATH invece di RPATH, così LD_LIBRARY_PATH continua a funzionare
  • Thread invece di un runtime asincrono
  • Tutto rilevato dal sistema in esecuzione
  • Il rollback è un percorso di prima classe, non un caso d'errore
  • Zero warning di clippy, formattato, protetto dalla CI
~/.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

Lo stack

  • Rust 2024
  • goblin
  • elb
  • redb
  • petgraph
  • clap
  • reqwest + rustls
  • indicatif
  • quick-xml
  • sha2
  • zstd
  • tar
  • cpio

Confronto

In cosa si distingue dalle alternative

Container e formati universali risolvono lo stesso problema isolando il software. Zero Layer lo risolve adattandolo.

Tool Approccio Costo a runtime Costo su disco Richiede un demone
Zero Layer Patch dei binari all'installazione Nessuno Librerie condivise, deduplicate No
Docker / Podman Immagine completa di OS per app Overhead di processo e namespace Livelli di immagine per app Sì
Flatpak Runtime inclusi Sandbox e indirezione dei portal Un runtime per famiglia di app Sì
Snap Squashfs e confinamento Livello di mount e confinamento Immagine compressa per app Sì
Tarball manuale Scompatta e spera Nessuno Quello che hai copiato No

L'installazione manuale pareggia Zero Layer sull'overhead — e perde su tutto il resto: nulla è tracciato, nulla risolve le dipendenze e nulla può annullare l'operazione.

Per iniziare

Operativo in meno di un minuto

Un download, una riga nel profilo della shell. Non serve un gestore di pacchetti per installare il gestore di pacchetti.

La v0.3.1 è pubblicata, con binari precompilati per x86_64 e aarch64, glibc e musl. Tutto ciò che è descritto in questa pagina è incluso — non serve compilare nulla. Note di rilascio →

  1. Installa il binario

    Scarica l'ultima release per la tua architettura. Usa la seconda forma se preferisci non usare sudo.

    $ 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
  2. Aggiungilo al PATH

    Zero Layer crea i symlink degli eseguibili che installa nella propria directory bin.

    # bash (~/.bashrc) or zsh (~/.zshrc)
    export PATH="$HOME/.local/share/zl/bin:$PATH"
    
    # fish
    fish_add_path ~/.local/share/zl/bin
  3. Installa qualcosa

    Ometti --from e Zero Layer cercherà in tutte le sorgenti attive lasciandoti scegliere.

    $ zl install ripgrep
    $ zl install sharkdp/bat --from github
    $ zl doctor                # confirm everything is healthy

Preferisci compilarlo da te? Serve Rust 1.90 o successivo. cargo build --release →

FAQ

Domande legittime

Sostituisce il gestore di pacchetti della mia distro?
No, e non ci prova. Zero Layer installa nella tua home e non tocca mai i percorsi di sistema, quindi pacman, apt o dnf continuano a gestire il sistema base esattamente come prima. Usalo per il software che la tua distro non pacchettizza.
Serve root?
No. L'installazione predefinita vive interamente sotto ~/.local/share/zl. Root entra in gioco solo se scegli di mettere il binario zl in /usr/local/bin, e anche quello è facoltativo.
È davvero a zero overhead?
Sì, perché dopo l'installazione non resta nulla in esecuzione. Il binario modificato è normale codice macchina eseguito direttamente dal kernel — nessuna sandbox, nessun supervisore, nessuna traduzione a runtime. Il lavoro avviene una volta sola, durante l'installazione.
E se un pacchetto richiede una libreria che non ho?
Le dipendenze vengono risolte ricorsivamente prima di scaricare qualsiasi cosa e, se una manca nella sorgente principale, vengono cercate in tutte le altre attive. Dopo l'installazione, un controllo finale avvisa se resta qualche libreria condivisa non individuabile.
Cosa succede se un'installazione fallisce a metà?
Non resta nulla. Ogni installazione avviene dentro una transazione che registra file, directory, symlink e voci di database creati, e qualsiasi errore li annulla tutti. Puoi anche vedere l'anteprima di ogni operazione con --dry-run.
Quali distribuzioni supporta?
In linea di principio tutte. Invece di mantenere un elenco, Zero Layer rileva a runtime architettura, linker dinamico, libc, directory delle librerie e struttura del filesystem — comprese quelle merged-usr, NixOS, Guix, GoboLinux e Termux.
È pronto per la produzione?
È software giovane, in sviluppo attivo, e lo dice apertamente: il repository tiene traccia di quali plugin sono verificati contro i loro upstream reali e quali sono ancora in riparazione. Il percorso di installazione centrale è coperto da 357 test che vincolano ogni commit.
Come lo disinstallo?
Cancelli la directory. Tutto ciò che Zero Layer installa — pacchetti, database, cache, symlink — sta dentro un'unica cartella, quindi rimuoverla elimina ogni traccia.

Installa qualsiasi cosa, su qualsiasi cosa

Gratuito e open source con licenza MIT. Nessun account, nessuna telemetria, nessun demone.