GNU/Linux >> Belajar Linux >  >> Linux

Mengapa ada `/lib` dan `/lib64` tetapi hanya `/bin`?

Pertama, mengapa ada /lib yang terpisah dan /lib64 :

Standar Hierarki Filesystem yang memisahkan /lib dan /lib64 ada karena:

10.1. Mungkin ada satu atau lebih varian direktori /lib pada sistem yang mendukung lebih dari satu format biner yang memerlukan pustaka terpisah. (...) Ini biasanya digunakan untuk dukungan 64-bit atau 32-bit pada sistem yang mendukung banyak format biner, tetapi memerlukan pustaka dengan nama yang sama. Dalam hal ini, /lib32 dan /lib64 mungkin merupakan direktori pustaka, dan /lib merupakan symlink ke salah satunya.

Di Slackware 14.2 saya misalnya ada /lib dan /lib64 direktori masing-masing untuk pustaka 32-bit dan 64-bit meskipun/lib bukan sebagai symlink seperti yang disarankan oleh cuplikan FHS:

$ ls -l /lib/libc.so.6
lrwxrwxrwx 1 root root 12 Aug 11  2016 /lib/libc.so.6 -> libc-2.23.so
$ ls -l /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Aug 11  2016 /lib64/libc.so.6 -> libc-2.23.so

Ada dua libc.so.6 perpustakaan di /lib dan /lib64 .

Setiap biner ELF yang dibangun secara dinamis berisi jalur hardcode ke juru bahasa, dalam hal ini /lib/ld-linux.so.2 atau /lib64/ld-linux-x86-64.so.2 :

$ file main
main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, not stripped
$ readelf  -a main  | grep 'Requesting program interpreter'
      [Requesting program interpreter: /lib/ld-linux.so.2]

$ file ./main64
./main64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, not stripped
$ readelf  -a main64  | grep 'Requesting program interpreter'
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

Tugas juru bahasa adalah memuat pustaka bersama yang diperlukan. Anda dapat bertanya kepada juru bahasa GNU pustaka apa yang akan dimuat tanpa menjalankan biner menggunakan LD_TRACE_LOADED_OBJECTS=1 atau ldd bungkus:

$ LD_TRACE_LOADED_OBJECTS=1 ./main
        linux-gate.so.1 (0xf77a9000)
        libc.so.6 => /lib/libc.so.6 (0xf760e000)
        /lib/ld-linux.so.2 (0xf77aa000)
$ LD_TRACE_LOADED_OBJECTS=1 ./main64
        linux-vdso.so.1 (0x00007ffd535b3000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f56830b3000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f568347c000)

Seperti yang Anda lihat, juru bahasa tertentu tahu persis ke mana harus mencari perpustakaan - versi 32-bit mencari perpustakaan di /lib dan versi 64-bit mencari pustaka di /lib64 .

Standar FHS mengatakan hal berikut tentang /bin :

/bin berisi perintah yang dapat digunakan oleh administrator sistem dan pengguna, tetapi diperlukan saat tidak ada sistem file lain yang dipasang (misalnya dalam mode pengguna tunggal). Mungkin juga berisi perintah yang digunakan secara tidak langsung oleh skrip.

IMO alasan mengapa tidak ada /bin yang terpisah dan /bin64 adalah jika kita memiliki file dengan nama yang sama di kedua direktori ini, kita tidak dapat memanggil salah satunya secara langsung karena kita harus memasukkan /bin atau /bin64 pertama di$PATH .

Namun, perhatikan bahwa di atas hanyalah konvensi - kernel Linux tidak terlalu peduli jika Anda memiliki /bin terpisah dan /bin64 .Jika Anda menginginkannya, Anda dapat membuatnya dan mengatur sistem Anda sesuai dengan itu.

Anda juga menyebutkan Android - perhatikan bahwa kecuali untuk menjalankan kernel Linux yang dimodifikasi, itu tidak ada hubungannya dengan sistem GNU seperti Ubuntu - tidak ada glibc, tidak ada bash (secara default, tentu saja Anda dapat mengkompilasi dan menerapkannya secara manual), dan juga struktur direktori sangat berbeda .


Alasannya adalah direktori lib/lib64 dapat berisi file yang kebetulan memiliki nama yang sama karena itu adalah perpustakaan yang dibagikan dengan beragam program. Menempatkan mereka di direktori terpisah menyelesaikan konflik. Ada (biasanya...) tidak ada alasan bagus untuk mendistribusikan file executable dengan nama yang sama pada sistem yang sama yaitu 32/64-bit, tetapi karena mungkin ada campuran file executable, pustaka bersama harus disediakan.


Linux
  1. Linux – Mengapa `/dev/ptmx` Dan `/dev/pts/ptmx` Bukan File Perangkat?

  2. Apakah Ada Kompilator atau Runtime C yang "esoterik" (aneh) Tapi Sesuai Standar?

  3. Apakah Output Dari Perintah `tty` Dan File `/dev/tty` Keduanya Mengacu pada Terminal Pengendali Proses Bash Saat Ini?

  1. Mengapa File Descriptor Dibuka Dan Hanya Dibaca Sekali?

  2. Tidak ada ruang tersisa di perangkat, tetapi partisi hanya setengah penuh dan inode tersedia

  3. mengapa timer_t didefinisikan dalam time.h di Linux tetapi tidak pada OS X

  1. Apakah ada sistem file yang hanya menyimpan satu salinan file, dan salinan lainnya hanya referensi?

  2. Mengapa Linux harus memiliki `/dev/cdrom` dan `/media/cdrom`?

  3. konsol virsh dan ukuran tty