Saya membaca di buku teks bahwa Unix / Linux tidak mengizinkan tautan keras ke direktori tetapi mengizinkan tautan lunak. Apakah karena, ketika kita memiliki siklus dan jika kita membuat tautan keras, dan setelah beberapa waktu kita menghapus file asli, itu akan menunjuk ke beberapa nilai sampah?
Jika siklus adalah satu-satunya alasan di balik tidak memungkinkan tautan keras, lalu mengapa tautan lunak ke direktori diizinkan?
filesystems
directory
symlink
hard-link
user3539
sumber
sumber
..
menunjuk? Terutama setelah menghapus tautan keras ke direktori ini, di direktori yang ditunjuk oleh..
? Perlu menunjuk ke suatu tempat...
tidak perlu ada secara fisik di drive apa pun. Ini adalah tugas sistem operasi untuk melacak direktori kerja saat ini, jadi, seharusnya relatif sederhana untuk juga menyimpan daftar inode yang terkait dengan setiap proses 'cwd dan merujuk ke itu ketika melihat penggunaan..
. Tentu saja, itu berarti symlink perlu dibuat dengan mempertimbangkan hal itu, tetapi Anda harus berhati-hati untuk tidak merusak symlink, dan saya tidak berpikir bahwa aturan tambahan akan membuat mereka tidak berguna.Jawaban:
Ini hanya ide yang buruk, karena tidak ada cara untuk membedakan antara tautan keras dan nama asli.
Mengizinkan tautan keras ke direktori akan memecah struktur grafik asiklik yang diarahkan pada sistem file, mungkin membuat loop direktori dan menggantung sub direktori direktori, yang akan membuat
fsck
dan file tree walker lainnya rentan kesalahan.Pertama, untuk memahami ini, mari kita bicara tentang inode. Data dalam sistem file disimpan dalam blok di disk, dan blok-blok itu dikumpulkan bersama oleh sebuah inode. Anda dapat menganggap inode sebagai THE file. Inode tidak memiliki nama file. Di situlah tautan masuk.
Tautan hanyalah penunjuk ke inode. Direktori adalah inode yang menyimpan tautan. Setiap nama file dalam direktori hanyalah tautan ke inode. Membuka file di Unix juga membuat tautan, tetapi ini jenis tautan yang berbeda (ini bukan tautan yang disebutkan namanya).
Tautan keras hanyalah entri direktori tambahan yang menunjuk ke inode itu. Saat Anda
ls -l
, nomor setelah izin adalah jumlah tautan yang dinamai. Sebagian besar file biasa akan memiliki satu tautan. Membuat tautan keras baru ke file akan membuat kedua nama file menunjuk ke inode yang sama. catatan:Sekarang, Anda dapat dengan jelas melihat bahwa tidak ada yang namanya tautan keras. Tautan keras sama dengan nama biasa. Dalam contoh di atas,
test
atautest2
, mana file asli dan mana yang merupakan tautan keras? Pada akhirnya, Anda tidak dapat benar-benar tahu (bahkan oleh cap waktu) karena kedua nama menunjuk ke konten yang sama, inode yang sama:The
-i
bendera untukls
menunjukkan nomor inode pada awal baris. Perhatikan caranyatest
dantest2
memiliki nomor inode yang sama, tetapitest3
memiliki nomor yang berbeda.Sekarang, jika Anda diizinkan melakukan ini untuk direktori, dua direktori berbeda di titik berbeda dalam sistem file dapat menunjuk ke hal yang sama. Bahkan, subdir dapat menunjuk kembali ke kakek-neneknya, membuat satu lingkaran.
Mengapa loop ini menjadi perhatian? Karena ketika Anda melintasi, tidak ada cara untuk mendeteksi Anda mengulang (tanpa melacak nomor inode saat Anda melintasi). Bayangkan Anda sedang menulis
du
perintah, yang perlu diulang melalui subdir untuk mencari tahu tentang penggunaan disk. Bagaimana bisadu
tahu kapan itu mengenai lingkaran? Ini rawan kesalahan dan banyak pembukuan yangdu
harus dilakukan, hanya untuk melakukan tugas sederhana ini.Symlinks adalah binatang yang sama sekali berbeda, dalam arti mereka adalah jenis "file" khusus yang cenderung diikuti oleh banyak sistem file API. Catatan, symlink dapat menunjuk ke tujuan yang tidak ada, karena mereka menunjuk berdasarkan nama, dan tidak langsung ke inode. Konsep itu tidak masuk akal dengan tautan keras, karena keberadaan "tautan keras" semata-mata berarti file itu ada.
Jadi mengapa bisa
du
berurusan dengan symlink dengan mudah dan bukan tautan keras? Kami dapat melihat di atas bahwa tautan keras tidak dapat dibedakan dari entri direktori normal. Namun, tautannya spesial, dapat dideteksi, dan dapat diabaikan!du
pemberitahuan bahwa symlink adalah symlink, dan melompati sepenuhnya!sumber
Allowing hard links to directories would break the directed acyclic graph structure of the filesystem
. Bisakah Anda jelaskan lebih lanjut tentang masalah dengan siklus menggunakan tautan keras? Mengapa ok dengan symlinkDengan pengecualian mount point, setiap direktori memiliki satu dan hanya orang tua:
..
.Salah satu cara yang harus dilakukan
pwd
adalah memeriksa perangkat: inode for '.' dan '..'. Jika keduanya sama, Anda telah mencapai root dari sistem file. Jika tidak, cari nama direktori saat ini di induk, dorong itu di tumpukan, dan mulai membandingkan '../.' dengan '../ ..', lalu '../../.' dengan '../../ ..', dll. Setelah Anda mencapai root, mulailah bermunculan dan mencetak nama-nama dari tumpukan. Algoritma ini bergantung pada fakta bahwa setiap direktori memiliki satu dan hanya satu induk.Jika tautan keras ke direktori dibolehkan, yang mana dari beberapa orang tua yang harus
..
ditunjukkan? Itulah salah satu alasan kuat mengapa hardlink ke direktori tidak diperbolehkan.Symlinks ke direktori tidak menyebabkan masalah itu. Jika suatu program menginginkannya, itu bisa dilakukan
lstat()
pada setiap bagian pathname dan mendeteksi kapan symlink ditemukan. Thepwd
algoritma akan mengembalikan path absolut berlaku untuk direktori target. Fakta bahwa ada bagian teks di suatu tempat (symlink) yang menunjuk ke direktori target cukup banyak tidak relevan. Keberadaan symlink seperti itu tidak membuat lingkaran dalam grafik.sumber
..
sebagai semacam hardlink virtual ke induk, tidak ada alasan teknis bahwa target tautan hanya dapat memiliki satu tautan lain ke sana.pwd
hanya perlu menggunakan algoritma yang berbeda untuk menyelesaikan jalur.Anda dapat menggunakan bind mount untuk mensimulasikan direktori penautan yang sulit
sumber
Saya ingin menambahkan beberapa poin lagi tentang pertanyaan ini. Tautan keras untuk direktori diizinkan di linux, tetapi dengan cara terbatas.
Salah satu cara kita dapat menguji ini adalah ketika kita daftar isi direktori kita menemukan dua direktori khusus "." dan "..". Seperti yang kita tahu "." menunjuk ke direktori yang sama dan ".." menunjuk ke direktori induk.
Jadi mari kita buat pohon direktori di mana "a" adalah direktori induk yang memiliki direktori "b" sebagai anaknya.
Catat inode direktori "a". Dan ketika kita melakukan
ls -la
dari direktori "a" kita bisa melihatnya "." direktori juga menunjuk ke inode yang sama.Dan di sini kita dapat menemukan bahwa direktori "a" memiliki tiga tautan keras. Ini karena inode 797358 memiliki tiga hardlink atas nama "." di dalam direktori "a" dan beri nama ".." di dalam direktori "b" dan satu dengan nama "a" itslef.
Jadi di sini kita dapat memahami bahwa tautan keras ada untuk direktori hanya untuk terhubung dengan direktori induk dan anak mereka. Dan direktori tanpa anak hanya akan memiliki 2 hardlink, dan direktori "b" hanya akan memiliki dua hardlink.
Salah satu alasan mengapa tautan keras direktori secara bebas dicegah adalah untuk menghindari loop referensi tanpa batas yang akan membingungkan program yang melintasi sistem file.
Karena filesystem diatur sebagai pohon dan karena pohon tidak dapat memiliki referensi siklik, ini seharusnya dihindari.
sumber
Tak satu pun dari berikut ini adalah alasan sebenarnya untuk melarang tautan keras ke direktori; setiap masalah cukup mudah dipecahkan:
The Alasan sebenarnya (sebagaimana diisyaratkan oleh @ Thorbjørn Ravn Andersen) datang ketika Anda menghapus sebuah direktori yang memiliki beberapa orang tua, dari direktori yang ditunjuk oleh
..
:Apa yang
..
sekarang harus menunjuk?Jika direktori dihapus dari induknya tetapi jumlah tautannya masih lebih besar dari
0
itu pasti ada sesuatu, di suatu tempat masih menunjuk ke sana. Anda tidak bisa membiarkan..
menunjuk apa-apa; banyak program bergantung..
, sehingga sistem harus menelusuri seluruh sistem file sampai menemukan hal pertama yang menunjuk ke direktori yang dihapus, hanya untuk memperbarui..
. Entah itu, atau sistem file harus mempertahankan daftar semua direktori yang menunjuk ke direktori yang ditautkan.Either way, ini akan menjadi overhead kinerja dan komplikasi tambahan untuk meta data sistem file dan / atau kode, sehingga desainer memutuskan untuk tidak mengizinkannya.
sumber
..
), perbarui..
untuk menunjuk ke salah satu orang tua lain dalam daftar.a/..
selalu berarti.
. Inilah cara kerja URL, btw. Ini adalah browser yang menyelesaikan '..' sebelum bahkan hits server. Dan itu bekerja dengan baik.Pembuatan hardlink pada direktori tidak akan dapat dikembalikan. Misalkan kita memiliki:
Saya menghubungkannya dengan hardlink
/dir2
.Jadi
/dir2
sekarang juga berisi semua file dan direktori iniBagaimana jika saya berubah pikiran? Saya tidak bisa
rmdir /dir2
(karena tidak kosong)Dan jika saya secara rekursif menghapus
/dir2
... itu juga akan dihapus/dir1
!IMHO itu alasan yang cukup memadai untuk menghindari ini!
Sunting :
Komentar menyarankan untuk menghapus direktori dengan melakukannya
rm
. Tetapirm
pada direktori non-kosong gagal, dan perilaku ini harus tetap, apakah direktori tersebut di-hardlink atau tidak. Jadi Anda tidak bisarm
membatalkannya. Ini akan membutuhkan argumen baru untukrm
, hanya untuk mengatakan "jika inode direktori memiliki jumlah referensi> 1, maka hanya putuskan tautan direktori".Yang, pada gilirannya, melanggar prinsip lain yang paling tidak mengejutkan: itu berarti bahwa penghapusan hardlink direktori yang baru saja saya buat tidak sama dengan penghapusan hardlink file normal ...
Saya akan mengulangi kalimat saya: Tanpa pengembangan lebih lanjut, pembuatan hardlink tidak akan dapat dikembalikan (karena tidak ada perintah saat ini yang bisa menangani penghapusan tanpa tidak mengerti perilaku saat ini)
Jika kami mengizinkan pengembangan lebih lanjut untuk menangani kasus ini, jumlah jebakan, dan risiko kehilangan data jika Anda tidak cukup mengetahui bagaimana sistem bekerja, seperti yang disiratkan oleh pengembangan, apakah IMHO alasan yang cukup untuk membatasi hardlinking pada direktori.
sumber
rm
bawahnya toh (batalkan tautan). Lihat: unix.stackexchange.com/questions/151951/… Ini benar-benar bukan masalah, apalagi dengan file yang di-hardlink. Membatalkan tautan hanya menghapus referensi yang disebutkan dan mengurangi jumlah tautan. Fakta bahwarmdir
tidak akan menghapus direktori tidak kosong adalah tidak relevan - tidak akan melakukan itudir1
juga. Hardlink bukan salinan data, mereka adalah file aktual yang sama, karenanya sebenarnya "menghapus" file dir2 akan menghapus daftar direktori untuk dir1. Anda harus selalu membatalkan tautan.rm
pada direktori jangan memutuskan tautannya jika itu tidak kosong. Lihat Edit.Ini penjelasan yang bagus. Mengenai "Yang mana dari beberapa orang tua yang harus ... tunjuk?" satu solusi akan untuk suatu proses untuk mempertahankan path wd penuh, baik sebagai inode atau sebagai string. inode akan lebih kuat karena nama dapat diubah. Setidaknya di masa lalu, ada inode in-core untuk setiap file yang terbuka yang bertambah setiap kali file dibuka, dikurangi ketika ditutup. Ketika mencapai nol dan penyimpanan yang ditunjuk akan dibebaskan. Ketika file tidak lagi dibuka oleh siapa pun, itu (Salinan dalam-inti) akan ditinggalkan. Ini akan mempertahankan jalur sebagai valid jika beberapa proses lain memindahkan direktori ke direktori lain sementara subdirektori berada di jalur proses lain. Mirip dengan bagaimana Anda dapat menghapus file yang terbuka tetapi hanya dihapus dari direktori,
Direktori penghubung keras dulu diizinkan secara bebas di Bell Labs UNIX, setidaknya V6 dan V7, Tidak tahu tentang Berkeley atau yang lebih baru. Tidak perlu bendera. Bisakah kamu membuat loop? Ya, jangan lakukan itu. Sangat jelas apa yang Anda lakukan jika Anda membuat lingkaran. Nether jika Anda berlatih mengikat simpul di leher Anda saat Anda sedang menunggu giliran Anda untuk melompat keluar dari pesawat jika Anda memiliki ujung yang lain digantung dengan mudah dari kait di kepala-massal.
Apa yang saya harap akan dilakukan hari ini adalah menghubungkan hard-lhome ke rumah sehingga saya dapat memiliki / home / administ tersedia atau tidak / home ditutup dengan automout over home, automount tersebut memiliki symlink bernama administ to / lhome / kelola. Ini memungkinkan saya untuk memiliki akun administratif yang berfungsi terlepas dari keadaan sistem file rumah utama saya. Ini adalah percobaan untuk linux, tapi saya pikir belajar pada satu waktu untuk SunOS berbasis UCB bahwa automount dilakukan pada level string ascii. Sulit untuk melihat bagaimana mereka dapat dilakukan sebaliknya sebagai lapisan di atas FS sembarang.
Saya membaca di tempat lain itu. dan .. bukan file lagi di direktori. Saya yakin bahwa ada alasan bagus untuk semua ini, dan banyak dari apa yang kami nikmati (Seperti dapat me-mount NTFS) adalah mungkin karena hal-hal seperti itu, tetapi beberapa keanggunan UNIX ada dalam implementasi. Inilah manfaat seperti sifat umum dan kelenturan yang diberikan keanggunan ini yang memungkinkannya begitu kuat dan bertahan selama empat dekade. Ketika kita kehilangan implementasi elegan itu pada akhirnya akan menjadi seperti Windows (saya harap saya salah!). Seseorang kemudian akan membuat OS baru yang didasarkan pada prinsip-prinsip elegan. Sesuatu untuk dipikirkan. Mungkin saya salah, saya tidak (jelas) akrab dengan implementasi saat ini. ini adalah luar biasa meskipun bagaimana pemahaman 30 tahun berlaku untuk Linux ... sebagian besar waktu!
sumber
.
dan..
bukan hardlinks dalam sistem file, untuk sistem file modern. Namun driver sistem file membuat mereka salah. Ini adalah sistem file yang menghentikan direktori yang menghubungkan dengan keras. Untuk sistem file lama dimungkinkan (tetapi berbahaya). Untuk melakukan apa yang Anda coba, lihatmount --bind
, lihat jugamount --make…
dan mungkin wadah.Dari apa yang saya kumpulkan, alasan utamanya adalah berguna untuk dapat mengubah nama direktori tanpa mengacaukan program yang sedang berjalan yang menggunakan direktori kerja mereka untuk merujuk file lain. Misalkan Anda menggunakan Wine untuk menjalankan
~/.newwineprefix/drive_c/Program Files/Firefox/Firefox.exe
, dan Anda ingin memindahkan seluruh awalan~/.wine
. Jika karena alasan yang aneh, Firefox mengaksesdrive_c/windows
dengan merujuk../../windows
, mengubah nama~/.newwineprefix
memecah implementasi..
yang melacak direktori induk sebagai string teks dan bukannya inode.Menyimpan inode dari direktori induk tunggal harus lebih sederhana daripada mencoba melacak setiap path sebagai string teks dan serangkaian inode.
Alasan lain adalah bahwa aplikasi yang keliru mungkin dapat membuat loop. Berperilaku aplikasi harus dapat memeriksa apakah inode direktori yang sedang dipindahkan adalah sama dengan inode dari direktori bersarang yang dipindahkan, sama seperti Anda tidak dapat memindahkan direktori ke dalam dirinya sendiri, tetapi ini mungkin tidak ditegakkan di tingkat sistem file.
Namun alasan lain mungkin bahwa jika Anda dapat mengarahkan direktori, Anda ingin mencegah menghubungkan direktori yang tidak dapat Anda modifikasi.
find
memiliki pertimbangan keamanan karena digunakan untuk menghapus file yang dibuat oleh pengguna lain dari direktori sementara, yang dapat menyebabkan masalah jika pengguna mengganti direktori nyata untuk symlink saatfind
menjalankan perintah lain. Mampu menghubungkan direktori-direktori penting dengan hardlink akan memaksa administrator untuk menambahkan tes tambahanfind
agar tidak memengaruhi mereka. (Oke, Anda sudah tidak dapat melakukan ini untuk file, jadi alasan ini tidak valid.)Namun alasan lain adalah bahwa menyimpan inode direktori induk dapat memberikan redundansi tambahan jika terjadi kerusakan atau kerusakan sistem file. Jika Anda ingin
..
membuat daftar semua direktori induk yang memiliki tautan keras ke direktori ini, maka induk yang berbeda dan sewenang-wenang dapat dengan mudah ditemukan jika direktori saat ini dihapus, tidak hanya Anda melanggar gagasan bahwa tautan keras sama, Anda harus mengubah cara sistem file menyimpan dan menggunakan inode. Memiliki program memperlakukan jalur sebagai serangkaian (unik untuk setiap hardlink) dari direktori inode akan menghindari ini, tetapi Anda tidak akan mendapatkan redundansi jika terjadi kerusakan sistem file.sumber