Jaka jest różnica między / opt a / usr / local?


403

Zgodnie ze standardem hierarchii systemów plików , /optsłuży do „instalacji dodatkowych pakietów aplikacji”. /usr/localjest „do użytku przez administratora systemu podczas lokalnej instalacji oprogramowania”. Te przypadki użycia wydają się dość podobne. Oprogramowanie nie dołączone do dystrybucji zwykle jest domyślnie skonfigurowane do instalacji w jednym /usr/locallub /optbez określonego wiersza lub powodu, dla którego wybrali.

Czy brakuje mi jakiejś różnicy, czy oba robią to samo, ale istnieją z powodów historycznych?


3
Rozumiem, że /usr/localjest to lokalna wersja /usrsystemu plików, podczas gdy /optjest miejscem zastępczym dla różnych rzeczy.
yasouser

5
Podobne pytanie w Ask Ubuntu , superuser
kenchew

Nie na temat przyczyn historycznych: Zrozumienie podziału bin, sbin, usr / bin, usr / sbin .
Alexey

Odpowiedzi:


357

Oba są zaprojektowane tak, aby zawierały pliki nienależące do systemu operacyjnego, /opti /usr/localnie mają zawierać tego samego zestawu plików.

/usr/localto miejsce do instalowania plików zbudowanych przez administratora, zwykle za pomocą makepolecenia (np ./configure; make; make install.). Chodzi o to, aby uniknąć kolizji z plikami, które są częścią systemu operacyjnego, które w przeciwnym razie zostałyby zastąpione lub zastąpiłyby pliki lokalne (np. /usr/bin/fooJest częścią systemu operacyjnego, podczas gdy /usr/local/bin/foojest lokalną alternatywą).

Wszystkie pliki poniżej /usrmożna udostępniać między instancjami systemu operacyjnego, chociaż rzadko dzieje się tak w przypadku systemu Linux. Jest to część, w której FHS jest nieco wewnętrznie sprzeczny, ponieważ /usrjest zdefiniowany jako tylko do odczytu, ale /usr/local/binmusi być do odczytu i zapisu, aby lokalna instalacja oprogramowania zakończyła się pomyślnie. Standard systemu plików SVR4, który był głównym źródłem inspiracji FHS, zaleca unikanie tego problemu /usr/locali używanie go /opt/localzamiast tego.

/usr/localjest dziedzictwem oryginalnej BSD. W tym czasie kod źródłowy /usr/binkomend OS były /usr/src/bini /usr/src/usr.bin, podczas gdy źródło lokalnie opracowanych poleceń było /usr/local/src, a ich binaria /usr/local/bin. Nie było pojęcia opakowania (poza kulkami).

Z drugiej strony /optjest katalogiem do instalowania wydzielonych pakietów (tj. Pakietów nie stanowiących części dystrybucji systemu operacyjnego, ale dostarczonych przez niezależne źródło), każdy w swoim własnym podkatalogu. Są już zbudowane całe pakiety dostarczone przez niezależnego zewnętrznego dystrybutora oprogramowania. W przeciwieństwie do /usr/localrzeczy, te pakiety są zgodne z konwencjami katalogowymi (a przynajmniej powinny). Na przykład someappzostałby zainstalowany w /opt/someapp, z jednym poleceniem /opt/someapp/bin/foo, jego plikiem konfiguracyjnym byłby /etc/opt/someapp/foo.conf, a pliki dziennika w /var/opt/someapp/logs/foo.access.


53
/ usr / local, do samodzielnego, wbudowanego, skompilowanego i obsługiwanego oprogramowania. Opcja / opt jest przeznaczona dla zewnętrznego, wstępnie zapakowanego obszaru instalacji pakietu binarnego / aplikacji. Hmmm ... nie mamy plików programu C: \ na wszystko ;-)
Nikhil Mulley

2
„Z drugiej strony, / opt jest katalogiem, w którym mają być zainstalowane pakiety niepowiązane”. Co oznaczają tutaj pakiety „niezwiązane”?
Kevin Wheeler

1
@KevinWheeler To wyjaśniono w następnym zdaniu. Uwolniony oznacza, że ​​pakiety nie są częścią dystrybucji systemu operacyjnego, ale są dostarczane przez niezależne źródło.
jlliagre

2
@jlliagre stan centos docs * stan „Na przykład, jeśli katalog / usr / jest zamontowany jako udział NFS tylko do odczytu ze zdalnego hosta, nadal można zainstalować pakiet lub program w katalogu / usr / local /” Nie wiem, kto ma rację, ale wydaje się to przeczyć twojemu twierdzeniu o obszarze, w którym FHS jest słaby. (* źródło centos.org/docs/5/html/5.1/Deployment_Guide/… )
Kevin Wheeler

1
@KevinWheeler To właśnie słabość mam na myśli. Zainstalowanie pakietu lub programu w zdalnym katalogu tylko do odczytu jest po prostu niemożliwe. Obejściem tego problemu byłoby zamontowanie lokalnego systemu plików na / usr / local, ale wygląda to bardziej jak prowizoryczne zadanie niż coś właściwie zaprojektowanego.
jlliagre,

84

Podstawowa różnica polega na tym, że /usr/localoprogramowanie nie jest zarządzane przez program pakujący system, ale nadal przestrzega standardowych zasad wdrażania unix.

Dlatego trzeba /usr/local/bin, /usr/local/sbin /usr/local/includeetc ...

/optz drugiej strony dotyczy oprogramowania, które nie przestrzega tego i jest wdrażane w sposób monolityczny. Zwykle obejmuje to oprogramowanie komercyjne i / lub wieloplatformowe, które jest spakowane w stylu „Windows”.


12
Nie zgadzam się co do twojego monolitycznego punktu. Standard FHS mówi, że pakiety zainstalowane w podkatalogach / opt muszą mieć zainstalowane pliki specyficzne dla hosta poza / opt, odpowiednio w / etc / opt / package dla plików konfiguracyjnych i / var / opt / package dla dzienników, bufora i tym podobnych. / opt jest w rzeczywistości bliższy regułom wdrażania unix niż / usr / local, które umieszczają wszystko w katalogu, który powinien być tylko do odczytu, ale nie może być z oczywistych powodów.
jlliagre

5
Jasne, gdybym robił pakiet opt ​​i chciałbym domagać się zgodności z FHS. W przeciwnym razie standard jest bardziej tym, co nazwałbyś „wytycznymi”. To, że NetBeans nie używa / etc / opt / netbeans, nie powstrzyma mnie przed umieszczeniem go w katalogu / opt dla systemu lub $ HOME / .local / opt dla jednego użytkownika.
jla

1
@jla Zakładam, że twój ostatni komentarz został skierowany do mnie, więc proszę użyć @ xxx, odpowiadając komuś innemu, że OP lub autor odpowiedzi. Jeśli chodzi o / etc / opt, FHS nie twierdzi, że jest to zalecana lokalizacja (jako wytyczna), ale obowiązkowa. Ty lub programista Netbeans możecie swobodnie naruszać ten standard, ponieważ nie ma uprawnień do jego egzekwowania, ale nie mówcie, że niewłaściwe postępowanie jest właściwą drogą. Jest to po prostu niefortunne nieporozumienie lub celowe naruszenie.
jlliagre

8
@jlliagre Jako administrator mojego systemu, FHS jest zbiorem wytycznych. Katalog / opt to dobrze znane miejsce do umieszczenia oprogramowania monolitycznego / opt / <package> lub / opt / <provider>. Kiedy instaluję pakiet, który chce używać <pakiet | dostawca> / all / data / wymagany / to / support, przechodzi w tryb opt / nawet, jeśli dostawca nie przestrzega każdego szczegółu najnowszego FHS. Mogę wysłać e-mail lub zgłosić błąd, ale nie zamierzam umieszczać tego monolitycznego pakietu w innym miejscu, aby poczuć się lepiej z FHS w moim systemie.
jla

1
@ jlliagre Zainstalowałem wiele rzeczy w / opt i żaden plik nie jest tworzony w / etc / opt. Powinien?
erm3nda

18

Są bardzo podobne, a użycie jednego lub drugiego jest bardziej kwestią opinii. Czasopismo Linux miał ten punkt / kontrapunkt dyskusję o dokładnym ten temat tutaj .


9
O jej. Nie chciałem wciągnąć się w „świętą wojnę”.
Poprawki

13

Dla mnie osobiście tak powiedział Bill w linku @ philfr:

W systemie deweloperskim lub w piaskownicy posiadanie katalogu / opt, w którym możesz po prostu wrzucić rzeczy i sprawdzić, czy działają, ma sens. Wiem, że nie zamierzam samodzielnie pakować rzeczy, aby je wypróbować. Jeśli aplikacja nie działa, możesz po prostu uruchomić katalog / opt / mytestapp, a ta aplikacja jest historią. Pakowanie może mieć sens, gdy prowadzisz duże wdrożenie (są chwile, kiedy robię aplikacje), ale wiele razy miło jest wrzucić / opt.

Niestety, większość make installskryptów wpycha pliki /usr/localzamiast tworzyć tam tylko dowiązanie symboliczne: - /


2
Jaki byłby sens? Jeśli mimo wszystko zamierzasz utworzyć dowiązanie symboliczne, dlaczego nie po prostu umieścić tam oryginalny plik?
Let_Me_Be

8
Wystarczy skomentować make installdocelowy plik wypychający do /usr/local; Ta funkcjonalność jest łatwo zmieniane przez przekazanie --prefix=parametru wiersza polecenia do ./configureskryptu, lub jeśli nie ma ./configureskrypt, można przekazać parametr do makecelu tak: make --prefix=/usr install.
Sean C.

3
Czy / opt to standardowy katalog zawarty w $ PATH? Wiem, że / usr / local is.
LawrenceC

5
@Let_Me_Be korzyścią byłoby to, że bardzo łatwo jest zachować starsze wersje. Załóżmy, że mam 2 wersje „foo”, zlokalizowane w /opt/foo-1.1i /opt/foo-1.2. Kiedy aktualizuję, foodowiązanie symboliczne /usr/local/binwskazuje na foo-1.2. Jeśli z jakiegoś powodu muszę wycofać, po prostu zastępuję dowiązanie symboliczne takim, które wskazuje na foo-1.1. Jeśli 1.2 jest w porządku po kilku tygodniach, szybkie rm -rf /opt/foo-1.1usuwanie starszej wersji szybko i czysto.
pepoluan

7
@ultrasawblade nie, nie jest. i nigdy nie powinno być. w końcu, zgodnie z FHS, / opt musi być podzielony na podkatalogi opatrzone nazwą pakietu. wtłoczenie wszystkiego w ŚCIEŻKĘ to pewny sposób na katastrofę. raczej aplikacje powinny instalować się pod / opt i dowiązać symbolicznie swoje wywołane przez użytkownika programy do / usr / local / bin (lub sbin).
pepoluan

11

Po pierwsze, nie sądzę, że istnieje ścisła odpowiedź; różni administratorzy będą mieli różne opinie, w zależności od ich pochodzenia. Historycznie /usr/localbyło pierwsze; była to konwencja w Berkley, IIRC. W pewnym momencie rozwoju Systemu V, jeśli się nie mylę (to było dawno temu, a ja nie robiłem notatek), pojawiła się decyzja lub chęć zamontowania /usrtylko do odczytu, co oznaczało, że nie można dodać do niego nowego oprogramowania; być może dlatego /opt został wynaleziony. Tak się składa, że ​​istniało tak wiele istniejących programów, które napisały, /usrże ten pomysł nigdy tak naprawdę się nie zaczął.

Osobiście preferuję /optoddzielny podkatalog dla każdego produktu; powoduje to, że usunięcie produktu jest prostym przypadkiem rm -fr. Ale jeśli całe twoje oprogramowanie jest zainstalowane za pomocą dobrego menedżera pakietów, nie ma to znaczenia, a jeśli instalowane oprogramowanie nie przestrzega ściśle tych konwencji i zapisuje konfiguracje /usritp., To nie ma znaczenia, chociaż z przeciwnych powodów.


1
„” „całe twoje oprogramowanie jest instalowane przez dobrego menedżera pakietów” „”, co jest niemożliwe, chyba że używasz tylko często używanego oprogramowania.
Pacerier

1
@Pacerier jest to możliwe, zależy to od używanej dystrybucji. Cokolwiek to jest oprogramowanie, prawdopodobnie znajduje się w repozytorium użytkowników Arch, a jeśli nie, PKGBUILD jest stosunkowo łatwy do napisania.
StarlitGhost,

9

Mam nieco inne podejście do tej kwestii.
Choć wszystko w jlliagre „s odpowiedź jest poprawna, praktyczne zastosowanie dla mnie, podczas wdrażania oprogramowania w klastrze, sprowadza się do domyślnych zmiennych środowiskowych i domyślnej ponownego wykorzystania bibliotekami.

Mówiąc najprościej - /usr/locala wszystkie jego potomne katalogi znajdują się w odpowiednich zmiennych env, takich jak PATHi MANPATH, i /usr/local/lib{,64}są w ldconfig's ( /etc/ld.so.conf.d/).

/opt/OTOH nie jest - co jest zarówno korzystne, gdy wymaga współistnienia wielu wersji lub sprzecznych pakietów w systemie, ale wymaga pewnego rodzaju zarządzania środowiskiem (np. Modułów środowiska lub kolekcji oprogramowania ), i jest niekorzystne, ponieważ potencjalnie „zmarnowałoby” „miejsce do przechowywania poprzez kopiowanie bibliotek współdzielonych, ponieważ każda instalacja /optmoże być całkowicie samodzielna.

Dla wspólnego charakteru /usr/localpracy zakłada się, że np. Pliki binarne są instalowane bezpośrednio na /usr/local/bin(i stronach man odpowiednio /usr/local/share/man/...) zamiast /usr/local/app/{bin,share/man,...}itp.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.