Sebuah file (kurang lebih) adalah tiga hal yang terpisah:
- Sebuah "inode", struktur metadata yang melacak pemilik file, izin, dan daftar blok pada disk yang benar-benar berisi data.
- Satu atau lebih entri direktori (nama file) yang mengarah ke inode tersebut
- Blok data itu sendiri
Saat Anda membuat file kosong, Anda hanya membuat inode dan entri direktori yang menunjuk ke inode tersebut. Sama untuk file jarang (dd if=/dev/null of=sparse_file bs=10M seek=1
).
Saat Anda membuat hardlink ke file yang sudah ada, Anda cukup membuat entri direktori tambahan yang mengarah ke inode yang sama.
Saya telah menyederhanakan banyak hal di sini, tetapi Anda mengerti.
touch
akan membuat inode , dan ls -i
atau stat
akan menampilkan info tentang inode:
$ touch test
$ ls -i test
28971114 test
$ stat test
File: ‘test’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fc01h/64513d Inode: 28971114 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/1000) Gid: ( 1000/1000)
Access: 2017-03-28 17:38:07.221131925 +0200
Modify: 2017-03-28 17:38:07.221131925 +0200
Change: 2017-03-28 17:38:07.221131925 +0200
Birth: -
Perhatikan bahwa test
menggunakan 0 blok. Untuk menyimpan data yang ditampilkan, inode menggunakan beberapa byte. Byte tersebut disimpan di tabel inode. Lihatlah halaman ext2 untuk contoh struktur inode.
ls
(atau juga, stat(2)
panggilan sistem) memberi tahu Anda ukuran konten file. Berapa banyak ruang yang dibutuhkan sistem file untuk pembukuan bukan bagian dari itu, dan sebagai detail implementasi, itu bukan sesuatu yang harus program secara umum peduli atau bahkan tahu tentang. Membuat detail implementasi terlihat akan membuat abstraksi sistem file menjadi kurang berguna.