GNU/Linux >> Belajar Linux >  >> Linux

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

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.

Terkait:Temukan file yang beberapa variasi pada nama file itu ada bersama di direktori yang sama?

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    .

Linux
  1. Linux – Mengapa Kami Menggunakan Su – Dan Bukan Hanya Su?

  2. Membuat Tautan Keras Direktori Secara Paksa?

  3. Linux – Direktori Standar Dan/atau Umum Pada OS Unix/linux?

  1. Tautan keras dan tautan lunak di Linux dijelaskan

  2. Linux – Apakah Kernel Linux/unix yang Berbeda Dapat Dipertukarkan?

  3. Cara Membuat Tautan Lunak dan Keras di Linux

  1. Linux – Mengapa Setuid Tidak Bekerja??

  2. Linux – Membuat Duplikat Jalur Di Unix?

  3. Apa itu Tautan Lunak dan Tautan Keras di Sistem File Linux