Apa manfaat dari cara Linux mengatur file program yang diinstal? [Tutup]

10

Di Windows, drive sistem C:memiliki direktori program_files, di mana setiap program memiliki direktori sendiri.

Di Linux, di bawah /usr/dan /usr/local/, ada /bin, /etc, /share, /src, dll.

Jadi di windows, semua file dari setiap program dikelompokkan dalam direktori yang sama, sedangkan di Linux, file dengan tipe yang sama dari semua program tersebut.

Saya merasa cara Windows mengatur program yang diinstal lebih logis daripada cara Linux, dan dengan demikian program yang diinstal lebih mudah dikelola secara manual.

Apa manfaat dari cara Linux mengatur file program yang diinstal? Terima kasih.

Saya memiliki pertanyaan ini ketika memiliki masalah tentang Bagaimana mengatur program yang terinstal di $ HOME untuk mencari shell ketika menjalankannya? , di mana saya mencoba untuk mengatur program saya di $HOMEjalan Windows, tetapi memiliki masalah menentukan jalur pencarian untuk program tersebut.

Tim
sumber
9
@RallallMulailah " tak terduga dan terpencar " Anda adalah penempatan rasional dan non-duplikasi DLL kami.
RonJohn
1
Ini berdasarkan historis - sebagian besar untuk dapat memiliki beberapa partisi disk yang terpasang sementara mampu bootstrap hanya memiliki hal-hal yang diperlukan. Situasi serupa adalah ketika BIOS PC hanya bisa melihat bagian pertama dari hardisk yang sangat besar sehingga partisi terpisah yang berisi semua yang diperlukan untuk boot ditempatkan di bagian pertama. Biasanya disebut "/ boot". Hari ini kebutuhan akan kotak pasir dan aplikasi yang tidak dipercaya telah menghasilkan pemikiran ulang ini - lihat misalnya Ubuntu buncis.
Thorbjørn Ravn Andersen
9
Biarkan saya menjadi yang pertama menunjukkan bahwa Windows saat ini tidak memasukkan semua file dari setiap program ke direktori smae. Selain "Program Files" dan "Program Files (x86)" ada juga direktori "Users \ <username> \ Appdata" dari "Local", "LocalLow" dan "Roaming". Windows juga tidak selalu menggunakan folder "Program Files" untuk program atau menggunakannya secara konsisten sepanjang sejarahnya. * nix jauh lebih konsisten dalam menangani file dari waktu ke waktu.
YPelajari
5
@ JAB, setuju, dan mengerti ini. Saya menunjukkan bahwa pernyataan OP, yaitu "Jadi di windows, semua file dari setiap program dikelompokkan dalam direktori yang sama" sama sekali tidak benar. Saya juga tidak memasukkan ke dalam diskusi registri Windows, yang juga dapat dilihat sebagai menyimpan konfigurasi dan data lain tentang program Windows dan bukan bagian dari direktori "Program Files".
YPelajari
2
Linux mengatur file program yang diinstal? Sejak kapan?
hobbs

Jawaban:

17

Di Linux, lokasi yang berbeda biasanya, jika dirawat dengan baik, mencerminkan beberapa logika. Misalnya.:

  • /bin berisi alat (program) paling dasar
  • /sbin berisi program admin paling dasar

Keduanya berisi perintah-perintah dasar yang digunakan oleh boot dan pemecahan masalah mendasar. Dan di sini Anda melihat perbedaan pertama. Beberapa program tidak dimaksudkan untuk digunakan oleh pengguna biasa.

Kemudian lihat /usr/bin. Di sini Anda harus menemukan pilihan perintah (program) yang lebih besar, biasanya lebih dari 1000 di antaranya. Mereka adalah alat standar, tetapi tidak sepenting yang ada di /bindan /sbin.

/usr/binberisi perintah, sementara file konfigurasi berada di tempat lain. Ini memisahkan entitas fungsional (program) dan konfigurasi mereka dan file lainnya, tetapi dalam hal fungsionalitas pengguna, ini berguna, karena memiliki perintah yang tidak dicampur dengan yang lain memungkinkan penggunaan sederhana dari PATHvariabel yang menunjuk ke executable. Ini juga memperkenalkan kejelasan. Apa pun yang harus dieksekusi.

Lihatlah saya PATH,

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

Tepatnya ada enam lokasi yang berisi perintah yang dapat saya panggil secara langsung (mis. Bukan dengan jalurnya, tetapi dengan nama yang dapat dieksekusi).

  • /home/tomas/bin adalah direktori pribadi saya di folder rumah saya untuk executable pribadi saya.
  • /usr/local/bin Saya akan jelaskan secara terpisah di bawah ini.
  • /usr/bin dijelaskan di atas.
  • /bin juga dijelaskan di atas.
  • /usr/local/gamesadalah kombinasi /usr/local(yang akan dijelaskan di bawah) dan game
  • /usr/gamesadalah game. Tidak dicampur dengan executable utilitas, mereka memiliki lokasi masing-masing.

Sekarang untuk /usr/local/bin. Yang ini agak licin, dan sudah dijelaskan di sini: Apa itu / usr / local / bin? . Untuk memahaminya, Anda perlu tahu bahwa folder tersebut /usrmungkin dibagikan oleh banyak mesin dan dipasang dari lokasi bersih. Perintah-perintah di sana tidak diperlukan pada saat bootup, seperti disebutkan sebelumnya, tidak seperti yang ada dalam /bin, sehingga lokasi dapat dipasang pada tahap selanjutnya dari proses bootup. Ini juga dapat dipasang dengan mode read-only. /usr/local/bin, di sisi lain, adalah untuk program yang diinstal secara lokal, dan perlu ditulis. Jadi, sementara banyak mesin jaringan mungkin berbagi /usrdirektori umum , masing-masing dari mereka akan memiliki /usr/localmount sendiri di dalam common /usr.

Akhirnya, lihat pada PATHpengguna root saya:

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

Ini berisi ini:

  • /usr/local/sbin, yang berisi perintah admin dari tipe tersebut /usr/local
  • /usr/local/bin, yang sama dengan yang biasa digunakan pengguna. Sekali lagi, tipe mereka dapat digambarkan sebagai /usr/local.
  • /usr/sbin adalah utilitas administrasi yang tidak penting.
  • /usr/bin adalah administrasi yang tidak esensial dan utilitas pengguna reguler.
  • /sbin adalah alat admin penting.
  • /bin adalah admin dan alat penting pengguna biasa.

sumber
Terima kasih. Saya sangat tertarik dengan bagaimana Anda mengatur program yang akan diinstal /home/tomasz/bin/, lihat unix.stackexchange.com/questions/431793/…
Tim
Pemahaman saya adalah bahwa sementara pemisahan /bindan /usr/binmemang untuk menghindari masalah dengan /usrdirektori yang dipasang jaringan , pemisahan /usrdan /usr/localuntuk membedakan antara file yang disediakan vendor ( /usr) dan file yang diinstal secara manual pada mesin itu sendiri ( /usr/local) dan tidak ada hubungannya dengan masalah pemasangan jaringan. Apakah ini akurat?
Keiji
4
@ Koiji, vendor-vs-local-management adalah penggunaan yang paling umum (dan konvensional) untuk perbedaan itu hari ini, tetapi jika Anda melihat instalasi UNIX tradisional, /usr-off-a-network (vs /usr/localbeing, well, local ) bukan tidak pernah terdengar dari.
Charles Duffy
ini semua adalah ide yang buruk di tahun 2018
amara
7

Saat ini saya pikir ini adalah warisan sejarah dari UNIX klasik.

Dalam versi UNIX pertama, program tidak begitu besar seperti saat ini. Program sering terdiri dari satu file yang dapat dieksekusi yang menggunakan pustaka sistem. Jadi, tidak ada yang memikirkan program yang akan terdiri dari beberapa perpustakaan sendiri. Perpustakaan utama adalah perpustakaan C dan setiap program tahu tentang lokasi itu.

Juga, lingkungan UNIX dianggap sebagai produk jadi (untuk menyiapkan dokumentasi). Oleh karena itu path-s ke semua alat diperbaiki.

Beberapa manfaat dari jalur tetap dalam HDD (Hard Disk Drive) hari hadir di saat ini. Jika FSH (File System Hierarchy) terpecah pada partisi disk terpisah dan meletakkan partisi dengan binari dan pustaka di dekat sektor utama HDD, maka waktu mulai program akan sedikit lebih cepat.

Yurij Goncharuk
sumber
6
Ada keuntungan menarik yang tetap bermanfaat saat ini. Menyimpan binari /usr/bin, file data statis /usr/sharedan file yang dapat dimodifikasi /varatau /usr/varberarti bahwa langkah-langkah keamanan dapat digunakan untuk menegakkan bahwa tidak ada di dalam shareatau varyang dapat dieksekusi (dengan menggunakan noexecflag untuk mount mereka); bahwa tidak ada yang di luar vardapat dimodifikasi (pada sistem yang menggunakan dm_verityatau tindakan serupa untuk menghasilkan media yang ditandatangani, hanya baca); dll.
Charles Duffy
3

Apa yang Anda lihat sebagai sistem mirip Unix modern tidak terlalu tradisional.

Biasanya, akan ada hirarki yang cukup minimal /dan /usrhanya dengan utilitas sistem, dan program kemudian diinstal secara terpisah ke dalam subdirektori /usr/local, dan kemudian dibuat tersedia dengan membuat tautan simbolik.

Pengaturan yang sangat khas untuk perangkat lunak GNU adalah untuk dikompilasi dan diinstal

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

Utilitas gudang GNU membuat tautan simbolis untuk membuat perangkat lunak tersedia di jalur standar, tanpa harus menambahkan direktori ke variabel PATH (seperti Windows, dan cruft cenderung menumpuk di sana).

Namun distribusi Linux modern mengirimkan semuanya sebagai paket yang sudah jadi, sehingga program telah menjadi bagian dari "sistem". Karena manajer paket menangani instalasi, tidak perlu tautan simbolis, dan memisahkan program tidak memiliki tujuan yang berguna (tetapi akan memperlambat startup program karena banyak direktori kecil harus dipindai).

Jika Anda ingin menginstal perangkat lunak ke direktori home Anda, saya sarankan Anda juga menggunakan GNU stow - ini akan memungkinkan Anda untuk menjaga program Anda terpisah, yang masuk akal jika Anda tidak menggunakan manajer paket.

Pengaturan tradisional saya untuk itu adalah satu direktori tempat ~/software/DIRsaya menginstal program, kemudian menggunakan stow inside DIRuntuk membuat ~/software/bin, ~/software/sharedll. Ini berarti saya hanya perlu menambahkan ~/software/binke variabel PATH untuk mendapatkan semua perangkat lunak yang saya instal.

Menggunakan:

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

untuk menginstal jika program mengikuti konvensi GNU.

Simon Richter
sumber
2

Anda tampaknya berbicara tentang gaya membagi file individu dengan tujuan ( /usr/binuntuk executable, /usr/libuntuk perpustakaan) daripada dengan paket aplikasi (C ++ compiler dalam satu dir, program editing gambar di yang lain). Sementara dalam sistem Unix banyak alasan untuk sejarah ini, ada juga kekuatan saat ini yang cenderung membuat sistem seperti Unix condong ke arah ini: manajer paket yang mengelola sebagian besar program pada suatu sistem.

Pada Windows, secara historis dan masih cukup banyak saat ini, aplikasi telah bertanggung jawab untuk menyediakan installer mereka sendiri dan, terutama, uninstaller, dan bahkan sekarang sering tidak mendaftarkan diri dengan daftar aplikasi pusat. Dalam situasi seperti ini, umumnya lebih baik bagi aplikasi untuk memiliki direktori "sendiri" untuk sebanyak mungkin file-nya. Ini membantu menghindari konflik dengan aplikasi lain, meskipun ini tidak selalu berhasil (terutama dalam kasus DLL ).

Sistem Unix, di sisi lain, sejak tahun 90-an umumnya masing-masing memiliki manajer paket tunggal yang diterima dan kelompok yang menyediakan sejumlah besar perangkat lunak yang biasa digunakan melalui manajer paket ini. (Manajer paket resmi untuk berbagai Unix termasuk yumdan aptuntuk sistem Linux, pkgsrcuntuk NetBSD, dan portsuntuk FreeBSD. Seringkali sistem Unix komersial juga berakhir dengan manajer paket tidak resmi tetapi juga diterima secara luas, seperti brewuntuk MacOS.)

Manajer paket ini memiliki keunggulan yang mereka dapat dan lakukan melacak setiap file pada sistem di berbagai subdirektori yang mereka "miliki." Karena satu grup menetapkan nama dan lokasi setiap file di sini, mereka semua dapat menggunakan sekumpulan direktori kecil yang dibagikan di antara mereka. Ini menawarkan berbagai keuntungan, terutama di bidang berbagi file antara aplikasi dan menjaga jumlah jalur yang Anda perlukan untuk mencari perpustakaan dan file yang dapat dieksekusi.

Yang mengatakan, ada tradisi panjang instalasi "direktori terpisah per aplikasi" di Unix juga, biasanya di bawah /optdirektori.

cjs
sumber