Quali sono le alternative all'FHS?


32

Sono un utente Linux da molto tempo da oltre 15 anni, ma una cosa che odio con passione è la struttura delle directory obbligatoria. Non mi piace che /usr/binè la discarica per i binari o librerie a /usr/lib, /usr/lib32, /usr/libx32, /lib, /lib32ecc ... roba a caso nel /usr/shareecc E 'muto e confuso. Ma ad alcuni piace e gusti diversi.

Voglio una struttura di directory in cui ogni pacchetto è isolato. Immagina invece se il drago del lettore multimediale avesse una propria struttura:

/software/dragon
/software/dragon/bin/x86/dragon
/software/dragon/doc/README
/software/dragon/doc/copyright
/software/dragon/lib/x86/libdragon.so

O:

/software/zlib/include/zlib.h
/software/zlib/lib/1.2.8/x86/libz.so
/software/zlib/lib/1.2.8/x64/libz.so
/software/zlib/doc/examples/...
/software/zlib/man/...

Ottieni il punto. Quali sono le mie opzioni? C'è qualche distro Linux che usa qualcosa come il mio schema? Alcune distro possono essere modificate per funzionare come le voglio (Gentoo ??) o ho bisogno di LFS? C'è qualche arte nota in questo settore? Come pubblicazioni su se il regime è fattibile o non fattibile?

Non sto cercando OS X. :) Ma ispirato a OS X è totalmente ok.

Modifica : non ho idea di come PATH, LD_LIBRARY_PATHe altre variabili d'ambiente che dipendono da un piccolo insieme di percorsi dovrebbero funzionare. Sto pensando che se ho l'editor di KDE Kate installato in /software/kate/bin/x86/bin/katepoi io sono ok con dover digitare il percorso completo del file binario per avviarlo. Come dovrebbe funzionare per le librerie e le dlopenchiamate dinamiche , non lo so, ma non può essere un problema di ingegneria irrisolvibile.


3
Come sarebbe il tuo percorso di ricerca se tutti i tuoi binari fossero nascosti ovunque? Come si aggiorna il percorso in processi / sessioni già in esecuzione quando si installa il software dopo l'avvio? Quali sarebbero le tue misure di sicurezza per impedire a un utente medio di in qualche modo riuscire a modificare un binario in qualche oscuro ramo di bin? Sicuramente perdi il conforto di possibilmente creare / usr una parizione di sola lettura, forse un comune innesto di rete per molte macchine ...
Hagen von Eitzen,

1
@HagenvonEitzen Ma (usando lo schema di denominazione e gli esempi dell'OP) /software, invece, potresti fare la sola lettura, per gli stessi vantaggi e svantaggi della /usrsola lettura in FHS.
un CVn

Le librerie dinamiche possono utilizzare nomi di installazione o RPATH.
asmeurer,

1
La tua domanda mi ha ricordato cr.yp.to/slashpackage.html . Non sono sicuro che questo sia pertinente, però.
bli,

Risposte:


50

Innanzitutto, una dichiarazione di non responsabilità sul conflitto di interessi: sono uno sviluppatore GoboLinux di lunga data.

In secondo luogo, un'affermazione anticipata dell'esperienza del dominio: sono uno sviluppatore GoboLinux di lunga data.

Ci sono alcune diverse strutture nell'uso attuale. GoboLinux ne ha uno e strumenti come GNU Stow , Homebrew , ecc., Usano qualcosa di abbastanza simile (principalmente per i programmi utente). NixOS utilizza anche una gerarchia non standard per i programmi e la filosofia di vita. È anche un esperimento LFS ragionevolmente comune.

Descriverò tutti questi, e poi commenterò per esperienza su come funziona in pratica ("fattibilità"). La risposta breve è che sì, è fattibile, ma devi volerlo davvero .


GoboLinux

GoboLinux ha una struttura molto simile a ciò che descrivi. Il software è installato in /Programs: /Programs/ZSH/5.0.8contiene tutti i file appartenenti a ZSH 5.0.8, nelle normali directory bin/ lib/ .... Gli strumenti di sistema creano collegamenti simbolici a quei file in una /System/Linksgerarchia, che viene mappata su /usr¹. La PATHvariabile contiene solo la singola directory eseguibile unificata ed LD_LIBRARY_PATHè inutilizzata. Più versioni del software possono coesistere contemporaneamente, ma solo un file con un determinato nome ( bin/zsh) verrà collegato attivamente alla volta. Puoi accedere agli altri attraverso i loro percorsi completi.

Un insieme di link simbolici di compatibilità esiste anche, in modo /bine /usr/binmappare la directory di file eseguibile unificato, e così via. Ciò semplifica la vita del software in fase di esecuzione. Una patch del kernel, GoboHide, consente a quei collegamenti simbolici di compatibilità di essere nascosti dagli elenchi di file (ma ancora attraversabili).

Per contro un'altra risposta, non è necessario modificare il codice del kernel: GoboHide è puramente cosmetico e il kernel non dipende dai percorsi dello spazio utente in generale². GoboLinux ha un sistema init su misura, ma anche questo non è richiesto.

Lo slogan è sempre stato "il filesystem è il gestore dei pacchetti", ma ci sono strumenti di gestione dei pacchetti ragionevolmente ordinari nel sistema. Si può fare tutto usando cp, rme ln, però.

Se vuoi usare GoboLinux, sei il benvenuto. Noterò, tuttavia, che si tratta di un piccolo team di sviluppo e probabilmente scoprirai che alcuni software che desideri non sono confezionati se nessuno ha voluto usarlo prima. La buona notizia è che in genere è abbastanza facile costruire un programma per il sistema (una "ricetta" standard è lunga circa tre righe); la cattiva notizia è che a volte è spiacevolmente complicato, che tratterò più avanti.

pubblicazioni

Ci sono alcune "pubblicazioni". Ho fatto una presentazione a linux.conf.au 2010 sul sistema nel suo insieme che copre tutto in generale, che è disponibile in video: ogv mp4 (anche sul tuo mirror Linux Australia locale); Ho anche scritto i miei appunti in prosa. Ci sono anche alcuni documenti più vecchi, tra cui il famoso " I am not clueless ", sul sito Web GoboLinux , che affronta alcune obiezioni e problemi. Penso che siamo tutti un po 'meno entusiasti in questi giorni, e sospetto che una versione futura adotterà /usrcome posizione di base per i collegamenti simbolici.


NixOS

NixOS mette ogni programma installato nella propria directory sotto /nix/store. Queste directory hanno un nome simile /nix/store/5rnfzla9kcx4mj5zdc7nlnv8na1najvg-firefox-3.5.4/: esiste un hash crittografico che rappresenta l'intera serie di dipendenze e configurazioni che portano a quel programma. All'interno di quella directory ci sono tutti i file associati, con localizzazioni più o meno normali localmente.

Ti permette anche di avere più versioni contemporaneamente e di usarne una qualsiasi. NixOS ha un'intera filosofia associata alla configurazione riproducibile: essenzialmente ha un sistema di gestione della configurazione integrato fin dall'inizio. Si basa su alcune manipolazioni ambientali per presentare all'utente il giusto mondo di programmi installati.


LFS

È abbastanza semplice passare a Linux From Scratch e impostare esattamente la gerarchia desiderata: basta creare le directory e configurare tutto per installarlo nel posto giusto. L'ho fatto un paio di volte nel costruire esperimenti su GoboLinux, e non è sostanzialmente più difficile del semplice LFS. In tal caso è necessario creare i collegamenti simbolici di compatibilità; altrimenti è sostanzialmente più difficile, ma un uso attento dei supporti del sindacato potrebbe probabilmente evitarlo se lo desideri davvero.

Mi sento come se ci fosse un suggerimento LFS su questo esattamente ad un certo punto, ma non riesco a trovarlo ora.


Sulla fattibilità

La cosa su FHS è che è uno standard, è molto comune e riflette ampiamente l'uso esistente al momento in cui è stato scritto. La maggior parte degli utenti non sarà mai su un sistema che non segue sostanzialmente quel layout. Il risultato è che molti software hanno dipendenze latenti da esso che nessuno si rende conto, spesso del tutto involontariamente.

Tutti quegli script con #!/bin/bash? Non va bene se non hai Bash lì. Ecco perché GoboLinux ha tutti quei symlink di compatibilità; è solo pratico. Un sacco di software non funziona in fase di compilazione o in fase di esecuzione in un layout non standard e quindi richiede patch per correggere, spesso in modo piuttosto intrusivo.

Il tuo programma Autoconf di base si installa normalmente felicemente ovunque tu lo dica, ed è abbastanza facile automatizzare il processo di passaggio nel modo corretto --prefix. Altri sistemi di compilazione non sono sempre così belli, sia intenzionalmente infornando nella gerarchia, sia dai principali autori a scrivere configurazioni non portatili. CMake è un grande trasgressore in quest'ultima categoria. Ciò significa che se vuoi vivere in questo mondo devi essere preparato a fare un sacco di lavoro complicato in anticipo nei sistemi di costruzione di altre persone. È una vera seccatura dover patchare dinamicamente i file generati durante la compilazione.

Il runtime è di nuovo un'altra questione. Molti programmi hanno ipotesi su dove si trovano i propri file, o quelli di qualcun altro, relativi o assolutamente relativi. Quando inizi a utilizzare i collegamenti simbolici per presentare una vista coerente, molti programmi presentano dei bug che li gestiscono (o, a volte, comportamenti probabilmente discutibili che non ti sono utili). Ad esempio, uno strumento foobarpotrebbe aspettarsi di trovare l' bazeseguibile accanto o dentro ../sbin. A seconda che legga o meno il suo link simbolico, questi possono essere due posti diversi e nessuno dei due può essere corretto comunque.

Un problema combinato è la /usr/sharedirectory. È per i file condivisi, ovviamente, ma quando metti ogni programma nel suo prefisso non vengono più effettivamente condivisi. Ciò porta a programmi incapaci di trovare icone standard e simili. GoboLinux ha affrontato questo in un modo piuttosto brutto: al momento della compilazione, $prefix/shareera un $prefix/Sharedcollegamento simbolico a , e dopo aver creato il collegamento è stato invece indirizzato alla sharedirectory globale . Ora utilizza il sandboxing in fase di compilazione e lo spostamento dei file per gestire share(e le altre directory), ma gli errori di runtime dalla lettura dei collegamenti possono ancora essere un problema.

Le suite di più programmi sono un altro problema. GoboLinux non ha mai fatto funzionare GNOME completamente, e non credo nemmeno che NixOS lo abbia fatto, perché le interdipendenze del layout sono così elaborate che è solo intrattabile curarle tutte.

Quindi sì, è fattibile , ma:

  • C'è molto lavoro da fare solo per far funzionare le cose.
  • Alcuni software potrebbero non funzionare mai.
  • Le persone ti guarderanno in modo divertente.

Tutti questi possono o meno essere un problema per te.


¹ Utilizza la versione 14.01 /System/Index, che mappa direttamente su /usr. Sospetto che una versione futura potrebbe far cadere la gerarchia di collegamenti / indici e utilizzarla /usrsu tutta la linea.

² È necessario /bin/shche esista per impostazione predefinita.


1
Bella risposta! Gli autori di software sono per lo più ricettivi alle patch per farle funzionare in gobolinux o ostili ad esso?
Björn Lindqvist,

Il più delle volte le patch a monte vanno bene, ma a volte i manutentori possono essere un po 'bellicosi nel fare affidamento sull'FHS. Ricordo anche che i manutentori di KDE insistevano sul fatto che copiare un link simbolico in un file modello non modificabile invece di dereferenziarlo per copiare il file era di progettazione. Molte patch vanno da un percorso hardcoded a un altro, piuttosto che una correzione corretta, quindi non vale comunque la pena inviare a monte.
Michael Homer,

Quindi, se hai trovato e finanziato (in tempo o denaro) la creazione / fork / patching di tutto il software che desideri / hai bisogno (eh, come Apple / Microsoft fa / sembra fare), allora il tuo golden? Ecco come mi sembra. Sono troppo interessato alle innovazioni che infrangono la norma che non sono ostili al desktop come questo.
ThorSummoner,

2
@ThorSummoner: la maggior parte delle distribuzioni corregge pesantemente tutto il software; quel "finanziamento" è già realtà. Queste patch sono un mix di cambiamenti funzionali e, sì, di percorso per abbinare le particolarità della distribuzione. Naturalmente, come utente finale, non te ne accorgi davvero, ma è lì - c'è molto lavoro dietro una distribuzione che è facile da dare per scontato. In generale non è necessario patchare le cose - solo il 13% delle ricette di GoboLinux coinvolge qualsiasi tipo di patch, ad esempio, che è in realtà inferiore a, diciamo, Debian - anche se è un fastidioso tipo di patch da fare quando è obbligatorio.
Michael Homer,

6

Sia GoboLinux (menzionato da F.sb) che GNU guix sono distribuzioni che utilizzano una struttura di directory per pacchetto insieme a collegamenti simbolici per puntare alla versione "corrente" di un binario.

GoboLinux sembra essere la scommessa migliore se si desidera un sistema stabile. GNU guix dice esplicitamente che non è ancora pronto per la produzione. GoboLinux è in circolazione da anni. Non ho mai provato neanche me stesso.


5

controlla GoboLinux .

se si desidera modificare la struttura della directory, è necessario modificare alcuni codici del kernel, il processo di avvio, i runlevel della directory basati su file rc e il gestore dei pacchetti, quindi la struttura della directory.


5

Linux FHS si basa su ciò che Sun e altre società UNIX hanno deciso alla fine degli anni '80.

Un cambiamento importante a quel tempo era abbandonare /usr/local/e introdurre /opt// { bin! lib! man! ...}

Se stai cercando il motivo per cui / usr / bin oggi viene utilizzato come discarica, credo che GNOME sia uno dei progetti più responsabili.

Ciò che è accaduto con le librerie a 32 e 64 bit sembra essere causato da FHS.

Solaris ha introdotto sottodirectory specifiche della piattaforma in /lib /usr/bine /usr/lib. Il tuo desiderio è come Sun abbia migliorato il concetto di base dal 1988.


Non capisco cosa intendi dicendo "abbandonare / usr / local". FHS menziona specificamente / usr / local e / opt .
un CVn

2
L'FHS originale sviluppato da Sun, HP, IBM, AT&T, SGI ovviamente ha rimosso il non sistematico e problematico / usr / local. Non ho idea del perché i Linux abbiano reintrodotto questo errore.
schily

2
"Il tuo desiderio è come Sun abbia migliorato il concetto di base dal 1988." Non capisco questa frase.
Faheem Mitha,

4

Se ogni pacchetto aveva la sua parte del file system, avresti bisogno estremamente grandi e poco maneggevoli variabili d'ambiente PATH, LD_LIBRARY_PATHe simili.

Ovviamente puoi installare tu stesso i pacchetti in questo modo e quindi usare qualcosa come i moduli GNU per gestire se sono nel tuo ambiente o no, e questo è ciò che facciamo per il software scientifico in cui lavoro, ma non lo facciamo per software di sistema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.