Pada Unix, biasanya, file adalah beberapa entri dalam daftar file. Ada berbagai jenis file: file biasa, perangkat, tautan simbolik, pintu, pipa, soket, direktori ...
Nomor inode (yang dapat Anda lihat di output ls -i
) adalah indeks dalam tabel itu.
Sekarang, Anda tidak mengakses file dengan inode tetapi dengan path . Sebuah jalan adalah rantai direktori entri. Anda akan melihat kita tidak berbicara tentang folder tetapi direktori di sini. Karena itu adalah direktori (pikirkan direktori telepon).
Direktori adalah jenis file khusus yang memberi nama ke sejumlah inode. Entri direktori adalah pemetaan dari nama ke inode.
File yang diberikan (sebuah inode) dapat memiliki lebih dari satu nama dalam satu direktori (sama seperti ada lebih dari satu nama di nomor telepon), dan juga dapat memiliki nama (entri) di lebih dari satu direktori. Itu disebut tautan yang juga dikenal sebagai tautan keras untuk dibedakan dengan tautan lunak (jenis file khusus yang merupakan penunjuk jalan).
File (inode) melacak jumlah tautan (entri dalam direktori apa pun) yang dimilikinya, sehingga ketika jumlahnya mencapai 0 (ketika sedang diputuskan tautannya dari direktori terakhir yang direferensikan di dalamnya), ia tidak dialokasikan.
Itu angka itu (jumlah tautan) yang ditampilkan di ls -l
output.
Ketika file non-direktori dibuat pertama kali (dengan open
atau creat
(atau bind
atau mknod
untuk beberapa jenis file) panggilan sistem), hal itu dilakukan dengan menyediakan dengan path ke file baru (seperti "/a/b"
). Apa yang terjadi kemudian adalah file baru dan inode dialokasikan dan entri baru ditambahkan ke direktori yang terkait dengan "a"
nama di "/"
direktori root. Itulah tautan awal sehingga jumlah tautannya satu.
Lebih banyak tautan dapat ditambahkan nanti dengan link()
system call ( ln
perintah). Dan tautan bisa dihapus dengan unlink()
system call ( rm
perintah).
Anda akan melihat bahwa file-file dari direktori jenis umumnya memiliki jumlah tautan yang lebih besar atau sama dengan 2.
Sekarang, ketika Anda membuat direktori, Anda memanggil mkdir()
panggilan sistem. Sesuatu seperti mkdir("/a/b")
. Apa yang dilakukannya kemudian mengalokasikan file baru dari direktori tipe. Di direktori baru itu, secara otomatis membuat dua entri:
"."
( titik untuk direktori ). Yang merupakan tautan ke dirinya sendiri. Jadi jumlah tautannya sekarang 1.
".."
(untuk direktori 's direktori ). Yang merupakan tautan ke "/a"
. Jadi jumlah tautan "/a"
bertambah satu
Kemudian direktori baru itu ditautkan ke "/a"
(entri ditambahkan "/a"
untuk itu), sehingga jumlah tautannya sekarang 2. Jika "/a/b/c"
direktori dibuat, karena ".."
entri tersebut "/a/b/c"
, jumlah tautan "/a/b"
akan menjadi 3.
Kebanyakan Unices membatasi pembuatan tautan lebih lanjut ke direktori karena mereka dapat menyebabkan loop bermasalah. Ketika mereka mengizinkan link()
pada direktori, umumnya hanya superuser yang bisa melakukannya.
Beberapa sistem file suka btrfs
bertolak dari struktur direktori tradisional itu. Anda akan melihat bahwa penghitungan tautan pada direktori dalam btrfs
sistem file selalu sama meskipun direktori tersebut memang berisi "."
entri dengan nomor inode yang sama dengan yang ada di dalamnya.
Fakta bahwa penghitungan tautan secara tradisional 2 ditambah jumlah subdir telah digunakan. Misalnya, di:
find . -name '*.c' -print
Jika .
tidak mengandung subdir tetapi mengandung jutaan file. Dengan memeriksa jumlah tautan .
, find
dapat diketahui bahwa tidak ada subdir. Jadi yang find
harus dilakukan adalah membaca konten direktori dan melaporkan entri yang berakhir .c
(seperti grep '\.c$'
pada beberapa file megabyte, bukan masalah besar). Kalau tidak, find
harus memeriksa jenis setiap file tunggal untuk melihat apakah ada direktori untuk turun di sana (menghasilkan banyak lstat()
panggilan sistem). Tentu saja, optimasi semacam ini tidak berfungsi btrfs
(walaupun dalam Linux versi modern, tipe file juga disimpan dalam entri direktori untuk beberapa sistem file (termasuk btrfs
) dan dikembalikan oleh getdents(2)
system call yang digunakan untuk mengambil daftar entri. dalam direktori, jadilstat
masih tidak perlu).