Sự khác biệt giữa / opt và / usr / local là gì?


404

Theo Tiêu chuẩn phân cấp hệ thống tập tin , /optlà dành cho "việc cài đặt các gói phần mềm ứng dụng bổ trợ". /usr/locallà "để người quản trị hệ thống sử dụng khi cài đặt phần mềm cục bộ". Những trường hợp sử dụng có vẻ khá giống nhau. Phần mềm không được bao gồm trong các bản phân phối thường được cấu hình theo mặc định để cài đặt theo /usr/localhoặc /optkhông có vần điệu hoặc lý do cụ thể mà chúng chọn.

Có một số khác biệt tôi đang thiếu, hoặc cả hai đều làm điều tương tự, nhưng tồn tại vì lý do lịch sử?


3
Sự hiểu biết của tôi /usr/locallà một phiên bản cục bộ của /usrhệ thống tệp, trong khi đó /optlà nơi giữ chỗ cho các thứ linh tinh.
yasouser

5
Câu hỏi tương tự trong Hỏi Ubuntu , superuser
kenchew 7/10/2016

Off-topic về lý do lịch sử: Hiểu về bin, sbin, usr / bin, usr / sbin split .
Alexey

Câu trả lời:


357

Mặc dù cả hai đều được thiết kế để chứa các tệp không thuộc hệ điều hành /opt/usr/localkhông có ý định chứa cùng một bộ tệp.

/usr/locallà nơi để cài đặt các tệp được xây dựng bởi quản trị viên, thường bằng cách sử dụng makelệnh (ví dụ ./configure; make; make install:). Ý tưởng là để tránh xung đột với các tệp là một phần của hệ điều hành, sẽ bị ghi đè hoặc ghi đè lên các tệp cục bộ nếu không (ví dụ: /usr/bin/foolà một phần của HĐH trong khi /usr/local/bin/foolà một thay thế cục bộ).

Tất cả các tệp bên dưới /usrcó thể chia sẻ giữa các phiên bản HĐH, mặc dù điều này hiếm khi được thực hiện với Linux. Đây là một phần trong đó FHS hơi mâu thuẫn, như /usrđược định nghĩa là chỉ đọc, nhưng /usr/local/bincần phải đọc-ghi để cài đặt phần mềm cục bộ để thành công. Tiêu chuẩn hệ thống tệp SVR4, vốn là nguồn cảm hứng chính của FHS, được khuyến nghị nên tránh /usr/localvà sử dụng /opt/localthay thế để khắc phục vấn đề này.

/usr/locallà một di sản từ BSD ban đầu. Vào thời điểm đó, mã nguồn của /usr/bincác lệnh OS nằm trong /usr/src/bin/usr/src/usr.bin, trong khi nguồn của các lệnh được phát triển cục bộ nằm trong /usr/local/srcvà các nhị phân của chúng nằm trong /usr/local/bin. Không có khái niệm về bao bì (bên ngoài tarball).

Mặt khác, /optlà một thư mục để cài đặt các gói chưa được xử lý (tức là các gói không phải là một phần của phân phối Hệ điều hành, nhưng được cung cấp bởi một nguồn độc lập), mỗi gói trong thư mục con riêng của nó. Họ đã được xây dựng toàn bộ các gói được cung cấp bởi một nhà phân phối phần mềm độc lập của bên thứ ba. Không giống như /usr/localcông cụ, các gói này tuân theo các quy ước thư mục (hoặc ít nhất là chúng nên). Ví dụ, someappsẽ được cài đặt /opt/someapp, với một trong các lệnh /opt/someapp/bin/foocủa nó, tệp cấu hình của nó sẽ nằm trong /etc/opt/someapp/foo.confvà các tệp nhật ký của nó /var/opt/someapp/logs/foo.access.


53
/ usr / local, cho bản thân, kênh, phần mềm được biên dịch và bảo trì. / opt dành cho khu vực cài đặt gói nhị phân / ứng dụng không tự, bên ngoài, đóng gói sẵn. Hmmm ... chúng tôi không có tệp C: \ chương trình cho tất cả mọi thứ ;-)
Nikhil Mulley

2
"Mặt khác, / opt là một thư mục để cài đặt các gói chưa được xử lý" Các gói 'unbundled' nghĩa là gì ở đây?
Kevin Wheeler

1
@KevinWheeler Điều đó được giải thích trong câu tiếp theo. Unbundled có nghĩa là các gói không phải là một phần của phân phối Hệ điều hành nhưng được cung cấp bởi một nguồn độc lập.
jlliagre

2
@jlliagre các tài liệu centos * trạng thái "Ví dụ: nếu thư mục / usr / được gắn dưới dạng chia sẻ NFS chỉ đọc từ máy chủ từ xa, vẫn có thể cài đặt gói hoặc chương trình trong thư mục / usr / local /" Tôi không biết ai đúng, nhưng điều này dường như mâu thuẫn với tuyên bố của bạn về một lĩnh vực mà FHS yếu. (* nguồn centos.org/docs/5/html/5.1/Deployment_Guide/ Khăn )
Kevin Wheeler

1
@KevinWheeler Đó chính xác là điểm yếu mà tôi đang đề cập đến. Cài đặt một gói hoặc một chương trình trong một thư mục chỉ đọc từ xa là không thể. Cách giải quyết sẽ là gắn kết một hệ thống tệp cục bộ trên / usr / local nhưng điều này trông giống như một công việc tạm thời hơn là một thứ được thiết kế đúng.
jlliagre

84

Sự khác biệt cơ bản /usr/locallà dành cho phần mềm không được quản lý bởi bộ đóng gói hệ thống, nhưng vẫn tuân theo các quy tắc triển khai unix tiêu chuẩn.

Đó là lý do tại sao bạn có /usr/local/bin, /usr/local/sbin /usr/local/includev.v ...

/optmặt khác là dành cho phần mềm không tuân theo điều này và được triển khai theo kiểu nguyên khối. Điều này thường bao gồm phần mềm thương mại và / hoặc đa nền tảng được đóng gói theo kiểu "Windows".


12
Tôi không đồng ý về quan điểm nguyên khối của bạn. Tiêu chuẩn FHS cho biết các gói được cài đặt trong thư mục con / opt phải có các tệp cụ thể của máy chủ được cài đặt bên ngoài / opt, tương ứng trong / etc / opt / gói cho các tệp cấu hình và / var / opt / gói cho nhật ký, bộ đệm và tương tự. / opt thực sự gần với các quy tắc triển khai unix hơn / usr / local, nó đặt mọi thứ trong một thư mục chỉ nên đọc nhưng không thể vì những lý do rõ ràng.
jlliagre

5
Chắc chắn, nếu tôi đang thực hiện một gói opt và muốn yêu cầu tuân thủ FHS. Nếu không, tiêu chuẩn là nhiều hơn những gì bạn gọi là "hướng dẫn". Chỉ vì NetBeans không sử dụng / etc / opt / netbeans sẽ không ngăn tôi đưa nó vào / opt cho toàn hệ thống hoặc $ HOME / .local / opt cho một người dùng.
JLA

1
@jla Tôi cho rằng bình luận cuối cùng của bạn được gửi cho tôi vì vậy vui lòng sử dụng @ xxx khi trả lời người khác rằng OP hoặc tác giả trả lời. Về / etc / opt, FHS không nói đó là một vị trí được đề xuất (như một hướng dẫn) mà là một vị trí bắt buộc. Bạn hoặc nhà phát triển Netbeans có thể tự do vi phạm tiêu chuẩn đó vì không có thẩm quyền để thực thi nó, nhưng đừng nói làm sai là cách tốt. Nó chỉ là một sự hiểu lầm đáng tiếc hoặc vi phạm có chủ ý.
jlliagre

8
@jlliagre Là quản trị viên hệ thống của tôi, FHS là một bộ hướng dẫn. Thư mục / opt là nơi thông thường được thiết lập tốt để đặt phần mềm nguyên khối / opt / <gói> hoặc / opt / <nhà cung cấp>. Khi tôi cài đặt gói muốn sử dụng <gói | nhà cung cấp> / tất cả / dữ liệu / bắt buộc / để / hỗ trợ, nó sẽ đi vào lựa chọn / ngay cả khi nhà cung cấp không tuân theo mọi chi tiết của FHS mới nhất. Tôi có thể gửi email hoặc báo cáo lỗi, nhưng tôi sẽ không đặt gói nguyên khối đó ở một nơi khác để cảm thấy tốt hơn về FHS trên hệ thống của mình.
JLA

1
@jlliagre Tôi đã cài đặt rất nhiều nội dung trong / opt và không có tệp nào được tạo trong / etc / opt. Nên?
erm3nda

18

Chúng thực sự rất giống nhau, và việc sử dụng cái này hay cái kia là vấn đề quan điểm hơn. Tạp chí Linux đã có cuộc thảo luận về điểm / điểm này về chủ đề chính xác này ở đây .


9
Trời ơi. Tôi không có ý kéo mình vào một "cuộc chiến thần thánh".
Bản vá lỗi

13

Đối với cá nhân tôi, đó là những gì Bill nói trong liên kết của @ philfr:

Trên một hệ thống phát triển, hoặc một hộp cát, có một thư mục / opt nơi bạn có thể chỉ cần ném mọi thứ và xem liệu chúng có hoạt động hay không. Tôi biết tôi sẽ không tự mình nỗ lực đóng gói mọi thứ để thử chúng. Nếu ứng dụng không hoạt động, bạn chỉ cần rm thư mục / opt / mytestapp và ứng dụng đó là lịch sử. Đóng gói có thể có ý nghĩa khi bạn đang triển khai một triển khai lớn (đôi khi tôi thực hiện các ứng dụng gói), nhưng rất nhiều lần, thật tuyệt khi ném công cụ vào / opt.

Thật không may, hầu hết make installcác tập lệnh đẩy các tập tin vào /usr/localthay vì chỉ tạo một liên kết tượng trưng ở đó: - /


2
Điều gì sẽ là điểm? Nếu bạn định tạo symlink bằng mọi giá, tại sao không đặt tập tin gốc ở vị trí đầu tiên?
Let_Me_Be

8
Chỉ cần nhận xét về các make installmục tiêu đẩy tập tin vào /usr/local; chức năng này có thể dễ dàng thay đổi bằng cách chuyển --prefix=tham số dòng lệnh cho ./configuretập lệnh hoặc nếu không có ./configuretập lệnh, bạn có thể truyền tham số cho makemục tiêu như vậy : make --prefix=/usr install.
Sean C.

3
Là / opt một thư mục tiêu chuẩn có trong $ PATH? Tôi biết / usr / địa phương là.
LawrenceC

5
@Let_Me_Be lợi ích sẽ là rất dễ dàng để giữ các phiên bản cũ hơn. Giả sử tôi có 2 phiên bản 'foo', nằm ở /opt/foo-1.1/opt/foo-1.2. Khi tôi nâng cấp, foosymlink theo /usr/local/binđiểm đến foo-1.2. Nếu vì lý do nào đó tôi cần quay lại, tôi chỉ cần thay thế liên kết tượng trưng bằng một liên kết trỏ đến foo-1.1. Nếu 1.2 ổn sau vài tuần, nhanh chóng rm -rf /opt/foo-1.1loại bỏ phiên bản cũ một cách nhanh chóng và sạch sẽ.
pepoluan

7
@ultrasawblade không, không phải vậy. và không bao giờ nên xét cho cùng, theo FHS, / opt phải được chia thành các thư mục con mang tên của gói. nhồi nhét mọi thứ vào PATH là một cách chắc chắn dẫn đến thảm họa. thay vào đó, các ứng dụng nên tự cài đặt theo / opt và liên kết các chương trình do người dùng gọi vào / usr / local / bin (hoặc sbin).
pepoluan

11

Đầu tiên, tôi không nghĩ có một câu trả lời nghiêm ngặt; quản trị viên khác nhau sẽ có ý kiến ​​khác nhau, theo nền tảng của họ. Trong lịch sử, /usr/localđã đến đầu tiên; đó là hội nghị ở Berkley, IIRC. Tại một thời điểm trong quá trình phát triển Hệ thống V, nếu tôi không nhầm (điều này đã xảy ra từ lâu và tôi đã không ghi chú), đã có một quyết định hoặc mong muốn có thể chỉ /usrđọc, có nghĩa là bạn không thể thêm phần mềm mới vào nó; đó có thể là lý do tại sao /opt được phát minh Khi điều đó xảy ra, có rất nhiều phần mềm hiện có đã viết lên /usrý tưởng đó không bao giờ thực sự bắt đầu.

Sở thích cá nhân của tôi là /opt, với một thư mục con riêng cho mỗi sản phẩm; điều này làm cho việc loại bỏ một sản phẩm là một trường hợp đơn giản rm -fr. Nhưng nếu tất cả phần mềm của bạn được cài đặt thông qua trình quản lý gói tốt, thì điều đó không thành vấn đề và nếu phần mềm bạn cài đặt không tuân thủ nghiêm ngặt các quy ước này và viết các cấu hình và như vậy ở đâu đó /usr, thì điều đó cũng không thành vấn đề vì những lý do ngược lại.


1
"" "Tất cả phần mềm của bạn được cài đặt thông qua trình quản lý gói tốt" "" không thể trừ khi bạn chỉ sử dụng phần mềm đã sử dụng.
Pacerier

1
@Pacerier điều đó là có thể, nó phụ thuộc vào việc bạn đang sử dụng bản phân phối nào. Dù phần mềm là gì, có lẽ nó nằm trong Kho lưu trữ người dùng Arch và nếu không, phần mềm PKGBUILD tương đối dễ viết.
StarlitGhost

9

Tôi có một chút khác biệt về vấn đề này.
Mặc dù mọi thứ trong câu trả lời của jlliagre đều đúng, nhưng ứng dụng thực tế đối với tôi, khi triển khai phần mềm trong một cụm, đi xuống các biến môi trường mặc định và sử dụng lại libs mặc định.

Nói một cách đơn giản - /usr/localvà tất cả các thư mục con của nó đều nằm trong các tệp env thích hợp như PATHMANPATH, và /usr/local/lib{,64}nằm trong ldconfig's ( /etc/ld.so.conf.d/).

/opt/OTOH không - cả hai đều có lợi khi yêu cầu nhiều phiên bản hoặc các gói xung đột cùng tồn tại trong hệ thống, nhưng yêu cầu một số loại quản lý môi trường (ví dụ: mô-đun môi trường hoặc bộ sưu tập phần mềm ) và bất lợi ở chỗ nó có khả năng "lãng phí "Không gian lưu trữ bằng cách sao chép các thư viện dùng chung, vì mỗi cài đặt trong /optcó thể hoàn toàn khép kín.

Đối với tính chất chung của /usr/localcông việc, giả định rằng ví dụ nhị phân được cài đặt trực tiếp vào /usr/local/bin(và trang man cho phù hợp /usr/local/share/man/...) chứ không phải /usr/local/app/{bin,share/man,...}v.v.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.