Saya membaca di buku teks bahwa Unix/Linux tidak mengizinkan tautan keras ke direktori tetapi mengizinkan tautan lunak. Apakah karena, ketika kami memiliki siklus dan jika kami membuat tautan keras, dan setelah beberapa waktu kami menghapus file asli, itu akan menunjukkan beberapa nilai sampah?
Jika siklus adalah satu-satunya alasan di balik tidak mengizinkan tautan keras, lalu mengapa tautan lunak ke direktori diizinkan?
Jawaban yang Diterima:
Ini hanya ide yang buruk, karena tidak ada cara untuk membedakan antara tautan keras dan nama asli.
Mengizinkan tautan keras ke direktori akan merusak struktur grafik asiklik terarah dari sistem file, mungkin membuat loop direktori dan subpohon direktori yang menggantung, yang akan membuat fsck
dan semua file tree walker rawan kesalahan.
Pertama, untuk memahami ini, mari kita bicara tentang inode. Data dalam sistem file disimpan dalam blok-blok pada disk, dan blok-blok tersebut dikumpulkan bersama oleh sebuah inode. Anda dapat menganggap inode sebagai file THE.
Inode tidak memiliki nama file. Di situlah tautan masuk.
Tautan hanyalah penunjuk ke inode. Direktori adalah inode yang menyimpan link. Setiap nama file dalam direktori hanyalah tautan ke sebuah inode. Membuka file di Unix juga membuat tautan, tetapi jenis tautannya berbeda (bukan tautan bernama).
Tautan keras hanyalah entri direktori tambahan yang menunjuk ke inode itu. Saat Anda ls -l
, nomor setelah izin adalah jumlah tautan bernama. Sebagian besar file biasa akan memiliki satu tautan. Membuat hard link 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 hard link. Tautan keras sama dengan nama biasa. Dalam contoh di atas, test
atau test2
, yang mana file aslinya dan mana yang hard linknya? Pada akhirnya, Anda tidak dapat benar-benar mengetahuinya (bahkan dengan 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
-i
tandai ke ls
menunjukkan nomor inode di awal baris. Perhatikan bagaimana test
dan test2
memiliki nomor inode yang sama,
tetapi test3
memiliki 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. Faktanya, sebuah subdir dapat menunjuk kembali ke kakeknya, membuat sebuah loop.
Mengapa lingkaran ini menjadi perhatian? Karena saat Anda melintasi, tidak ada cara untuk mendeteksi Anda sedang melakukan perulangan (tanpa melacak nomor inode saat Anda melintasi). Bayangkan Anda sedang menulis du
perintah, yang perlu berulang melalui subdir untuk mencari tahu tentang penggunaan disk. Bagaimana du
tahu kapan itu memukul loop? Ini rawan kesalahan dan banyak pembukuan yang du
harus dilakukan, hanya untuk melakukan tugas sederhana ini.
Symlinks adalah binatang yang sama sekali berbeda, karena mereka adalah jenis "file" khusus yang cenderung diikuti oleh banyak API filesystem secara otomatis. 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" saja berarti file itu ada.
Jadi kenapa bisa du
menangani symlink dengan mudah dan bukan tautan keras? Kami dapat melihat di atas bahwa tautan keras tidak dapat dibedakan dari entri direktori normal. Symlinks, bagaimanapun, adalah spesial, dapat dideteksi, dan dapat dilewati! du
memperhatikan bahwa symlink adalah symlink, dan melewatkannya 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 [email protected] -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .