/ Opt ve / usr / local arasındaki fark nedir?


403

Göre Dosya Sistemi Hiyerarşi Standardı , /opt"eklenti uygulama yazılım paketlerinin yüklenmesi" içindir. /usr/local"yerel olarak yazılım yüklerken sistem yöneticisi tarafından kullanım içindir". Bu kullanım durumları oldukça benzer görünüyor. Yazılım genellikle ya yüklemek için varsayılan olarak yapılandırılır dağılımları yer almayan /usr/localveya /opthangi seçtikleri bakımından hiçbir özel sebep ve mantık yokken.

Kaybettiğim bir fark var mı, yoksa her ikisi de aynı şeyi yapıyor, ancak tarihsel nedenlerden dolayı var mı?


3
Benim anladığım kadarıyla, bu dosya sisteminin /usr/localyerel bir versiyonudur /usr, oysa yanlış /optşeyler için yer tutucudur.
yasouser

5
Benzer bir soru sor Ubuntu , superuser
kenchew 7:16


Yanıtlar:


357

Her iki işletim sistemine ait olmayan dosyaları içerecek şekilde tasarlanmıştır, iken /optve /usr/localaynı dosya kümesi içerecek şekilde amaçlanmamıştır.

/usr/localYönetici tarafından oluşturulan dosyaları, genellikle makekomutu kullanarak (örn ./configure; make; make install.) kurabileceğiniz bir yerdir . Buradaki düşünce, işletim sisteminin bir parçası olan ya da yerel dosyaların üzerine yazılacak ya da üzerine yazacak dosyalara çarpmamaktan kaçınmaktır (örneğin, yerel bir alternatif olsa da işletim sisteminin bir /usr/bin/fooparçasıdır /usr/local/bin/foo).

/usrBu, Linux ile nadiren yapılmasına rağmen, altındaki tüm dosyalar işletim sistemi örnekleri arasında paylaşılabilir. Bu, FHS'nin /usrsalt okunur olarak tanımlandığı gibi biraz çelişkili olduğu, ancak /usr/local/binyerel yazılım kurulumunun başarılı olması için okunması gereken bir bölüm . FHS'nin ana ilham kaynağı olan SVR4 dosya sistemi standardı, bu sorunun üstesinden gelmekten kaçınmak /usr/localve kullanılmasını tavsiye ediyor /opt/local.

/usr/localorijinal BSD’den kalan bir miras. O zaman, kaynak kodu /usr/binişletim sistemi komutları vardı /usr/src/binve /usr/src/usr.binyerel olarak geliştirilmiş komutların kaynağı iken /usr/local/srcve onların ikili içinde /usr/local/bin. Ambalaj kavramı (tarball'ların dışında) yoktu.

Öte yandan, /opther biri kendi alt dizininde, birleştirilmiş paketleri (yani, İşletim Sistemi dağıtımının bir parçası olmayan, ancak bağımsız bir kaynak tarafından sağlanan paketler) yüklemek için bir dizindir. Bunlar zaten bağımsız bir üçüncü taraf yazılım distribütörü tarafından sağlanan bütün paketleri inşa ediyorlar. /usr/localBunların aksine , bu paketler dizin kurallarını takip eder (ya da en azından onlar gerekir). Örneğin, someappyüklü olacak /opt/someapponun komuta olmanın biriyle, /opt/someapp/bin/fookendi yapılandırma dosyası olacağını /etc/opt/someapp/foo.confve bunun günlük dosyaları içinde /var/opt/someapp/logs/foo.access.


53
/ usr / local, kendi kendine, şirket içi, derlenmiş ve bakımı yapılmış bir yazılım için. / opt, kendinden olmayan, harici, önceden paketlenmiş ikili / uygulama paketi kurulum alanı içindir. Hmmm ... her şey için C: \ program
dosyamız yok

2
“Öte yandan, / opt, sınırsız paketlerin yükleneceği bir dizindir” 'Sınırsız' paketler burada ne anlama geliyor?
Kevin Wheeler,

1
@KevinWheeler Bir sonraki cümlede açıklanmıştır. Sınırlandırılmamış, İşletim Sistemi dağıtımının bir parçası olmayan ancak bağımsız bir kaynak tarafından sağlanan paketler anlamına gelir.
jlliagre

2
jlliagre centos docs * state "Örneğin, / usr / dizini uzaktaki bir ana bilgisayardan salt okunur NFS paylaşımına bağlıysa, hala / usr / local / dizininde bir paket veya program kurmak mümkündür" Kim doğru bilmiyorum ama bu FHS'nin zayıf olduğu bir alanla ilgili iddianızla çelişiyor gibi görünüyor. (* kaynak centos.org/docs/5/html/5.1/Deployment_Guide/… )
Kevin Wheeler

1
@KevinWheeler Bu tam olarak atıfta bulunduğum zayıflık. Bir paketi veya programı uzak, salt okunur bir dizine yüklemek imkansızdır. Çözüm, yerel bir dosya sistemini / usr / local üzerine kurmak olacaktır ancak bu, düzgün tasarlanmış bir şeyden çok geçici bir işe benziyor.
jlliagre

84

Temel fark, /usr/localsistem paketleyicisi tarafından yönetilmeyen, ancak standart unix dağıtım kurallarını izleyen yazılımlar içindir.

Bu yüzden sahipsin /usr/local/bin, /usr/local/sbin /usr/local/includevb ...

/optÖte yandan, bunu takip etmeyen ve yekpare bir biçimde konuşlandırılmış bir yazılım içindir. Bu genellikle "Windows" tarzında paketlenmiş ticari ve / veya platformlar arası yazılımı içerir.


12
Monolitik noktan için aynı fikirde değilim. FHS standardı, / opt alt dizinlerinde kurulu paketlerin, ana bilgisayarlarına özel dosyalarının, / dosyalar / yapılandırma dosyaları için sırasıyla / etc / opt / package altında ve / var / opt / package altında ve loglar için biriktirme ve benzeri paketlere sahip olması gerektiğini söylüyor. / opt, aslında unix dağıtım kurallarına / usr / local komutuna daha yakındır; bu, her şeyi salt okunur olması gereken ancak açık nedenlerden ötürü bir dizinin altına koyar.
jlliagre

5
Tabii, eğer bir seçim paketi hazırlıyorsam ve FHS uyumluluğunu iddia etmek istiyorsam. Aksi halde, standart sizin “kurallar” olarak adlandırdığınız şeydir. NetBeans'ın / etc / opt / netbeans kullanmaması, tek bir kullanıcı için onu sistem genelindeki / opt / HOME / / / loclo / opt 'un içine koymama engellemez.
jla

1
@jla Son yorumunuzun bana yönlendirildiğini farz ediyorum bu yüzden OP veya cevabın yazarı olan bir başkasına cevap verirken lütfen @ xxx kullanın. / Etc / opt hakkında, FHS önerilen bir yer olduğunu söyler (kılavuz olarak) ama zorunlu bir yer. Siz veya Netbeans geliştiricisi, bu standardı ihlal etme konusunda özgürsünüz, çünkü bunu zorlama yetkisi yoktur, ancak yanlış yapma deme yolu. Bu sadece talihsiz bir yanlış anlama veya kasıtlı bir ihlaldir.
jlliagre

8
@jlliagre Sistemimin yöneticisi olarak, FHS bir dizi kuraldır. / Opt dizini, monolitik / opt / <package> veya / opt / <provider> yazılımlarını koymak için sağduyulu ve iyi kurulmuş bir yerdir. <Package | sağlayıcı> / all / data / required / to / support kullanmak isteyen bir paket yüklediğimde, sağlayıcı en son FHS'nin tüm ayrıntılarını takip etmese bile tercih / tercihine gidiyor. Bir e-posta gönderebilir veya bir hata rapor edebilirim, ancak sistemimde FHS hakkında daha iyi hissetmek için bu yekpare paketi başka bir yere koyamayacağım.
jla

1
@jlliagre / opt içine birçok şey yükledim ve / etc / opt içinde hiçbir dosya oluşturulmadı. Meli?
erm3nda

18

Gerçekten çok benzerler ve birinin ya da diğerinin kullanımı daha fazla bir fikir meselesi. Linux dergi tam bu konu hakkında bu nokta / kontrpuan tartışma vardı burada .


9
Ah hayatım. Kendimi “kutsal bir savaşa” sürüklemek istememiştim.
Yamalar

13

Benim için, şahsen, Bill'in @ philfr'ın linkinde söylediği:

Bir geliştirme sisteminde veya bir sanal alanda, şeyleri fırlatıp çalışıp çalışamayacağını görebileceğiniz / opt dizinine sahip olmak çok mantıklı geliyor. Bunları denemek için bir şeyleri paketleme çabasına girmeyeceğimi biliyorum. Uygulama çalışmazsa, / opt / mytestapp dizinini basitçe rm olarak kullanabilirsiniz; bu uygulama tarihçelidir. Paketleme, büyük bir dağıtım çalıştırırken anlamlı olabilir (uygulamaları paketlediğim zamanlar vardır), ancak çoğu zaman, / opt içine malzeme atmak güzeldir.

Ne yazık ki, çoğu make installkomut dosyası dosyaları /usr/localorada bir sembolik bağlantı kurmak yerine içine iter : - /


2
Mesele ne olurdu? Yine de sembolik bağlantı kuracaksanız, neden orijinal dosyayı ilk önce oraya koymuyorsunuz?
Let_Me_Be

8
Sadece make installdosyaları iterek hedefle ilgili yorum yapmak için /usr/local; Bu işlevselliği geçirerek kolayca değiştirilebilir --prefix=için komut satırı parametresini ./configurekomut veya hiçbir yoksa ./configurekomut, size bir parametre iletebilirsiniz makeşöyle hedefi: make --prefix=/usr install.
Sean C.

3
/ PATH standart bir dizini $ PATH içine dahil mi ediyor? / Usr / local olduğunu biliyorum.
LawrenceC

5
@Let_Me_Be yararı, eski sürümleri tutmanın çok kolay olmasıdır. Diyelim ki içinde /opt/foo-1.1ve içinde bulunan 2 'foo' sürümü var /opt/foo-1.2. Yükseltme yaparken, noktalara foosembolik bağlantı /usr/local/binfoo-1.2 olarak geliyor. Herhangi bir nedenden dolayı geri almam gerekiyorsa, sembolik bağlantıyı foo-1.1 yerine işaret eden ile değiştiriyorum. Birkaç hafta sonra 1.2 rm -rf /opt/foo-1.1tamamsa, hızlıca eski sürümü hızlı ve temiz bir şekilde kaldırır.
pepoluan

7
@ultrasawblade hayır, öyle değil. ve asla olmamalı. Sonuçta, FHS'ye göre, / opt, paketin adını taşıyan alt dizinlere bölünmelidir. her şeyi PATH'e tıkmak felaket için kesin bir yol. bunun yerine, uygulamalar kendilerini / opt altına yüklemeli ve kullanıcı tarafından başlatılan programlarını / usr / local / bin (veya sbin) içine eklemelidir.
pepoluan

11

İlk önce kesin bir cevap olduğunu sanmıyorum; farklı yöneticiler, geçmişlerine göre farklı görüşlere sahip olacaklardır. Tarihsel olarak /usr/localönce geldi; IIRC Berkley’de yapılan toplantıydı. Sistem V'in gelişimi sırasında bir noktada yanılmıyorsam (bu çok uzun zaman önceydi ve not almadım), /usrsalt okunur bir şekilde bağlayabilmek için bir karar ya da bir istek vardı , bu, ona yeni bir yazılım ekleyemediğiniz anlamına gelir; bu neden /opt icat edilmiş olabilirdi. Olduğu gibi /usr, bu fikre hiç yazmayan, gerçekten hiçbir zaman gerçek olmayan bir yazılım vardı .

Benim kişisel tercihim, /opther ürün için ayrı bir alt dizin; Bu, bir ürünün çıkarılmasını basit bir durum haline getirir rm -fr. Ancak, yazılımınızın tamamı iyi bir paket yöneticisi tarafından kurulursa, farketmez, ve kurduğunuz yazılım kesinlikle bu kurallara uymuyorsa ve yapılandırmaları ve altındaki herhangi bir yere yazıyorsa /usr, bunun da önemi yoktur. tam tersi nedenlerden dolayı.


1
"" "tüm yazılımlarınız, yalnızca kullanılmış yazılım kullanmıyorsanız imkansız olan" "" iyi bir paket yöneticisi tarafından yüklenir.
Pacerier

1
@Pacerier mümkün, hangi dağıtımı kullandığınıza bağlı. Yazılım ne olursa olsun, muhtemelen Arch User Repository'dedir ve değilse, bir PKGBUILD yazması nispeten kolaydır.
StarlitGhost

9

Bu konuda biraz farklı bir yaklaşımım var. Jlliagre 'in cevabındaki
her şey doğru olsa da, benim için pratik uygulama, bir kümede yazılım dağıtırken, varsayılan ortam değişkenleri ve liblerin varsayılan olarak yeniden kullanımı ile ilgilidir.

Basitçe söylemek gerekirse - /usr/localve tüm alt dirs uygun env gibi vars içindedir PATHve MANPATHve /usr/local/lib{,64}içindedir Ldconfig en ( /etc/ld.so.conf.d/).

/opt/OTOH - sistemde birlikte var olmak için birden fazla sürüm veya çakışan paketler gerektiğinde avantajlıdır, ancak bir tür çevre yönetimi gerektirir (örneğin, çevre modülleri veya yazılım koleksiyonları ) ve potansiyel olarak "israf etmesi dezavantajlıdır msgstr "paylaşılan kütüphaneleri kopyalayarak saklama alanı, çünkü her kurulum /opttamamen kendi içinde olabilir.

Ortak doğası için /usr/localişe, örneğin ikili doğrudan yüklenir varsayılır /usr/local/bin(ve adam uygun kaynaklarına sayfalarda /usr/local/share/man/...) ziyade /usr/local/app/{bin,share/man,...}vb

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.