Apa alasan untuk direktori `/ usr`?

107

Apa alasan untuk "sumber daya sistem unix", atau /usrdirektori, seperti yang dijelaskan di sini , yang menduplikasi banyak nama direktori di bawah direktori root /?

Tujuan saya: Saya menginstal Oracle JDK untuk yang kesekian kalinya dan memutuskan kali ini untuk meletakkannya di bawah /home/userdan saya hanya membaca sedikit untuk melihat apakah itu ide yang buruk pada mesin pengguna tunggal.

H2ONaCl
sumber
1
Direktori rumah Anda adalah tempat yang sempurna untuk menginstal perangkat lunak pihak ketiga sebagai non-root.
Lekensteyn
9
... realisasi menyedihkan karena Anda pikir /usrberarti direktori "pengguna" tersembunyi selama bertahun-tahun ...
Govind Rai
6
Saya serius berpikir itu adalah "pengguna" selama ini. Seperti binari pengguna
Tanner Babcock

Jawaban:

168

Ada versi pendek dan versi panjang dari jawaban Anda ...

Versi pendek:

Sebagai link Anda sudah mengatakan, /usradalah tempat untuk seluruh sistem , read-only file. Jadi semua perangkat lunak yang Anda instal ada di sana. Itu tidak menduplikasi nama /kecuali /bindan /lib, tetapi, pada awalnya, dengan tujuan yang berbeda: /bin, /libhanya untuk binari dan pustaka yang diperlukan untuk boot , sedangkan /usr/bin, /usr/libuntuk semua executable dan pustaka lainnya. (sekarang jadilah anak yang baik dan jangan bertanya /sbin, ini adalah Versi Singkatnya)

Saat ini, perbedaan antara "diperlukan untuk booting" dan tidak telah berkurang, karena sebagian besar distro modern, termasuk Ubuntu, tidak dapat boot dengan benar tanpa beberapa file dari /usr. Dan itu sebabnya ada gerakan kuat menuju penggabungan /usr/bindan /bin, jadi mungkin dalam waktu dekat (Ubuntu 12.10 mungkin?) /binAkan menjadi symlink ke /usr/bin.

Tapi mungkin Anda bingung /usrdan /usr/local? Karena ya, ada (dan seharusnya) banyak nama direktori yang digandakan. Lebih lanjut tentang itu nanti ...

Versi panjang:

Kembali di tahun 70-an, di Unix (ya, Unix, jauh sebelum Linux), disket memiliki sedikit ruang (tidak ada HD, ingat?), Dan pada titik tertentu sistem biner tumbuh terlalu banyak dalam jumlah dan ukuran ke titik mereka tidak akan pas dengan satu disk, dan pengembang harus membaginya di beberapa media dan dengan demikian membuat titik pemasangan baru untuk mereka. /binfilesystem penuh, sehingga mereka menginstal binari baru di ... /usr/bin. Dan /usr, pada waktu itu, ... direktori pengguna mereka !

Setelah perpecahan (yang hampir memalukan dan sering diceritakan sebagai lelucon), mereka mulai menciptakan pembenaran (dan kriteria) "artifisial" untuk memutuskan apa yang akan pergi /bindan apa yang akan pergi /usr/bin. Aturan informal adalah: "hal-hal penting" pergi ke /bin, "sisanya" pergi ke /usr/bin. Sama dengan /lib. Tidak lama kemudian /usrmenjadi penuh dengan dir yang berhubungan dengan sistem, dicampur dengan dir-pengguna. Maka /homelahirlah, untuk menjaga semua dir yang terkait dengan pengguna dan tetap /usrbersih untuk "barang" sistem saja.

Ini jauh sebelum FHS ada. Ketika itu dibuat, ia memeluk (dan memformalkan) tradisi saat ini dan mempertahankan nama /usr, meskipun pada saat itu sudah tidak ada hubungannya dengan "pengguna" lagi. Jadi ya, nama-nama mewah " U NIX s ource r epository" atau " U NIX s ystem r esources" adalah semua nama yang dibuat-buat, dan sudah terlambat untuk mengganti nama pula. (tapi belum terlambat untuk bergabung /bin)

"Oke, bagaimana dengan /usr/sbin?" , Anda bertanya. Sial, aku berharap kamu sudah lupa. Ok ... /usr/sbinuntuk perintah yang hanya bisa (atau hanya bermakna ketika) dieksekusi oleh rootpengguna, seperti mountdan fdisk.

"Tapi bukankah itu hampir sama dengan /bin?" . Ya tentu, tapi ...

"Tunggu, lalu mengapa ada /sbinjuga? Tidak masuk akal!" . Yah, itu karena ... err .. humm ..

Lihat, monyet berkepala 3 di belakang Anda!

Ok, mudah-mudahan, kamu cukup terganggu. Bergerak...

(jika Anda berpikir saya curang, ya, Anda benar. Tetapi begitu juga "jawaban resmi" perintah penting yang hanya dapat dieksekusi oleh root dan harus tersedia sebelum Anda me-mount /"). Yang benar adalah: garisnya memang buram, dan ada banyak nama warisan yang "macet" dan sekarang cukup sulit untuk dihilangkan.

Lebih lanjut tentang Kasus untuk /usrpenggabungan , dari systemddokumen:

Pembenaran historis untuk a / bin, / sbin dan / lib yang terpisah dari / usr tidak lagi berlaku hari ini. Mereka dipisahkan untuk memilih alat pada hard disk yang lebih cepat (yang kecil, karena lebih mahal) dan berisi semua alat yang diperlukan untuk me-mount partisi yang lebih lambat / usr. Hari ini, partisi / usr yang terpisah harus sudah dipasang oleh initramfs saat boot awal, sehingga membuat justifikasi untuk disk split-off. Selain itu, banyak alat di / bin dan / sbin di status quo sudah kehilangan kemampuan untuk berjalan tanpa pre-mount / usr. Tidak ada alasan yang sah lagi untuk memiliki sistem operasi tersebar di beberapa hierarki, itu kehilangan tujuannya.

Dan bacaan yang menakjubkan tentang /usrperpecahan dan alasannya, oleh Rob Landley:

Memahami bin, sbin, usr / bin, usr / sbin

Sekarang

Saat ini, mengenai menginstal direktori, cara terbaik Anda untuk memahami adalah berpikir seperti ini:

  • /usr - semua file yang hanya dapat dibaca oleh seluruh sistem yang diinstal oleh (atau disediakan oleh) OS

  • /usr/local- file yang hanya dapat dibaca di seluruh sistem yang diinstal oleh administrator lokal (biasanya, Anda). Dan itulah sebabnya sebagian besar nama direktori /usrdigandakan di sini.

  • /opt- kekejaman yang dimaksudkan untuk perangkat lunak yang hanya bisa membaca seluruh sistem dan mandiri . Artinya, perangkat lunak yang tidak membagi file mereka atas bin, lib, share, includeseperti berkelakuan baik software seharusnya.

  • ~/.local- mitra per pengguna /usr/local, yaitu: perangkat lunak yang diinstal oleh (dan untuk) setiap pengguna

  • ~/.local/opt - mitra per pengguna dari /opt

Jadi di mana menginstal perangkat lunak?

Daftar di atas sudah setengah dari jawaban Anda pertanyaan Oracle JDK, setidaknya itu memberikan beberapa petunjuk. Daftar centang untuk "Di mana saya harus menginstal perangkat lunak X?" berlalu:

  • Apakah ini merupakan perangkat lunak direktori tunggal yang serba lengkap, seperti Eclipse IDE dan aplikasi java lainnya yang diunduh, dan Anda ingin itu tersedia untuk semua pengguna? Kemudian instal/opt

  • Sama seperti di atas, tetapi Anda tidak peduli dengan pengguna lain dan saya ingin menginstal untuk pengguna Anda saja? Kemudian instal~/.local/opt

  • File-nya terbagi atas beberapa dir, seperti bindan share, seperti perangkat lunak tradisional yang dikompilasi dan diinstal ./configure && make && sudo make install, dan haruskah tersedia untuk semua pengguna? Kemudian instal/usr/local

  • Sama seperti di atas, tetapi hanya untuk pengguna Anda? Kemudian instal~/.local

  • Perangkat lunak yang diinstal oleh OS, atau melalui manajer paket (seperti Software Center), dan, yang paling penting, modifikasi lokal apa saja yang mungkin ditimpa ketika manajer pembaruan memutakhirkannya ke versi baru ? Pergi ke/usr

Catatan:

  • Ini menjelaskan mengapa awalan instal default untuk perangkat lunak yang dikompilasi adalah /usr/local, dan mengapa Anda harus mengubahnya ./configure --prefix=$HOME/.localketika menginstal perangkat lunak hanya untuk pengguna Anda sendiri

  • Anda mungkin telah memperhatikan bahwa semua direktori di atas adalah hanya-baca (kecuali, tentu saja, ketika Anda menginstal / menghapus perangkat lunak). File yang dapat ditulisi (seperti file konfigurasi) biasanya pergi ke /etc(untuk perangkat lunak sistem-lebar) dan ~/.config(untuk pengaturan per-pengguna). Meskipun banyak perangkat lunak lama (dan, sayangnya, beberapa yang modern juga) gunakan ~/.<software-name>, mengacaukan folder rumah Anda dengan miliaran dir dan file.

  • ~/.localdan ~/.configbukan bagian dari spesifikasi FHS. FHS tidak berurusan dengan folder rumah pengguna. Mereka adalah upaya XDG, organisasi standar lain yang diarahkan untuk Desktop Environments (seperti Gnome, KDE, dan Unity), untuk mencoba mengatur beberapa konvensi mengenai struktur rumah pengguna. Tidak semua perangkat lunak menganutnya (misalnya, ~/.local/bintidak dalam standar pengguna $PATH, sementara menurut logika seharusnya) , dan tidak ada pengguna yang dipaksa untuk mengikutinya, tetapi keduanya mendapatkan banyak manfaat interoperabilitas jika mereka melakukannya.

Saya harap ini membantu untuk sedikit memperjelas hal-hal. Jangan ragu untuk bertanya apa pun sehingga saya dapat meningkatkan jawabannya!

(dan saya juga berharap para puritan tidak membunuh saya karena bahasa dan penjelasan yang sangat informal. Itu disengaja, dan tentu saja memiliki banyak ketidakakuratan, tetapi saya percaya itu adalah cara yang baik untuk membuat pendatang baru memiliki gambaran singkat pemahaman tentang menginstal direktori rasional)

MestreLion
sumber
1
Anda menyimpulkannya dengan sangat ringkas dan ya, itu benar- jawaban lengkapnya adalah cerita yang jauh lebih panjang daripada yang di atas!
papashou
Kenapa tidak? Logika yang sama berlaku: penyerang dapat membuat dieksekusi di bawah rumah atau subdirektori nya, dinamai setelah perintah sistem.
ignis
3
@ignis: jika penyerang memiliki akses untuk membuat dan memodifikasi file di bawah rumah pengguna, maka pengguna itu sudah sepenuhnya dikompromikan, dan $PATHtidak relevan. Penyerang bahkan dapat mengubah itu melalui ~/.profile, sehingga titik Anda diperdebatkan. ~/.local/binseaman (atau tidak aman, jika Anda mau) sebagai ~/bin, yang merupakan praktik umum di sebagian besar distro. Gagasan bahwa pengguna tidak harus memiliki setiap dir untuk menjaga dan menjalankan skrip pribadi dalam $PATHtidak masuk akal.
MestreLion
Jadi, ~/binseaman ~/.profile, dan $PATHtidak melindungi saya dari malware yang dijalankan oleh saya (yang memiliki izin untuk menulis di rumah saya sendiri). Saya tidak tahu file ini, saya minta maaf. Terima kasih atas klarifikasi, maaf atas komentar saya sebelumnya.
ignis
Semakin lama sejarah yang dimilikinya, semakin banyak peningkatan / kekacauan yang ada.
smwikipedia