Bagaimana direktori diimplementasikan dalam sistem file Unix?

19

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?

Niklas
sumber
1
Apakah Anda tertarik pada sistem file tertentu?
Ignacio Vazquez-Abrams
3
Dalam UNIX, semuanya adalah file (kearifan bersejarah). Tetapi tidak setiap UNIX adalah Open Source. Gnu's Not Unix, Anda tahu? Open Solaris adalah Open Source Unix, sedangkan Linux hanyalah OS unixoid. :) Dan ya - filesystems - Reiserfs? Ext2-3-4? XFS? NFS?
pengguna tidak diketahui
2
Sebuah link adalah sebenarnya sebuah file, juga.
mattdm
5
Sebuah simbolik link file. Hard link adalah keunggulan dalam grafik sistem file.
dmckee
3
Iklan: Anda mungkin tertarik dengan proposal situs Pengembangan Sistem Operasi .
Gilles 'SO- berhenti menjadi jahat'

Jawaban:

22

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¹:

1167010 .
1158721 ..
1167626 subdir
 132651 barfile
 132650 bazfile

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 duadalah 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.

Stéphane Gimenez
sumber
Terima kasih atas elaborasi sehingga saya dapat memahami perbedaan antara direktori dan file di tingkat program.
Niklas
12

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]):

int mode = 0666;
char newdir[] = "/home/larry.user/xyzzy";
char path1[NAMESZ+4, path2[NAMESZ+4], *p;
mknod(newdir, S_IFDIR|mode);
strcpy(path1, newdir);
strcat(path1, "/."); /* "." link */
link(newdir, path1);
strcat(path1, ".");  /* ".." link */
strcpy(path2, newdir);
if ((p = strrchr(path2, '/') == (char *)0) /* root directory */
    link(".", path1);
else {
    *p = '\0';
    link(path2, path1);
}
  1. Haviland & Salama, "Pemrograman Sistem UNIX", 1987, pp69-71.

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 ".

Arcege
sumber
Terima kasih atas jawaban yang sangat menarik. Saya mengerti dan berpikir saya juga bisa mencari di sumber untuk program touchyang membuat file kosong dan melihat apa fungsinya.
Niklas
2

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. Ini dentry 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 untuk testmasuknya direktori root dan objek dentry ketiga untuk foomasuknya direktori tes.

Dimitri
sumber
Dimitri terima kasih. Saya ingin memahami mengapa beberapa proyek memilih struktur data tertentu seperti B-Tree, pohon biner, trie atau array asosiatif. Saya pikir ini penting untuk memilih strcture data yang sesuai / model data. Mempelajari berbagai implementasi memberikan detail yang saya cari.
Niklas
1

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".

jepret
sumber
Terima kasih untuk tautannya. Saya mengerti kedua file tersebut adalah direktori pada dasarnya adalah array yang dapat diartikan sebagai file atau direktori. Tolong koreksi saya jika saya salah ..
Niklas
1
Direktori secara tradisional hanya berupa file yang diformat secara khusus, tetapi itu tidak lagi benar: en.wikipedia.org/wiki/ReiserFS#Design Di ReiserFS dan beberapa yang lain, direktori adalah entri dalam database. Direktori dapat bertindak sebagai array, tetapi itu hanya abstraksi pemrograman.
Bruce Ediger
Terima kasih banyak telah menunjukkan detailnya. Sekarang saya pikir saya lebih mengerti bagaimana sistem file bekerja masih bertanya-tanya bagaimana dan mengapa program locateini bekerja dan bagaimana ini terkait dengan memperbarui program loc dengan menjalankan updatedb(spec saya menggunakan PC-BSD, DragonflyBSD dan Ubuntu Natty booting dari Live CDs dan membandingkan berbagai instalasi yang berbeda dan antarmuka)
Niklas