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

11

Dari halaman manual untuk ln :

-d, -F, --directory
  allow the superuser to attempt to hard link directories (note: will 
  probably fail due to system restrictions, even for the superuser)

Apakah ada driver sistem file yang benar-benar memungkinkan ini, atau hanya opsi mount --bind <src> <dest>? Atau apakah perilaku seperti ini diblokir oleh kernel bahkan sebelum sampai ke driver khusus sistem file?

CATATAN: Saya sebenarnya tidak berencana melakukan ini pada mesin apa pun, hanya ingin tahu.

Tembakan Parthian
sumber

Jawaban:

6

Pertama catatan: yang lnperintah tidak memiliki pilihan seperti -d, -F, --directory, ini adalah GNUism non-portabel.

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

Kembali ke pertanyaan awal Anda:

Pada sistem UNIX pada umumnya, keputusan, apakah tautan keras pada direktori dimungkinkan, dibuat pada 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 yang ditautkan.

Alasan mengapa ZFS tidak mendukung direktori yang di-hardlink adalah bahwa Jeff Bonwick tidak menyukai fitur itu.

Mengenai Linux, saya kira Linux memblokir upaya untuk membuat tautan keras pada direktori di lapisan kernel atas. Alasan untuk asumsi ini adalah bahwa Linus Torvalds menulis kode untuk GIT yang merusak direktori ketika git clonedipanggil sebagai root pada platform yang mendukung direktori yang ditautkan.

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

Jadi jika kita mengasumsikan bahwa Torvalds tahu cara kerja Linux dan jika Linux mendukung direktori yang ditautkan, Torvalds seharusnya tahu bahwa memanggil unlink(2)direktori sambil di-root, tidak akan kembali dengan kesalahan tetapi merusak direktori itu. Dengan kata lain, kecil kemungkinan Linux mengizinkan driver sistem file untuk mengimplementasikan direktori yang ditautkan.

schily
sumber
3

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

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

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

Jika Anda membaca (biasanya) lebih informatif Info halaman, Anda mungkin menemukan sebagai orang lain telah dilakukan:

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 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 bagi 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 menjaga dari kehilangan file jika direktori tidak terhubung. Karena operasi tautan / pembatalan tautan pada antarmuka sistem operasi C simetris , penautan ke direktori biasanya dilakukan hanya dalam panggilan mkdir / rmdir.

Ingatlah bahwa banyak GNU coreutils ditulis (dan didokumentasikan) 20-30 tahun yang lalu, ketika beberapa karya museum nyata masih digunakan. Seperti tercantum dalam Mengenai Keras link , 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 pengelola mereka. Pilihan yang dipertanyakan ada di pendahulunya fileutils(yang dikombinasikan dengan textutilsdan shellutilspada pertengahan 1990-an untuk membentuk coreutils). Beberapa item dari changelog dapat membantu untuk menjelaskan asal-usul 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 yang sesuai 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.

Sebagaimana dicatat dalam dokumentasi, fitur ini (dan opsi yang sesuai tidak ada dalam POSIX (dan lihat bagian Dasar Pemikiran yang menjelaskan alasannya). Sebaliknya, fitur tersebut dipindahkan ke perintah baru (disediakan juga oleh GNU coreutils) yang disebut link. Deskripsi perintah itu sendiri tidak jelas, Anda harus membaca deskripsi pemanggilan fungsi untuk mendapatkan penggunaan dari standar. Namun, standar tidak mengklarifikasi kondisi di mana perintah akan bekerja, selain meneruskan penyangkalan tentang hak istimewa yang diperlukan. Untuk itu, Anda harus pergi ke fitur yang tergantung 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 itu dengan melarang link()dan unlink()melakukan hal ini. Fungsi lain bisa melakukannya jika implementor mendesain ekstensi semacam itu.

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

OSX menggunakan banyak hardlink ke direktori untuk file biasa . Itu tidak mendukung ini menggunakan ln(lihat halaman manual ). Menurut How Time Machine , Magic , melakukan ini untuk menyediakan versi yang digunakan untuk fasilitas cadangan Time Machine.

Bacaan lebih lanjut:

Thomas Dickey
sumber
3
Ini sepertinya tidak menjawab pertanyaan sama sekali.
Michael Homer