Внутренняя структура каталогов зависит от используемой файловой системы. Если вы хотите точно знать, что происходит, взгляните на реализации файловой системы.
По сути, в большинстве файловых систем каталог представляет собой ассоциативный массив между именами файлов (ключами) и номерами (значениями) узлов. Как то так
1167010 .
1158721 ..
1167626 subdir
132651 barfile
132650 bazfile
Этот список закодирован некоторым - более или менее эффективным способом - внутри цепочки (обычно) блоков по 4 КБ. Обратите внимание, что содержимое обычных файлов хранится аналогично. В случае каталогов нет смысла знать, какой размер фактически используется внутри этих блоков. Вот почему размеры каталогов, о которых сообщается du
, кратны 4 КБ.
Иноды существуют для того, чтобы связать блоки вместе, образуя единый объект, а именно «файл» в общем смысле. Они идентифицируются по номеру, который является своего рода адресом, и каждый из них обычно хранится в виде отдельного специального блока.
Управление всем этим происходит в режиме ядра. Программное обеспечение просто запрашивает создание каталога с именем функции, int mkdir(const char *pathname, mode_t mode);
ведущей к системному вызову, а все остальное выполняется за кулисами.
О структуре ссылок:
Жесткая ссылка - это не файл, это просто новая запись в каталоге (т. Е. Связь имени с номером инода ), относящаяся к существующей сущности инода2. Это означает, что к одному и тому же иноду можно обращаться с разных путей. В частности, поскольку метаданные (права доступа, владение, метки времени ...) хранятся в inode, они уникальны и не зависят от пути, выбранного для доступа к файлу.
Символическая ссылка - это файл, и он отличается от своей цели. Это означает, что у него есть свой собственный инод. Раньше он обрабатывался как обычный файл: целевой путь хранился в блоке данных. Но теперь, из соображений эффективности в последних файловых системах ext , пути длиной менее 60 байтов хранятся в самом inode (используя поля, которые обычно используются для хранения указателей на блоки данных).
-
1. это было получено с помощью ls -ai1 testdir
.
2. чей тип должен отличаться от 'directory' в наше время.