Lợi ích của cách Linux tổ chức các tệp của các chương trình đã cài đặt là gì? [đóng cửa]


10

Trong Windows, ổ đĩa hệ thống C:có một thư mục program_files, theo đó mỗi chương trình có thư mục riêng.

Trong Linux, dưới /usr//usr/local/, có /bin, /etc, /share, /src, v.v.

Vì vậy, trong các cửa sổ, tất cả các tệp của mỗi chương trình được nhóm trong cùng một thư mục, trong khi ở Linux, các tệp cùng loại từ tất cả các chương trình.

Tôi cảm thấy cách Windows tổ chức các chương trình đã cài đặt hợp lý hơn so với cách của Linux và do đó, các chương trình được cài đặt dễ quản lý thủ công hơn.

Lợi ích của cách Linux tổ chức các tệp của các chương trình đã cài đặt là gì? Cảm ơn.

Tôi có câu hỏi này khi gặp vấn đề Làm thế nào để tổ chức các chương trình đã cài đặt trong $ HOME cho shell để tìm kiếm chúng khi chạy chúng? , nơi tôi cố gắng tổ chức các chương trình của mình $HOMEtheo cách của Windows, nhưng có một số vấn đề về việc chỉ định đường dẫn tìm kiếm cho các chương trình.


9
@Randall Bắt đầu " không thể đoán trước và phân tán " của bạn là vị trí hợp lý của chúng tôi và không trùng lặp các DLL.
RonJohn

1
Điều này dựa trên lịch sử - chủ yếu là để có thể có một số phân vùng đĩa được gắn kết trong khi có thể bootstrap chỉ có các yếu tố cần thiết. Một tình huống tương tự là khi các PC của PC chỉ có thể nhìn thấy phần đầu tiên của các ổ cứng rất lớn nên một phân vùng riêng chứa mọi thứ cần thiết để khởi động được đặt trong phần đầu tiên đó. Thường được gọi là "/ boot". Ngày nay, nhu cầu về hộp cát và các ứng dụng không đáng tin cậy đã dẫn đến việc này được xem xét lại - xem ví dụ như các bản tóm tắt của Ubuntu.
Thorbjørn Ravn Andersen

9
Hãy để tôi là người đầu tiên chỉ ra rằng Windows hiện không đưa tất cả các tệp của mỗi chương trình vào thư mục smae. Ngoài "Tệp chương trình" và "Tệp chương trình (x86)" còn có các thư mục "Người dùng \ <tên người dùng> \ Appdata" của "Địa phương", "LocalLow" và "Chuyển vùng" trong số những người khác. Windows cũng không luôn sử dụng thư mục "Tệp chương trình" cho các chương trình hoặc sử dụng nhất quán trong suốt lịch sử của nó. * nix phù hợp hơn nhiều trong việc xử lý tệp theo thời gian.
YLearn 17/03/18

5
@JAB, đồng ý, và hiểu điều này. Tôi đã chỉ ra rằng tuyên bố của OP, cụ thể là "Vì vậy, trong các cửa sổ, tất cả các tệp của mỗi chương trình được nhóm trong cùng một thư mục" đơn giản là không đúng. Tôi cũng không tham gia vào cuộc thảo luận về sổ đăng ký Windows, cũng có thể được xem là lưu trữ cấu hình và dữ liệu khác về các chương trình Windows và không phải là một phần của thư mục "Tệp chương trình".
YLearn 17/03/18

2
Linux tổ chức các tập tin của chương trình cài đặt? Kể từ khi?
hobbs 18/03/18

Câu trả lời:


17

Trong Linux, các vị trí khác nhau thường, khi được duy trì tốt, phản ánh một số logic. Ví dụ.:

  • /bin chứa các công cụ cơ bản nhất (chương trình)
  • /sbin chứa các chương trình quản trị cơ bản nhất

Cả hai đều chứa các lệnh cơ bản được sử dụng bằng cách khởi động và xử lý sự cố cơ bản. Và ở đây bạn thấy sự khác biệt đầu tiên. Một số chương trình không dành cho người dùng thông thường.

Sau đó hãy xem trong /usr/bin. Ở đây bạn nên tìm thấy một sự lựa chọn lớn hơn của các lệnh (chương trình), thường là hơn 1000 trong số chúng. Chúng là các công cụ tiêu chuẩn, nhưng không cần thiết như những công cụ trong /bin/sbin.

/usr/binchứa các lệnh, trong khi các tệp cấu hình nằm ở nơi khác. Điều này cả hai phân tách các thực thể chức năng (chương trình) và cấu hình của chúng và các tệp khác, nhưng về chức năng người dùng, điều này rất tiện lợi, vì các lệnh không được trộn lẫn với bất kỳ thứ gì khác cho phép sử dụng đơn giản PATHbiến chỉ vào các tệp thực thi. Nó cũng giới thiệu sự rõ ràng. Bất cứ điều gì là nên được thực thi.

Hãy nhìn vào tôi PATH,

$ echo "$PATH" | perl -F: -anlE'$,="\n"; say @F'
/home/tomas/bin
/usr/local/bin
/usr/bin
/bin
/usr/local/games
/usr/games

Có chính xác sáu vị trí chứa các lệnh tôi có thể gọi trực tiếp (nghĩa là không phải bằng đường dẫn của chúng, mà bằng tên thực thi của chúng).

  • /home/tomas/bin là thư mục riêng của tôi trong thư mục nhà của tôi để thực thi riêng tư của tôi.
  • /usr/local/bin Tôi sẽ giải thích riêng bên dưới.
  • /usr/bin được mô tả ở trên.
  • /bin cũng được mô tả ở trên.
  • /usr/local/gameslà sự kết hợp của /usr/local(sẽ được giải thích bên dưới) và các trò chơi
  • /usr/gameslà những trò chơi. Không được trộn lẫn với các tệp thực thi tiện ích, chúng có các vị trí riêng biệt.

Bây giờ đến /usr/local/bin. Cái này hơi trơn, và đã được giải thích ở đây: / usr / local / bin là gì? . Để hiểu nó, bạn cần biết rằng thư mục /usrcó thể được chia sẻ bởi nhiều máy và được gắn từ một vị trí mạng. Các lệnh không cần thiết khi khởi động, như đã lưu ý trước đó, không giống như các lệnh trong /bin, vì vậy vị trí có thể được gắn trong các giai đoạn sau của quá trình khởi động. Nó cũng có thể được gắn theo kiểu chỉ đọc. /usr/local/binmặt khác, dành cho các chương trình được cài đặt cục bộ và cần có thể ghi được. Vì vậy, trong khi nhiều máy mạng có thể chia sẻ /usrthư mục chung , thì mỗi máy trong số chúng sẽ /usr/localđược gắn riêng bên trong chung /usr.

Cuối cùng, hãy xem PATHngười dùng root của tôi:

# echo "$PATH" | perl -F: -anlE'$,="\n"; say @F'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin

Nó chứa những thứ này:

  • /usr/local/sbin, có chứa các lệnh quản trị viên của loại /usr/local
  • /usr/local/bin, đó là những cái tương tự mà người dùng thông thường có thể sử dụng. Một lần nữa, loại của họ có thể được mô tả là /usr/local.
  • /usr/sbin là các tiện ích quản trị không cần thiết.
  • /usr/bin là quản trị không cần thiết và tiện ích người dùng thường xuyên.
  • /sbin là những công cụ quản trị cần thiết.
  • /bin là quản trị viên và các công cụ thiết yếu người dùng thường xuyên.

Cảm ơn. Tôi rất quan tâm đến cách bạn tổ chức các chương trình sẽ được cài đặt /home/tomasz/bin/, xem unix.stackexchange.com/questions/431793/ chủ
Tim

Tôi hiểu rằng trong khi phân tách /bin/usr/binthực sự là để tránh các vấn đề với các /usrthư mục được gắn trên mạng , thì việc tách /usr/usr/localđể phân biệt giữa các tệp do nhà cung cấp ( /usr) và các tệp được cài đặt thủ công trên chính máy ( /usr/local) và không liên quan gì các vấn đề gắn mạng. Nó thật sự đúng?
Keiji

4
@Keiji, nhà cung cấp so với quản lý cục bộ là cách sử dụng phổ biến nhất (và thông thường) cho sự khác biệt đó ngày nay, nhưng nếu bạn nhìn vào các bản cài đặt UNIX truyền thống, thì /usr-off-a-network (so với /usr/local, tốt, cục bộ ) không phải là chưa từng thấy của.
Charles Duffy

đây là một ý tưởng tồi trong năm 2018
amara

7

Ngày nay tôi nghĩ rằng đây là sự kế thừa lịch sử từ UNIX cổ điển.

Trong các phiên bản UNIX đầu tiên, các chương trình không quá lớn như ngày nay. Các chương trình thường bao gồm từ một tệp thực thi sử dụng các thư viện hệ thống. Vì vậy, không ai nghĩ về các chương trình sẽ bao gồm một vài thư viện riêng. Thư viện chính là thư viện C và mọi chương trình đều biết về vị trí của nó.

Ngoài ra, môi trường UNIX được coi là thành phẩm (để chuẩn bị tài liệu). Do đó, đường dẫn đến tất cả các công cụ đã được sửa.

Ngày nay, một số lợi ích từ các đường dẫn cố định trong ổ cứng (Ổ đĩa cứng) hiện nay. Nếu FSH (Phân cấp hệ thống tệp) phân tách trên các phân vùng đĩa riêng biệt và đặt các phân vùng có nhị phân và thư viện gần các khu vực chính của ổ cứng, thì thời gian bắt đầu chương trình sẽ nhanh hơn một chút.


6
Có những lợi thế hấp dẫn vẫn còn hữu ích cho đến ngày nay. Giữ các tệp nhị phân trong /usr/bin, các tệp dữ liệu tĩnh trong /usr/sharevà các tệp có thể được sửa đổi /varhoặc /usr/varcó nghĩa là các biện pháp bảo mật có thể được sử dụng để thực thi rằng không có gì trong sharehoặc varcó thể thực thi được (bằng cách sử dụng noexeccờ cho gắn kết của chúng); rằng không có gì bên ngoài varcó thể được sửa đổi (trên một hệ thống sử dụng dm_verityhoặc các biện pháp tương tự để tạo ra ký, read-only truyền thông); v.v.
Charles Duffy

3

Những gì bạn thấy là một hệ thống giống như Unix hiện đại không thực sự truyền thống.

Thông thường, sẽ có khá tối thiểu //usrphân cấp chỉ với các tiện ích hệ thống và các chương trình sau đó được cài đặt riêng vào thư mục con /usr/localvà sau đó được cung cấp bằng cách tạo các liên kết tượng trưng.

Một thiết lập rất điển hình cho phần mềm GNU là biên dịch và cài đặt với

./configure
make
make install prefix=/usr/local/DIR/program-1
cd /usr/local/DIR
stow program-1

Tiện ích xếp hàng GNU tạo các liên kết tượng trưng để làm cho phần mềm có sẵn trên đường dẫn tiêu chuẩn, mà không phải thêm bất kỳ thư mục nào vào biến PATH (như Windows, và cruft có xu hướng tích lũy ở đó).

Tuy nhiên, các bản phân phối Linux hiện đại vận chuyển mọi thứ dưới dạng các gói làm sẵn, vì vậy các chương trình đã trở thành một phần của "hệ thống". Bởi vì trình quản lý gói chăm sóc cài đặt, không cần liên kết tượng trưng và các chương trình riêng biệt không phục vụ mục đích hữu ích (nhưng sẽ làm chậm quá trình khởi động chương trình vì nhiều thư mục nhỏ sẽ phải được quét).

Nếu bạn muốn cài đặt phần mềm vào thư mục chính của mình, tôi khuyên bạn cũng nên sử dụng GNU stow - điều này sẽ cho phép bạn tách các chương trình của mình, điều này hợp lý nếu bạn không sử dụng trình quản lý gói.

Thiết lập truyền thống của tôi cho đó là một thư mục ~/software/DIRmà tôi cài đặt các chương trình, sau đó sử dụng stow bên trong DIRđể tạo ~/software/bin, ~/software/sharev.v. Điều này có nghĩa là tôi chỉ phải thêm ~/software/binvào biến PATH để có được tất cả phần mềm đã cài đặt.

Sử dụng:

./configure --prefix=~/software
make
make install prefix=~/software/DIR/program-1
cd ~/software/DIR
stow program-1

để cài đặt nếu chương trình tuân theo các quy ước GNU.


2

Dường như bạn đang nói về phong cách phân chia các tệp riêng lẻ theo mục đích ( /usr/bincho tệp thực thi, /usr/libcho thư viện) chứ không phải theo gói ứng dụng (trình biên dịch C ++ trong một thư mục, chương trình chỉnh sửa ảnh trong một thư mục khác). Mặc dù trong các hệ thống Unix phần lớn lý do cho lịch sử này, cũng có những lực lượng thời nay có xu hướng làm cho các hệ thống giống Unix nghiêng về phía này: các trình quản lý gói quản lý hầu hết các chương trình trên một hệ thống.

Trên Windows, trong lịch sử và vẫn còn khá nhiều hiện nay, các ứng dụng chịu trách nhiệm cung cấp trình cài đặt của riêng chúng và đặc biệt là trình gỡ cài đặt và thậm chí bây giờ thường không đăng ký với bất kỳ danh sách ứng dụng trung tâm nào. Trong tình huống như thế này, thông thường tốt hơn là một ứng dụng có thư mục "riêng" của mình cho càng nhiều tệp càng tốt. Điều này giúp tránh xung đột với các ứng dụng khác, mặc dù điều này không phải lúc nào cũng hoạt động (đặc biệt là trong trường hợp DLL ).

Mặt khác, các hệ thống Unix kể từ thập niên 90 thường có một trình quản lý gói được chấp nhận duy nhất và một nhóm cung cấp một lượng lớn phần mềm thường được sử dụng thông qua trình quản lý gói này. (Cán bộ quản lý gói chính thức cho unices khác nhau bao gồm yumaptcho các hệ thống Linux, pkgsrccho NetBSD, và portscho FreeBSD. Hệ thống Unix Thường thương mại cũng kết thúc với một người quản lý gói không chính thức nhưng được chấp nhận rộng rãi là tốt, chẳng hạn như brewđối với hệ điều hành MacOS.)

Các trình quản lý gói này có lợi thế là họ có thể và theo dõi mọi tệp trên hệ thống trong các thư mục con khác nhau mà chúng "sở hữu". Vì một nhóm duy nhất đang gán tên và vị trí của mỗi tệp ở đây, tất cả chúng có thể sử dụng một nhóm nhỏ các thư mục được chia sẻ giữa chúng. Điều này mang lại nhiều lợi ích khác nhau, đặc biệt là trong các lĩnh vực chia sẻ tệp giữa các ứng dụng và giữ số lượng đường dẫn bạn cần để tìm kiếm thư viện và tệp thực thi.

Điều đó nói rằng, có một truyền thống lâu dài về cài đặt "thư mục riêng cho mỗi ứng dụng" trong Unix, thường là trong /optthư mục.

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.