Qual è la differenza tra / opt e / usr / local?


404

Secondo il Filesystem Hierarchy Standard , /optè per "l'installazione di pacchetti software applicativi aggiuntivi". /usr/localè "per l'uso da parte dell'amministratore di sistema durante l'installazione del software in locale". Questi casi d'uso sembrano abbastanza simili. Il software non incluso con le distribuzioni di solito è configurato per impostazione predefinita per l'installazione in /usr/localo /optsenza una particolare rima o motivo per cui hanno scelto.

C'è qualche differenza che mi manca o entrambi fanno la stessa cosa, ma esistono per ragioni storiche?


3
La mia comprensione è che si /usr/localtratta di una versione locale del /usrfile system, mentre /optè un segnaposto per cose diverse.
Yasouser,

5
Domanda simile in Chiedi a Ubuntu , superutente
kenchew,


Risposte:


357

Mentre entrambi sono progettati per contenere file non appartenenti al sistema operativo /opte /usr/localnon sono destinati a contenere lo stesso set di file.

/usr/localè un luogo in cui installare i file creati dall'amministratore, in genere utilizzando il makecomando (ad esempio, ./configure; make; make install). L'idea è quella di evitare scontri con i file che fanno parte del sistema operativo, che verrebbero sovrascritti o sovrascriverebbero quelli locali (ad esempio, /usr/bin/foofa parte del sistema operativo mentre /usr/local/bin/fooè un'alternativa locale).

Tutti i file sottostanti /usrsono condivisibili tra istanze del sistema operativo, sebbene ciò avvenga raramente con Linux. Questa è una parte in cui l'FHS è leggermente contraddittorio, poiché /usrè definito di sola lettura, ma /usr/local/bindeve essere letto e scritto per consentire l'installazione locale del software. Lo standard del file system SVR4, che è stata la principale fonte di ispirazione dell'FHS, raccomanda di evitare /usr/locale utilizzare /opt/localinvece per superare questo problema.

/usr/localè un'eredità del BSD originale. A quel tempo, era presente il codice sorgente dei /usr/bincomandi del sistema operativo /usr/src/bine /usr/src/usr.bin, mentre era presente la fonte dei comandi sviluppati localmente /usr/local/srce i relativi file binari /usr/local/bin. Non c'era idea di imballaggi (al di fuori dei tarball).

D'altra parte, /optè una directory per l'installazione di pacchetti disaggregati (ovvero pacchetti che non fanno parte della distribuzione del sistema operativo, ma forniti da una fonte indipendente), ognuno nella propria sottodirectory. Sono già costruiti interi pacchetti forniti da un distributore di software di terze parti indipendente. A differenza delle /usr/localcose, questi pacchetti seguono le convenzioni della directory (o almeno dovrebbero). Ad esempio, someappverrebbe installato in /opt/someapp, con uno dei suoi comandi in essere /opt/someapp/bin/foo, il suo file di configurazione sarebbe in /etc/opt/someapp/foo.conf, e i suoi file di log in /var/opt/someapp/logs/foo.access.


53
/ usr / local, per software autonomo, interno, compilato e gestito. / opt è per l'area di installazione del bundle / applicazione binaria non autonoma, esterna, preconfezionata. Hmmm ... non abbiamo C: \ programmi per tutto ;-)
Nikhil Mulley

2
"D'altra parte, / opt è una directory in cui installare i pacchetti non raggruppati" Cosa significano qui i pacchetti "non raggruppati"?
Kevin Wheeler,

1
@KevinWheeler Questo è spiegato nella frase successiva. Unbundled significa pacchetti che non fanno parte della distribuzione del sistema operativo ma forniti da una fonte indipendente.
jlliagre,

2
@jlliagre the centos docs * state "Ad esempio, se la directory / usr / è montata come condivisione NFS di sola lettura da un host remoto, è ancora possibile installare un pacchetto o programma nella directory / usr / local /" Non so chi abbia ragione, ma questo sembra essere in contraddizione con la tua affermazione su un'area in cui l'FHS è debole. (* fonte centos.org/docs/5/html/5.1/Deployment_Guide/… )
Kevin Wheeler,

1
@KevinWheeler Questa è precisamente la debolezza a cui mi riferisco. Installare un pacchetto o un programma in una directory remota di sola lettura è semplicemente impossibile. La soluzione alternativa consisterebbe nel montare un file system locale su / usr / local ma questo sembra più un lavoro di fortuna che qualcosa di adeguatamente progettato.
jlliagre,

84

La differenza di base è che il /usr/localsoftware non è gestito dal system packager, ma continua a seguire le regole di distribuzione unix standard.

Ecco perché hai /usr/local/bin, /usr/local/sbin /usr/local/includeecc ...

/optd'altra parte è per software che non segue questo e viene distribuito in modo monolitico. Questo di solito include software commerciale e / o multipiattaforma confezionato in stile "Windows".


12
Non sono d'accordo sul tuo punto monolitico. Lo standard FHS afferma che i pacchetti installati nelle sottodirectory / opt devono avere i loro file specifici dell'host installati all'esterno / opt, rispettivamente in / etc / opt / package per i file di configurazione e / var / opt / package per registri, spool e simili. / opt è in realtà più vicino alle regole di distribuzione unix di / usr / local, che mette tutto in una directory che dovrebbe essere di sola lettura ma non può essere per ovvi motivi.
jlliagre,

5
Certo, se stavo realizzando un pacchetto opt e volessi rivendicare la conformità FHS. Altrimenti lo standard è più quello che chiamereste "linee guida". Solo perché NetBeans non usa / etc / opt / netbeans non mi impedirà di inserirlo / optare per l'intero sistema o $ HOME / .local / optare per un singolo utente.
jla

1
@jla Presumo che il tuo ultimo commento sia stato indirizzato a me, quindi per favore usa @ xxx quando rispondi a qualcun altro che l'OP o l'autore della risposta. A proposito di / etc / opt, l'FHS non dice che è una posizione consigliata (come linea guida) ma una posizione obbligatoria. Tu o lo sviluppatore di Netbeans siete liberi di violare tale standard in quanto non vi è alcuna autorità per applicarlo, ma non dire che sbagliare è la strada da percorrere. È solo uno sfortunato malinteso o una violazione intenzionale.
jlliagre,

8
@jlliagre Come amministratore del mio sistema, l'FHS è un insieme di linee guida. La directory / opt è il luogo ben consolidato per inserire il software monolitico / opt / <package> o / opt / <provider>. Quando installo un pacchetto che vuole usare <package | provider> / all / data / richiesto / to / support, entra in opt / anche se il provider non riesce a seguire ogni dettaglio dell'ultimo FHS. Potrei inviare un'e-mail o segnalare un bug, ma non inserirò quel pacchetto monolitico da qualche altra parte per sentirmi meglio sull'FHS sul mio sistema.
jla,

1
@jlliagre Ho installato molte cose in / opt e nessun file è stato creato in / etc / opt. Dovrebbero?
erm3nda,

18

Sono davvero molto simili e l'uso dell'uno o dell'altro è più una questione di opinione. Il diario di Linux ha avuto questa discussione punto / contrappunto su questo argomento esatto qui .


9
Oh caro. Non intendevo trascinarmi in una "guerra santa".
Patch del

13

Per me, personalmente, è quello che Bill ha detto nel link di @ philfr:

Su un sistema di sviluppo o su una sandbox, avere una directory / opt in cui puoi semplicemente lanciare le cose e vedere se funzionano ha molto senso. So che non passerò attraverso lo sforzo di impacchettare le cose per provarle. Se l'app non funziona, puoi semplicemente rm la directory / opt / mytestapp e quell'applicazione è cronologia. Il packaging può avere senso quando si esegue una distribuzione di grandi dimensioni (ci sono momenti in cui eseguo pacchetti di app), ma molte volte è bello gettare / optare.

Sfortunatamente, la maggior parte degli make installscript inserisce i file /usr/localinvece di creare un link simbolico lì: - /


2
Quale sarebbe il punto? Se hai intenzione di creare comunque il link simbolico, perché non mettere il file originale lì per primo?
Let_Me_Be

8
Solo per commentare l' make installobiettivo spingendo i file in /usr/local; questa funzionalità è facilmente modificabile passando un --prefix=parametro di riga di comando per la ./configuresceneggiatura, o se non ci sono ./configurescript, è possibile passare un parametro al makebersaglio in questo modo: make --prefix=/usr install.
Sean C.,

3
/ Optare per una directory standard è inclusa in $ PATH? So che / usr / local è.
LawrenceC,

5
@Let_Me_Be il vantaggio sarebbe che è molto facile mantenere versioni precedenti. Diciamo che ho 2 versioni di 'pippo', situate in /opt/foo-1.1e /opt/foo-1.2. Quando aggiorno, foocollegamento simbolico in /usr/local/binpunti a foo-1.2. Se per qualche motivo devo eseguire il rollback, sostituisco semplicemente il collegamento simbolico con uno che punta a foo-1.1. Se 1.2 va bene dopo diverse settimane, una rapida rm -rf /opt/foo-1.1rimuove la versione precedente in modo rapido e pulito.
pepoluan,

7
@ultrasawblade no, non lo è. e mai dovrebbe esserlo. dopo tutto, secondo FHS, / opt deve essere suddiviso in sottocartelle con il nome del pacchetto. stipare tutto nel PERCORSO è un modo infallibile per il disastro. piuttosto, le app dovrebbero installarsi in / opt e collegare i loro programmi invocati dall'utente in / usr / local / bin (o sbin).
pepoluan,

11

Innanzitutto, non penso che ci sia una risposta rigorosa; amministratori diversi avranno opinioni diverse, in base al loro background. Storicamente, è /usr/localvenuto prima; era la convention di Berkley, IIRC. Ad un certo punto durante lo sviluppo di System V, se non sbaglio (è successo tanto tempo fa e non ho preso appunti), c'era una decisione o un desiderio di poter montare /usrin sola lettura, il che significa che non è possibile aggiungere nuovo software ad esso; quello potrebbe essere stato il motivo per cui è /opt stato inventato. A quanto pare, c'erano così tanti software esistenti che hanno scritto a /usrquell'idea che non è mai veramente decollata.

La mia preferenza personale è /opt, con una sottodirectory separata per ciascun prodotto; questo rende la rimozione di un prodotto un semplice caso di rm -fr. Ma se tutto il tuo software viene installato tramite un buon gestore di pacchetti, non importa, e se il software che installi non obbedisce rigorosamente a queste convenzioni e scrive configurazioni e simili da qualche parte sotto /usr, non importa neanche, anche se per le ragioni opposte.


1
"" "tutto il tuo software viene installato tramite un buon gestore di pacchetti" "" impossibile a meno che non utilizzi solo software spesso utilizzato.
Pacerier

1
@Pacerier è possibile, dipende dalla distro che stai usando. Qualunque sia il software, è probabilmente nel Arch User Repository e, in caso contrario, un PKGBUILD è relativamente facile da scrivere.
StarlitGhost

9

Ho una visione leggermente diversa di questo problema.
Mentre tutto in jlliagre 's risposta è corretta, l'applicazione pratica per me, durante la distribuzione del software in un cluster, si riduce a variabili d'ambiente di default e il riutilizzo predefinito di librerie.

In parole povere - /usr/locale tutte le sue dir figlio sono negli ambienti appropriati come PATHe MANPATH, e /usr/local/lib{,64}sono in ldconfig's ( /etc/ld.so.conf.d/).

/opt/OTOH non lo è - il che è vantaggioso quando si richiedono la coesistenza di più versioni o pacchetti in conflitto nel sistema, ma richiede una sorta di gestione dell'ambiente (ad es. Moduli ambientali o raccolte di software ) e svantaggioso in quanto potenzialmente "spreca" "spazio di archiviazione duplicando le librerie condivise, poiché ogni installazione /optpuò essere completamente autonoma.

Affinché la natura condivisa /usr/localfunzioni, si presume che, ad esempio, i binari siano installati direttamente su /usr/local/bin(e le pagine man siano appropriate /usr/local/share/man/...) piuttosto che /usr/local/app/{bin,share/man,...}ecc.

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.