Thêm vào đường dẫn so với liên kết từ / bin


24

Quản trị viên hệ thống của chúng tôi đã cài đặt một ứng dụng phần mềm (Maven) trên máy chủ và bảo mọi người thêm /usr/local/maven/bin/thư mục vào đường dẫn của họ.

Tôi nghĩ có thể thuận tiện hơn khi chỉ liên kết một vài chương trình trong thư mục đó từ /binthư mục (hoặc thư mục khác mà mọi người có trong đường dẫn của họ) như thế này:

ln -s /usr/local/maven/bin/* /bin

Điều này có đúng không? Có một số tác dụng phụ ẩn cho đề nghị của tôi?


2
Mỗi LSB bạn nên thêm các gói bên ngoài theo /opt.
vonbrand

Câu trả lời:


31

Về liên kết

Bạn thường không liên kết /usr/local/*với /bin, nhưng đây là một thực tế lịch sử. Nói chung, có một vài lý do "kỹ thuật" tại sao bạn không thể làm những gì bạn đề xuất.

Tạo liên kết đến các tệp thực thi /bincó thể gây ra sự cố:

  1. Có lẽ sự cảnh báo lớn nhất sẽ là nếu hệ thống của bạn có các gói được quản lý bởi một số loại quản lý gói như RPM, dpkg, APT, YUM, pacman, pkg_add, v.v. Trong những trường hợp này, bạn thường muốn để gói quản lý làm công việc của mình và quản lý thư mục như /sbin, /bin, /lib, và /usr. Một ngoại lệ /usr/localthường là nơi an toàn để làm khi bạn thấy phù hợp trên hộp, mà không phải lo lắng về trình quản lý gói can thiệp vào các tệp của bạn.

  2. Thông thường các lần thực thi được xây dựng cho /usr/localsẽ có mã PATH này được mã hóa cứng vào các tệp thực thi của chúng. Cũng có thể có các tệp cấu hình được bao gồm trong /usr/localquá trình cài đặt các ứng dụng này. Vì vậy, liên kết đến chỉ có thể thực thi có thể gây ra sự cố với các ứng dụng này khi tìm các .cfgtệp sau này. Đây là một ví dụ về trường hợp như vậy:

    $ strings /usr/local/bin/wit | grep '/usr/local'
    /usr/local/share/wit
    /usr/local/share/wit/
    
  3. Vấn đề tương tự áp dụng cho việc tìm kiếm .cfgtệp cũng có thể xảy ra với các tệp thực thi "người trợ giúp" mà ứng dụng chính cần chạy. Những điều này cũng sẽ cần phải được liên kết vào /usr/bin, biết rằng điều này có thể có vấn đề và chỉ hiển thị khi bạn thực sự cố gắng thực thi ứng dụng được liên kết.

LƯU Ý: nói chung, tốt nhất là tránh sự cám dỗ để liên kết với một ứng dụng tắt /usr/bin.

/etc/profile.d

Thay vào đó, sau đó tất cả người dùng cung cấp quản lý này, quản trị viên có thể dễ dàng thêm phần này $PATHvào hộp của mọi người bằng cách thêm một tệp tương ứng trong /etc/profile.dthư mục.

Một tệp như thế này , /etc/profile.d/maven.sh:

PATH=$PATH:/usr/local/maven/bin

Bạn thường làm điều này với tư cách quản trị viên thay vì làm ô nhiễm tất cả các thiết lập của người dùng với điều này.

Sử dụng thay thế

Hầu hết các bản phân phối hiện cung cấp một công cụ khác gọi là alternatives(Fedora / CentOS) hoặc update-alternatives(Debian / Ubuntu) mà bạn cũng có thể sử dụng để lặp vào các $PATHcông cụ có thể nằm ngoài /bin. Sử dụng các công cụ như thế này là tốt hơn vì chúng tuân thủ nhiều hơn những gì hầu hết các quản trị viên sẽ coi là "thực hành tiêu chuẩn" và do đó làm cho các hệ thống dễ dàng chuyển từ quản trị viên này sang quản trị viên khác.

Công cụ này thực hiện một điều tương tự trong việc tạo liên kết trong /bin; nhưng nó quản lý việc tạo và hủy các liên kết này, do đó dễ hiểu hơn về thiết lập dự định của hệ thống khi được thực hiện thông qua một công cụ so với thực hiện trực tiếp như bạn đề xuất.

Ở đây tôi đang sử dụng hệ thống đó để quản lý Java của Oracle trên một hộp:

$ ls -l /etc/alternatives/ | grep " java"
lrwxrwxrwx. 1 root root 73 Feb  5 13:15 java -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/jre/bin/java
lrwxrwxrwx. 1 root root 77 Feb  5 13:15 java.1.gz -> /usr/share/man/man1/java-java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64.1.gz
lrwxrwxrwx. 1 root root 70 Feb  5 13:19 javac -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/bin/javac
lrwxrwxrwx. 1 root root 78 Feb  5 13:19 javac.1.gz -> /usr/share/man/man1/javac-java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64.1.gz
lrwxrwxrwx. 1 root root 72 Feb  5 13:19 javadoc -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/bin/javadoc
lrwxrwxrwx. 1 root root 80 Feb  5 13:19 javadoc.1.gz -> /usr/share/man/man1/javadoc-java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64.1.gz

Bạn có thể thấy tác dụng của việc này:

$ type java
java is /usr/bin/java

$ readlink -f /usr/bin/java
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/jre/bin/java

0,02 đô la của tôi

/binMặc dù việc tạo liên kết trong , mặc dù hợp lý, có thể sẽ bị nản lòng bởi hầu hết các sysadmin:

  1. Sẽ nhăn mặt vì nó được xem là tùy chỉnh và có thể dẫn đến nhầm lẫn nếu một quản trị viên khác được yêu cầu nhận hộp
  2. Có thể dẫn đến một hệ thống bị phá vỡ ở trạng thái trong tương lai do kết quả của tùy chỉnh "mong manh" này.

@slm Bạn có thể muốn sửa đổi đoạn đầu tiên của mình. Có một số lý do kỹ thuật không sử dụng symlink.
jlliagre

@jlliagre - khi nhìn vào A của bạn, tôi không tin rằng các quản trị viên không sở hữu /binthư mục. Đây là một ví dụ. Trên các bản phân phối Red Hat sử dụng RPM nếu một tệp đã tồn tại trong /binRPM sẽ không cài đặt trên đầu trang như bạn đã mô tả, trừ khi được sử dụng công --replacefilestắc này. Vì vậy, đó không thực sự là một lý do kỹ thuật. Tương tự với các thư mục khác. Tôi hiểu những gì bạn nói về việc "sở hữu" hệ điều hành /binnhưng nó không hoàn toàn như bạn nói.
slm

@jlliagre - cũng trong A của tôi, tôi không khuyến khích ai tạo liên kết, chỉ nói rõ họ có thể nếu họ chọn làm như vậy. Tôi ghét các hệ thống nơi mọi thứ được thực hiện như vậy và thường nguyền rủa quản trị viên đã làm như vậy 8-).
slm

@slm Họ có thể (vì họ có đủ đặc quyền) nhưng điều đó không ngụ ý điều này sẽ hoạt động. Điểm # 2 và # 3 trong câu trả lời của tôi vẫn là lý do kỹ thuật hợp lệ không phải để tạo liên kết mà là sử dụng đúng PATH, đặc biệt là trong trường hợp OP. Tôi sẽ khuyến khích bạn đề cập đến chúng trong câu trả lời của bạn.
jlliagre

@jlliagre - thêm chi tiết theo phản hồi của bạn.
slm

7

Trả lời các câu hỏi được hỏi:

Điều này có đúng không?

Không , đó là một thực hành kém.

Có một số tác dụng phụ ẩn cho đề nghị của tôi?

một số tác dụng phụ. Đề xuất của bạn có thể hoạt động hoặc không tùy thuộc vào ứng dụng và có thể thoái lui hoặc bị phá vỡ trong thời gian dài.

Có những lý do hợp lý để không tạo ra một liên kết tượng trưng như vậy:

  • Quản trị viên không "sở hữu" /bin(xem chú thích 1) vì thư mục này thuộc về nhà phát triển hệ điều hành / phân phối. Mặt khác, /usr/localmột vị trí truyền thống cho phần mềm được xây dựng bởi quản trị viên cục bộ, là một vị trí cho phần mềm chưa được xử lý /opt/<packagename>. Nếu bạn tạo một tệp hoặc một liên kết /bin, có nguy cơ bị ghi đè bởi cài đặt gói, trong trường hợp của bạn là mavengói giả định do HĐH cung cấp, có thể dẫn đến hồi quy nếu một tệp được tạo cục bộ được tạo từ mới hơn mã nguồn mà phiên bản HĐH. Ví dụ, các tarball SVR4 pkgadd, debian dpkg, red-hat rpmvà slackware sẽ ghi đè lên liên kết tượng trưng của bạn.

  • Một số ứng dụng tìm đến nơi chúng được gọi để truy xuất tệp cấu hình, plugin và tài nguyên tương tự. Nếu bạn gọi ứng dụng bằng một liên kết tượng trưng, ​​mã của nó có thể không theo được nó và sau đó tìm các tệp tài nguyên này xung quanh /usr/binnơi chúng không có.

  • Có thể có các tệp nhị phân khác trong /usr/local/maven/binvà không thêm thư mục này vào PATH của bạn sẽ khiến chúng không khả dụng. Đã xóa vì bạn đã tính đến điều đó bằng lệnh của mình bằng cách liên kết tất cả các lệnh tiềm năng.

  • Các trang maven2 nói thêm thư mục này để PATH của bạn (chính xác: Thêm biến môi trường M2 đến đường dẫn của bạn, ví dụ như export PATH = $ M2: $ PATH .), Bằng cách sử dụng một cách tiếp cận khác nhau, bạn có vi phạm bước đó nên đang đi một không được hỗ trợ đường. Tất nhiên, nếu hầu hết người dùng của một hệ thống là mavenngười dùng tiềm năng , sẽ có ý nghĩa hơn khi đặt PATHtoàn cầu thay vì trên mỗi hệ thống .profile.

Lưu ý 1:

Tài liệu về Slackware:

   The /bin directory usually doesn't receive modification
   after installation. If it does, it's usually in the form
   of package upgrades that we provide.

Chuẩn phân cấp Debian / Filesystem

/bin/
   Essential command executable (binaries) for all users (e.g., cat, ls, cp) 
   (especially files required to boot or rescue the system)
...
/opt/
   Add-on application software packages 
   Pre-compiled, non ".deb" binary distribution (tar'ed..) goes here.
/opt/bin/
   Same as for top-level hierarchy

Tài liệu của Solaris:

/usr/bin
   Platform-dependent, user-invoked executables. These  are
   commands  users expect to be run as part of their normal
   $PATH. For executables that are different  on  a  64-bit
   system  than  on a 32-bit system, a wrapper that selects
   the  appropriate  executable   is   placed   here.   See
   isaexec(3C).  An approved installation location for bun-
   dled Solaris software. The analogous location for add-on
   system     software     or     for    applications    is
   /opt/packagename/bin.

Thử nghiệm đơn giản cho thấy Debian dpkgkhông bảo tồn một liên kết hiện có, ngay cả khi --force-overwritetùy chọn không được sử dụng:

# ls -l /usr/bin/banner
lrwxrwxrwx 1 root root 11 Feb 25 21:37 /usr/bin/banner -> /tmp/banner
# dpkg -i sysvbanner_1.0.15_amd64.deb 
Selecting previously unselected package sysvbanner.
(Reading database ... 236250 files and directories currently installed.)
Unpacking sysvbanner (from sysvbanner_1.0.15_amd64.deb) ...
Setting up sysvbanner (1.0.15) ...
Processing triggers for man-db ...
# ls -l /usr/bin/banner
-rwxr-xr-x 1 root root 11352 May  7  2009 /usr/bin/banner

Quan trọng thực sự. Thật đáng tiếc khi bạn chấp nhận một câu trả lời nói rằng đó chỉ là một thực tế lịch sử không có lý do kỹ thuật để tránh ...
jlliagre

1
Bạn đúng, nhưng, tôi đã chấp nhận câu trả lời đó vì nó đã cho tôi một giải pháp thực tế mà tôi đã sử dụng, đó là nói với quản trị viên hệ thống để đặt lệnh sửa đổi PATH trong /etc/profile.d.
Erel Segal-Halevi

Tôi đồng ý anh ấy đã đưa ra một giải pháp thực tế và đúng đắn nhưng không phải là hai câu hỏi mà bạn đã hỏi ("Điều này có đúng không? Có tác dụng phụ không?").
jlliagre

1
jlliagre là hoàn toàn đúng. Thực tế này không phải là lịch sử ở tất cả. Nó là một thực hành tốt nhất gần đây. Ngược lại, các Unix cũ, mọi người đều cài đặt phần mềm của mình trực tiếp trong /binhoặc /usr/bin. Khi phát hiện ra các vấn đề của các nhị phân hệ thống bị ẩn hoặc bị xáo trộn (nổi tiếng nhất là test), cách tốt nhất để cài đặt các nhị phân không hệ thống ở một nơi khác được áp dụng dần dần.
dan

3

Nếu bạn muốn liên kết tượng trưng, ​​tốt hơn là nên liên kết đến /usr/local/bin. Trên máy chủ của tôi, tôi thường cài đặt phần mềm cục bộ vào /opt/NAMEvà liên kết các nhị phân đến /usr/local/bin.


0

Một phương pháp thay thế cho hai phương thức được đề xuất là tạo một tập lệnh shell trong /usr/local/binđó, khi được thực thi, sẽ thực thi bất kỳ nhị phân nào bạn chỉ định trong tập lệnh. Ví dụ, sử dụng maven làm ví dụ, tôi sẽ tạo một tập lệnh shell /usr/local/binđược gọi mavencó tập lệnh nhỏ bên trong để thực thi nhị phân maven nơi nó được đặt và chuyển bất kỳ đối số nào cho nó:

#!/bin/sh
exec /usr/local/maven/bin/maven "$@"

Điều này có nhược điểm là phải làm điều này cho mọi nhị phân bạn muốn "liên kết", nhưng nó cho phép bạn gọi các nhị phân đó từ dòng lệnh mà không cần phải làm hỏng $PATHbiến môi trường của bạn .

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.