Як реалізуються каталоги у файлових системах Unix?


19

Моє запитання - як реалізуються каталоги? Я можу вірити такій структурі даних, як змінна, наприклад, таблиця, масив чи подібні. Оскільки UNIX є відкритим кодом, я можу подивитися у джерелі, що робить програма, коли створила новий каталог. Чи можете ви сказати мені, де шукати чи детально розглянути тему? Що каталог "є" файл, який я міг зрозуміти, і чи справді це каталог? Я не впевнений, що це правда, що файли зберігаються у "in" файлах, поки все ще в дорозі ви можете сказати слово файл майже нічого, і я не впевнений, що абсолютно не є файлом, оскільки ви можете назвати навіть змінну a файл. Наприклад, посилання, безумовно, не є файлом, а посилання - як каталог, але це порушує те, що каталог - це файл?


1
Вас цікавлять якісь конкретні файлові системи?
Ігнасіо Васкес-Абрамс

3
У UNIX все - файл (історична мудрість). Але не кожен UNIX є відкритим кодом. Ви не знаєте, Gnu's Unix? Open Solaris є відкритим вихідним кодом Unix, а Linux - це лише однокласна ОС. :) І так - файлові системи - Reiserfs? Ext2-3-4? XFS? NFS?
користувач невідомий

2
Посилання є на насправді файл теж.
mattdm

5
Символічна посилання є файлом. Міцним посиланням є край графіка файлової системи.
dmckee

3
Реклама: Вас може зацікавити пропозиція щодо розробки сайту операційних систем .
Жил "ТАК - перестань бути злим"

Відповіді:


22

Внутрішня структура каталогів залежить від використовуваної файлової системи. Якщо ви хочете точно знати, що відбувається, ознайомтеся з реалізаціями файлової системи.

В основному, у більшості файлових систем каталог - це асоціативний масив між назви файлів (клавіш) та номерами inodes (значеннями). Щось подібне¹:

1167010 .
1158721 ..
1167626 subdir
 132651 barfile
 132650 bazfile

Цей список кодується деяким - більш-менш ефективним способом всередині ланцюга (зазвичай) блоків 4 КБ. Зауважте, що вміст звичайних файлів зберігається аналогічно. Що стосується каталогів, немає сенсу дізнатися, який розмір використовується в цих блоках. Ось чому розміри каталогів, про duякі повідомляє , кратні 4 КБ.

Inodes є для того, щоб зв'язати блоки разом, утворюючи єдине ціле, а саме "файл" у загальному розумінні. Вони ідентифікуються за номером, який є якоюсь адресою, і кожен з них зазвичай зберігається як єдиний спеціальний блок.

Управління всім цим відбувається в режимі ядра. Програмне забезпечення просто вимагає створити каталог з функцією, названою що int mkdir(const char *pathname, mode_t mode);веде до системного виклику, а все інше виконується за кадром.

Про структуру посилань:

Жорстке посилання - це не файл, це лише новий запис у каталозі (тобто ім'я - асоціація номерів inode ), що стосується попередньо існуючого об'єкта inode². Це означає, що один і той же індед можна отримати з різних імен. Зокрема, оскільки метадані (дозволи, право власності, часові позначки ...) зберігаються в inode, вони унікальні і не залежать від імені шляху, обраного для доступу до файлу.

Символічне посилання - це файл, який відрізняється від його цілі. Це означає, що у нього є своя інеда. З цим раніше оброблялося як звичайний файл: цільовий шлях зберігався в блоці даних. Але тепер, з метою ефективності в останніх файлових системах ext , шляхи довжиною менше 60 байт зберігаються всередині самої inode (використовуючи поля, які зазвичай використовуються для зберігання покажчиків у блоки даних).

-
1. це було отримано за допомогою ls -ai1 testdir.
2. тип якого в даний час повинен відрізнятися від «каталогу».


Дякую за розробку, щоб я міг зрозуміти різницю між каталогами та файлами на програмному рівні.
Ніклас

12

Для розширення публікації від Stéphane Gimenez створення нового каталогу - це процес створення нового inode зі значенням st_mode S_IFDIR (у режимі дозволів), створення двох записів у першому блоці даних нового inode із посиланням ( 2) системний виклик: '.' який вказує на цей новий inode і "..", який вказує на батьківський каталог, потім створюється запис у батьківському каталозі з inode та назвою нового каталогу - перша і остання частина виконуються системним викликом mknod ( 2). Крім того, тільки root може використовувати mknod (2) в наші дні для таких завдань, про які ми говоримо.

Наприклад, mkdir("/home/larry.user/xyzzy", 0666)по суті таке (це був C код від SysV днів [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, "Систематичне програмування UNIX", 1987, pp69-71.

Це було занадто схильне до помилок (і одна з головних причин fsck), тому було створено системний виклик mkdir (2), щоб мати можливість це зробити для вас.

Зауважте, що об'єкт файлової системи Емі міг бути створений за допомогою mknod (2): звичайний файл, каталог, файл пристрою, посилання на символи тощо. Отже, щоб відповісти на одне із запитань ОП, так, каталог - це файл, який означає сказати: "це є об'єктом, представленим inode, що знаходиться у файловій системі, яка поводиться з інтерфейсом вводу-виводу ".


Дякую за дуже цікаву відповідь. Я розумію і думаю, що я також можу заглянути в джерело програми, touchяка створює порожній файл і побачити, що він робить.
Ніклас

2

якщо ви хочете отримати додаткову інформацію про файлові системи Unix / Linux, рекомендую вам 2 книги Розуміння ядра Linux та розробки ядра Linux . Це найкращі книги для розуміння ядра Linux.

У системах "Загальна модель файлу" Unix кожен каталог вважається файлом, який містить список файлів і каталогів.

У VFS (Virtual File Systems) каталоги представлені у структурі, що називається dentry. dentry Являє собою З структуру з ім'ям рядка ( d_name ), покажчик на індексний дескриптор ( d_inode ) і покажчик на батьківський dentry ( d_parent ). Інод - це структура для обробки інформації про файл у файловій системі. Наприклад, якщо у вас є каталог /tmp/test/foo, VFS створить об'єкт зубного ряду для кожного компонента в імені шляху. Таким чином, він створить об'єкт зубного ряду для /, другий об'єкт зубного ряду для testвведення кореневого каталогу та третій об'єкт зубного ряду для fooвведення тестового каталогу.


Дякую, Димитрі. Я хочу зрозуміти, чому якийсь проект обрав конкретну структуру даних, як B-Дерево, бінарне дерево, трие або асоціативний масив. Я думаю, що важливо вибрати відповідну структуру даних / модель даних. Дізнавшись про різні реалізації, я даю деталі, які я шукаю.
Ніклас

1

Ви можете почати, прочитавши http://www.freebsd.org/doc/en/books/design-44bsd/book.html#OVERVIEW-FILESYSTEM . Для отримання більш детальної інформації дивіться чудову класичну книгу "Розробка та впровадження операційної системи 4.4 BSD".


Дякуємо за посилання Я розумію, що обидва файли - це каталоги, в основному це масиви, які трактуються як файли чи каталоги. Будь ласка, виправте мене, якщо я помиляюся ..
Niklas

1
Довідники традиційно - це лише спеціально відформатовані файли, але це вже не так: en.wikipedia.org/wiki/ReiserFS#Design In ReiserFS та деякі інші, каталоги - це записи в базі даних. Каталоги можуть виступати як масиви, але це лише абстракція програмування.
Брюс Едігер

Дуже дякую за вказівку деталей. Тепер я думаю, що я більше розумію, як файлові системи працюють, все ще цікаво, як і чому програма locateпрацює, і як це пов’язано з оновленням програми пошуку за допомогою запуску updatedb(в специфікаціях я використовую завантаження PC-BSD, DragonflyBSD і Ubuntu Natty з живих компакт-дисків та порівняльного аналізу різних установок та інтерфейси)
Ніклас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.