Pertanyaan saya adalah bagaimana direktori diimplementasikan? Saya bisa percaya struktur data seperti variabel misalnya tabel, array atau sejenisnya. Karena UNIX adalah Open Source, saya dapat melihat dalam sumber apa yang dilakukan program ketika ia membuat direktori baru. Bisakah Anda memberi tahu saya ke mana harus mencari atau menguraikan topik? Bahwa sebuah direktori "adalah" file yang dapat saya mengerti dan apakah sebuah direktori benar-benar sebuah file? Saya tidak yakin apakah itu benar bahwa file disimpan "dalam" file sementara masih dengan cara Anda bisa mengatakan kata file tentang hampir apa saja dan saya tidak yakin apa yang benar-benar bukan file karena Anda bisa memanggil bahkan variabel mengajukan. Misalnya tautan tentu bukan file dan tautan seperti direktori tetapi apakah ini melanggar bahwa direktori adalah file?
sumber
Jawaban:
Struktur internal direktori tergantung pada sistem file yang digunakan. Jika Anda ingin tahu persis apa yang terjadi, lihat implementasi filesystem.
Pada dasarnya, di sebagian besar sistem file, direktori adalah array asosiatif antara nama file (kunci) dan nomor inode (nilai). Sesuatu seperti ini¹:
Daftar ini dikodekan dalam beberapa cara - lebih atau kurang - efisien di dalam rantai blok (biasanya) 4KB. Perhatikan bahwa konten file biasa disimpan dengan cara yang sama. Dalam kasus direktori, tidak ada gunanya mengetahui ukuran mana yang sebenarnya digunakan di dalam blok ini. Itu sebabnya ukuran direktori yang dilaporkan
du
adalah kelipatan 4KB.Inode ada untuk mengikat blok bersama, membentuk satu entitas, yaitu 'file' dalam arti umum. Mereka diidentifikasi oleh nomor yang merupakan semacam alamat dan masing-masing biasanya disimpan sebagai satu blok khusus.
Manajemen semua ini terjadi dalam mode kernel. Perangkat lunak hanya meminta pembuatan direktori dengan fungsi bernama
int mkdir(const char *pathname, mode_t mode);
mengarah ke panggilan sistem, dan semua sisanya dilakukan di belakang layar.Tentang struktur tautan:
Tautan keras bukan file, itu hanya entri direktori baru (yaitu nama - nomor inode asosiasi ) yang merujuk pada entitas inode yang sudah ada ². Ini berarti inode yang sama dapat diakses dari nama path yang berbeda. Khususnya, karena metadatas (izin, kepemilikan, cap waktu ...) disimpan dalam inode, ini unik dan independen dari pathname yang dipilih untuk mengakses file.
Tautan simbolik adalah file dan berbeda dari targetnya. Ini berarti bahwa ia memiliki inode sendiri. Dulu ditangani seperti file biasa: jalur target disimpan dalam blok data. Tapi sekarang, untuk alasan efisiensi dalam filesystem ext baru-baru ini , jalur yang lebih pendek dari 60 byte disimpan dalam inode itu sendiri (menggunakan bidang yang biasanya digunakan untuk menyimpan pointer ke blok data).
-
1. ini diperoleh dengan menggunakan
ls -ai1 testdir
.2. tipe yang harus berbeda dari 'direktori' saat ini.
sumber
Untuk memperluas posting dari Stéphane Gimenez, membuat direktori baru adalah proses membuat inode baru dengan nilai st_mode S_IFDIR (dengan mode izin), membuat dua entri di blok data pertama inode baru dengan tautan ( 2) system call: '.' yang menunjuk ke inode baru ini dan '..' yang menunjuk ke direktori induk, kemudian membuat entri di direktori induk dengan inode dan nama direktori baru - bagian pertama dan terakhir dilakukan oleh sistem panggilan mknod ( 2). Juga, hanya root yang dapat menggunakan mknod (2) hari ini untuk tugas-tugas seperti yang sedang kita bicarakan.
Sebagai contoh,
mkdir("/home/larry.user/xyzzy", 0666)
pada dasarnya adalah sebagai berikut (ini adalah kode C dari SysV hari [1]):Ini terlalu rentan kesalahan (dan salah satu alasan utama fsck) sehingga panggilan sistem mkdir (2) dibuat untuk dapat melakukan ini untuk Anda.
Perhatikan bahwa objek sistem file amy dapat dibuat dengan mknod (2): file biasa, direktori, file perangkat, symlink, dll. Jadi untuk menjawab salah satu pertanyaan OP, ya, direktori adalah file, yang berarti mengatakan, "itu adalah sebuah objek, diwakili oleh sebuah inode, berada dalam sistem file yang berperilaku dengan antarmuka i / o ".
sumber
touch
yang membuat file kosong dan melihat apa fungsinya.jika Anda ingin memiliki informasi lebih lanjut tentang sistem file Unix / Linux, saya sarankan Anda 2 buku Memahami Kernel Linux dan Pengembangan Kernel Linux . Itu adalah buku-buku terbaik untuk memahami kernel Linux.
Dalam sistem Unix "Common File Model", setiap direktori dianggap sebagai file, yang berisi daftar file dan direktori.
Dalam VFS (Sistem File Virtual), direktori direpresentasikan dalam struktur yang disebut
dentry
. Inidentry
adalah struktur C dengan nama string ( d_name ), pointer ke inode ( d_inode ) dan pointer ke dentry induk ( d_parent ). Inode adalah struktur untuk menangani informasi tentang file di sistem file. Misalnya, jika Anda memiliki direktori/tmp/test/foo
, VFS akan membuat objek dentry untuk setiap komponen dalam pathname. Jadi, itu akan membuat objek dentry untuk/
, objek dentry kedua untuktest
masuknya direktori root dan objek dentry ketiga untukfoo
masuknya direktori tes.sumber
Anda bisa mulai dengan membaca http://www.freebsd.org/doc/en/books/design-44bsd/book.html#OVERVIEW-FILESYSTEM . Untuk lebih jelasnya, dapatkan buku klasik yang sangat bagus "Desain dan Implementasi Sistem Operasi 4.4 BSD".
sumber
locate
ini bekerja dan bagaimana ini terkait dengan memperbarui program loc dengan menjalankanupdatedb
(spec saya menggunakan PC-BSD, DragonflyBSD dan Ubuntu Natty booting dari Live CDs dan membandingkan berbagai instalasi yang berbeda dan antarmuka)