GNU/Linux >> Belajar Linux >  >> Linux

Apakah ada sistem file yang `ln -d` berhasil?

Catatan pertama:ln perintah tidak memiliki opsi seperti -d , -F , --directory , ini adalah GNUisme non-portabel.

Fitur yang Anda cari, diimplementasikan oleh link(1) perintah.

Kembali ke pertanyaan awal Anda:

Pada sistem UNIX biasa, keputusan, apakah tautan keras pada direktori dimungkinkan, dibuat di driver sistem file.

Driver Solaris UFS mendukung tautan keras pada direktori, sedangkan driver ZFS tidak.

Alasan mengapa UFS di Solaris mendukung tautan keras adalah karena AT&T tertarik dengan fitur ini - UFS dari BSD tidak mendukung direktori tautan keras.

Alasan mengapa ZFS tidak mendukung direktori hardlink adalah karena Jeff Bonwick tidak menyukai fitur tersebut.

Mengenai Linux, saya kira Linux memblokir upaya untuk membuat tautan keras pada direktori di lapisan kernel atas. Alasan asumsi ini adalah karena Linus Torvalds menulis kode untuk GIT yang merusak direktori saat git clone dipanggil sebagai root pada platform yang mendukung direktori tertaut keras.

Perhatikan bahwa sistem file yang mendukung pembuatan direktori hard linked juga perlu mendukung unlink(1) untuk menghapus direktori yang tidak kosong sebagai root.

Jadi jika kita berasumsi bahwa Torvalds mengetahui cara kerja Linux dan jika Linux memang mendukung direktori hard linked, Torvalds seharusnya mengetahui bahwa memanggil unlink(2) pada direktori saat menjadi root, tidak akan kembali dengan kesalahan tetapi merusak direktori itu. Dengan kata lain, Linux tidak mungkin mengizinkan driver sistem file untuk mengimplementasikan direktori yang ditautkan.


Pertanyaan OP menyebutkan mount --bind . Pemeriksaan cepat menunjukkan bahwa itu tidak mengubah jumlah tautan untuk direktori yang dipasang. Tautan keras selalu memodifikasi jumlah tautan, yang dapat Anda lihat menggunakan ls -ld .

Biasanya (kebanyakan sistem mirip Unix), jumlah hardlink ke direktori akan menjadi jumlah direktori yang terhubung ke nama itu, mis.,

  • ".." (direktori induk)
  • "." (direktori itu sendiri)
  • subdirektori

Jika Anda membaca (biasanya) info yang lebih informatif halaman, Anda mungkin menemukan seperti yang dilakukan orang lain:

Oh great, one spends hours tying to find what is wrong only to
discover,
$ info ln
On all existing implementations, you cannot make a hard link to a
directory, and hard links cannot cross filesystem boundaries.  (These
restrictions are not mandated by POSIX, however.)

Therefore, kindly say everywhere you say super-user only,
instead say "few systems, super-user only".

meskipun saat ini adalah worded

Sebagian besar sistem melarang membuat tautan keras ke direktori; pada yang diizinkan, hanya pengguna super yang dapat melakukannya (dan dengan hati-hati, karena membuat siklus akan menyebabkan masalah pada banyak utilitas lain). Tautan keras tidak dapat melewati batas sistem file. (Namun, pembatasan ini tidak diamanatkan oleh POSIX.)

Membuat (dan menghapus) hardlink ke direktori adalah fitur terbatas untuk mencegah hilangnya file jika direktori tidak ditautkan. Karena operasi link/unlink pada antarmuka sistem operasi C bersifat simetris , penautan ke direktori biasanya dilakukan hanya dalam panggilan mkdir/rmdir.

Perlu diingat bahwa banyak coreutils GNU ditulis (dan didokumentasikan) 20-30 tahun yang lalu, ketika beberapa benda museum masih digunakan. Seperti disebutkan dalam Mengenai Tautan Keras, awalnya ada tidak ada panggilan mkdir/rmdir; direktori dibuat (sebagai operasi istimewa) menggunakan tautan keras. Semua itu hilang ketika panggilan sistem ditambahkan untuk menyelesaikan masalah yang disebutkan. Tetapi dokumentasi terus mengacu pada sistem ini melewati memori pengelolanya. Opsi yang dipertanyakan ada di fileutils pendahulunya (yang digabungkan dengan textutils dan shellutils pada pertengahan 1990-an untuk membentuk coreutils ). Beberapa item dari changelog dapat membantu memperjelas asal fitur:

Mon Jul 23 16:57:44 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * cp.c (copy): Make +update operate silently, like +one-file-system.
        * ln.c: Add -F as synonym for -d, for SunOS compatibility.

Wed Feb 21 11:13:26 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * ln.c (error): New function.
        (main, do_link): Call error instead of fprintf and exit. 
        (main): Recognize new -d +directory option to allow superuser to
        make hard links to dirs, like the BSD ln -f option.
        (do_link): Don't allow hard links to dirs (they are hard to
        get rid of -- rmdir and unlink don't do it), unless -d was given.
        (usage): Mention -d +directory option.

Jadi Anda dapat melihat misalnya bahwa salah satu barang antik yang menerapkan fitur ini adalah SunOS. Halaman manual terkait mengatakan ini:

OPTIONS
       -f     Force a hard link to a directory -- this option is  only   avail-
              able to the super-user.

       -s     Create a symbolic link or links.

SYSTEM V OPTIONS
       -f     Force  files to be linked without displaying permissions, asking
              questions or reporting errors.

       -F     Force a hard link to a directory -- this option is  only  avail-
              able to the super-user.

       -s     Create a symbolic link or links.

Seperti disebutkan dalam dokumentasi, fitur ini (dan opsi terkait tidak ada di POSIX (dan lihat Dasar Pemikiran bagian yang menjelaskan alasannya). Sebaliknya, fitur dipindahkan ke perintah baru (disediakan juga oleh GNU coreutils) yang disebut link . Deskripsi dari perintah itu sendiri tidak jelas; Anda harus membaca deskripsi pemanggilan fungsi untuk mendapatkan penggunaan dari standar. Namun, standar tersebut tidak mengklarifikasi kondisi di mana perintah akan bekerja, selain meneruskan penafian tentang hak istimewa yang diperlukan. Untuk itu, Anda harus membuka fitur yang bergantung pada sistem di luar standar:

Menautkan ke direktori dibatasi untuk superuser di sebagian besar implementasi historis karena kemampuan ini dapat menghasilkan loop dalam hierarki file atau merusak sistem file. Volume POSIX.1-2008 ini melanjutkan filosofi tersebut dengan melarang link() dan unlink() dari melakukan ini. Fungsi lain dapat melakukannya jika pelaksana merancang ekstensi semacam itu.

Ada adalah sistem yang menggunakan tautan keras ke direktori di luar angka normal (2 ditambah subdirektori).

OSX menggunakan beberapa hardlink ke direktori untuk file biasa . Itu tidak mendukung ini menggunakan ln (lihat halaman manual). Menurut Cara Kerja Time Machine Magic-nya, ini dilakukan untuk menyediakan versi yang digunakan untuk fasilitas pencadangan Time Machine.

Bacaan lebih lanjut:

  • Mengapa OS X Time Machine membuat hardlink direktori?
  • Apa perintah Unix untuk membuat hardlink ke direktori di OS X?

Linux
  1. Apakah ada yang setara dengan anggur untuk menjalankan aplikasi Mac?

  2. Apakah ada opsi untuk membiarkan keluaran kucing dengan warna?

  3. Apakah ada yang setara dengan cd - untuk cp atau mv?

  1. Apakah ada GUI untuk Linux yang tidak menggunakan X11?

  2. Apakah ada GUI SQLite (bagus) untuk Linux?

  3. Apakah ada alasan lain untuk tidak ada ruang tersisa di perangkat?

  1. Apakah Ada Konvensi Penamaan Untuk Variabel Dalam Skrip Shell?

  2. Apakah Ada Efek Samping Ketika Dua Distro Berbagi Partisi Swap?

  3. Mengapa Tautan Keras Ke Direktori Tidak Diizinkan Di Unix/linux?