Mengapa direktori baru memiliki jumlah tautan 2 sebelum ada sesuatu yang ditambahkan?

38

Katakanlah saya baru saja membuat direktori newDirectory dan kemudian saya melakukan perintah ls -ld. Saya melihat bahwa jumlah tautan keras adalah 2. Apa yang sebenarnya membuat tautan keras 2 sejak awal? Juga apakah jumlah subdirektori dalam direktori saat ini sama dengan jumlah tautan keras - 2?

John
sumber

Jawaban:

39

Secara historis , sistem file Unix pertama menciptakan dua entri di setiap direktori: .menunjuk ke direktori itu sendiri, dan ..menunjuk ke induknya. Ini memberikan cara mudah untuk melintasi sistem file, baik untuk aplikasi maupun untuk OS itu sendiri.

Dengan demikian setiap direktori memiliki jumlah tautan 2 + n di mana n adalah jumlah subdirektori. Tautan adalah entri untuk direktori tersebut di induknya, .entri direktori itu sendiri , dan ..entri di setiap subdirektori. Misalnya, anggap ini isi dari subtree yang di-root di /parent, semua direktori:

/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3

Kemudian dirmemiliki jumlah tautan 5: direntri masuk /parent, .entri masuk /parent/dir, dan tiga ..entri di masing-masing /parent/dir/sub1, /parent/dir/sub2dan /parent/dir/sub3. Karena /parent/dir/sub1tidak memiliki subdirektori, jumlah tautannya adalah 2 ( sub1entri masuk /parent/dirdan .entri masuk /parent/dir/sub1).

Untuk meminimalkan jumlah casing khusus untuk direktori root, yang tidak memiliki induk yang "layak", direktori root berisi ..entri yang menunjuk ke direktori itu sendiri. Dengan cara ini, juga memiliki jumlah tautan 2 ditambah jumlah subdirektori, 2 sedang /.dan /...

Kemudian filesystem cenderung melacak direktori induk dalam memori dan biasanya tidak perlu .dan ..ada sebagai entri aktual; sistem unix modern yang khas memperlakukan .dan ..sebagai nilai khusus sebagai bagian dari kode sistem file-jenis-independen. Beberapa sistem file masih termasuk .dan ..entri, atau berpura-pura meskipun tidak ada yang muncul pada disk.

Sebagian besar filesystem masih melaporkan jumlah tautan 2 + n untuk direktori terlepas dari apakah .dan ..entri ada, tetapi ada pengecualian, misalnya btrf tidak melakukan ini.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
4
..menunjuk ke induk tidak memengaruhi jumlah tautan direktori saat ini. Hitungan 2 berasal dari .dan nama direktori (asli) mendaftar sendiri. Cara Anda mengatakannya agak ambigu, dan membuatnya terdengar seperti .dan ..keduanya. ..harus digunakan hanya untuk menjelaskan bagaimana matematika bekerja dengan 2+n:)
th3an0maly
@ th3an0maly Menunjuk ke orang tua memengaruhi jumlah tautan dari orang tua. Saya benar-benar tidak melihat bagaimana "entri .. dalam setiap subdirektori" ambigu, dan saya tidak mengerti apa yang Anda maksud dengan "daftar nama direktori itu sendiri".
Gilles 'SANGAT berhenti menjadi jahat'
Sebenarnya, jawaban ini: unix.stackexchange.com/a/101516/160264 adalah persis apa yang saya mengisyaratkan. Bacalah setelah saya membaca jawaban Anda, karena jawaban Anda adalah yang paling atas.
th3an0maly
@ th3an0maly Saya masih tidak tahu apa yang Anda mengisyaratkan. Bisakah Anda mengungkapkannya dengan jelas, alih-alih mengisyaratkan?
Gilles 'SANGAT berhenti menjadi jahat'
Jawaban @ goldilocks jelas. Yang ingin saya katakan adalah bahwa jawaban Anda bisa lebih seperti jawabannya. Tetapi kemudian saya belum membaca jawabannya ketika saya membaca jawaban Anda. Baris pertama adalah persis apa yang dikatakan komentar asli saya: "Ada satu untuk direktori itu sendiri, dan satu untuk .di dalamnya." Jika masih belum jelas bagi Anda, saya minta maaf saya tidak dapat menjelaskan lebih lanjut. Yang bisa saya lakukan lebih baik adalah menyalin + menempelkan jawabannya di sini di komentar.
th3an0maly
13

Ada satu untuk direktori itu sendiri, dan satu untuk .di dalamnya.

Juga apakah jumlah subdirektori dalam direktori saat ini sama dengan jumlah tautan keras - 2?

Itu masuk akal, karena setiap subdirektori membuat ..hardlink, dan di luar itu Anda tidak dapat membuat hardlink ke direktori. 1 Namun, saya tidak akan mempercayai ini untuk hal yang serius, esp. karena mudah untuk menghitung subdirektori dan mendapatkan bilangan real.

Jika Anda hanya melihat lsoutput untuk ide berapa banyak subs yang ada, maka itu memberi Anda ide yang layak.

1 Atau setidaknya, Anda tidak dapat melakukannya ln. Saya belum mencoba secara pemrograman, dan man 2 linkambigu - tidak ada kesalahan yang jelas untuk menautkan ke direktori, meskipun ada beberapa yang mungkin berlaku ( EMLINK, EPERM). Jadi, kecuali ada beberapa standar di suatu tempat yang mengatakan bahwa satu-satunya tautan keras ke direktori adalah .dan .., sekali lagi, saya hanya akan memperlakukan tautan keras itu sebagai petunjuk biasa.

goldilocks
sumber
2
Apakah tautan ke direktori diizinkan, dan apakah Anda dapat menghitung subdir dari jumlah tautan, keduanya bergantung pada sistem file mana yang Anda gunakan - beberapa memperbolehkan, beberapa tidak.
alanc
Perhatikan bahwa Time Machine macOS sebenarnya menghubungkan direktori dengan backup sebelumnya; dengan cara itu mereka dapat berpura-pura bahwa setiap cadangan tambahan adalah salinan lengkap, dan mereka dapat menghapus salah satu tambahan tanpa memengaruhi yang lainnya. Itu juga sangat rapuh, saya sedang bermain dengan itu menggunakan syscalls biasa dan saya benar-benar menyemprot sistem file saya.
w00t