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:
% ls -l test
ls: test: No such file or directory
% touch test
% ls -l test
-rw-r--r-- 1 danny staff 0 Oct 13 17:58 test
% ln test test2
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
% touch test3
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
-rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
^
^ this is the link count
Sekarang, Anda dapat dengan jelas melihat bahwa tidak ada yang namanya tautan keras. Tautan keras sama dengan nama biasa. Dalam contoh di atas, test
atau test2
, 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:
% ls -li test*
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
14445892 -rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
The -i
bendera untuk ls
menunjukkan nomor inode pada awal baris. Perhatikan caranya test
dan test2
memiliki nomor inode yang sama, tetapi test3
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 bisa du
tahu kapan itu mengenai lingkaran? Ini rawan kesalahan dan banyak pembukuan yang du
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!
% ls -l
total 4
drwxr-xr-x 3 danny staff 102 Oct 13 18:14 test1/
lrwxr-xr-x 1 danny staff 5 Oct 13 18:13 test2@ -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .
..
menunjuk? Terutama setelah menghapus tautan keras ke direktori ini, di direktori yang ditunjuk oleh..
? Perlu menunjuk ke suatu tempat.