У меня вопрос, как каталоги реализованы? Я могу поверить, что структура данных, как переменная, например, таблица, массив или подобное. Поскольку UNIX является открытым исходным кодом, я могу посмотреть в исходном коде, что делает программа, когда она создала новый каталог. Можете ли вы сказать мне, где искать или уточнить тему? Что каталог "это" файл, который я мог понять, и действительно ли каталог является файлом? Я не уверен, что это правда, что файлы хранятся «в» файлах, в то время как вы можете сказать слово файл почти обо всем, и я не уверен, что это абсолютно не файл, так как вы могли бы назвать даже переменную a файл. Например, ссылка, конечно, не файл, а ссылка похожа на каталог, но тогда это нарушает, что каталог является файлом?
19
Ответы:
Внутренняя структура каталогов зависит от используемой файловой системы. Если вы хотите точно знать, что происходит, взгляните на реализации файловой системы.
По сути, в большинстве файловых систем каталог представляет собой ассоциативный массив между именами файлов (ключами) и номерами (значениями) узлов. Как то так
Этот список закодирован некоторым - более или менее эффективным способом - внутри цепочки (обычно) блоков по 4 КБ. Обратите внимание, что содержимое обычных файлов хранится аналогично. В случае каталогов нет смысла знать, какой размер фактически используется внутри этих блоков. Вот почему размеры каталогов, о которых сообщается
du
, кратны 4 КБ.Иноды существуют для того, чтобы связать блоки вместе, образуя единый объект, а именно «файл» в общем смысле. Они идентифицируются по номеру, который является своего рода адресом, и каждый из них обычно хранится в виде отдельного специального блока.
Управление всем этим происходит в режиме ядра. Программное обеспечение просто запрашивает создание каталога с именем функции,
int mkdir(const char *pathname, mode_t mode);
ведущей к системному вызову, а все остальное выполняется за кулисами.О структуре ссылок:
Жесткая ссылка - это не файл, это просто новая запись в каталоге (т. Е. Связь имени с номером инода ), относящаяся к существующей сущности инода2. Это означает, что к одному и тому же иноду можно обращаться с разных путей. В частности, поскольку метаданные (права доступа, владение, метки времени ...) хранятся в inode, они уникальны и не зависят от пути, выбранного для доступа к файлу.
Символическая ссылка - это файл, и он отличается от своей цели. Это означает, что у него есть свой собственный инод. Раньше он обрабатывался как обычный файл: целевой путь хранился в блоке данных. Но теперь, из соображений эффективности в последних файловых системах ext , пути длиной менее 60 байтов хранятся в самом inode (используя поля, которые обычно используются для хранения указателей на блоки данных).
-
1. это было получено с помощью
ls -ai1 testdir
.2. чей тип должен отличаться от 'directory' в наше время.
источник
Чтобы раскрыть сообщение от Стефана Гименеса, создание нового каталога - это процесс создания нового инода со значением st_mode S_IFDIR (в режиме разрешений), создание двух записей в первом блоке данных нового инода со ссылкой ( 2) системный вызов: '.' который указывает на этот новый индекс и '..', который указывает на родительский каталог, затем создает запись в родительском каталоге с индексом и именем нового каталога - первая и последняя часть выполняются системным вызовом mknod ( 2). Кроме того, только root может использовать mknod (2) в наши дни для таких задач, о которых мы говорим.
Например,
mkdir("/home/larry.user/xyzzy", 0666)
по сути, следующее (это был код C из SysV days [1]):Это было слишком подвержено ошибкам (и одной из основных причин fsck), поэтому системный вызов mkdir (2) был создан, чтобы сделать это за вас.
Обратите внимание, что любой объект файловой системы может быть создан с помощью mknod (2): обычный файл, каталог, файл устройства, символическая ссылка и т. Д. Поэтому, чтобы ответить на один из вопросов ОП, да, каталог - это файл, что означает: «он является объектом, представленным inode, находящимся в файловой системе, которая работает с интерфейсом ввода / вывода ".
источник
touch
которая создает пустой файл, и посмотреть, что он делает.если вы хотите получить больше информации о файловых системах Unix / Linux, я рекомендую вам две книги « Понимание ядра Linux и разработка ядра Linux» . Это лучшие книги для понимания ядра Linux.
В Unix-системах «Common File Model» каждый каталог рассматривается как файл, который содержит список файлов и каталогов.
В VFS (виртуальные файловые системы) каталоги представлены в виде структуры
dentry
. Этоdentry
структура C с именем строки ( d_name ), указателем на inode ( d_inode ) и указателем на родительский dentry ( d_parent ). Inode - это структура для обработки информации о файле в файловой системе. Например, если у вас есть каталог/tmp/test/foo
, VFS создаст объект dentry для каждого компонента в имени пути. Таким образом, он создаст объект dentry для/
второго объекта dentry дляtest
входа в корневой каталог и третий объект dentry дляfoo
входа в тестовый каталог.источник
Вы можете начать с чтения http://www.freebsd.org/doc/en/books/design-44bsd/book.html#OVERVIEW-FILESYSTEM . Для получения более подробной информации получите отличную классическую книгу «Разработка и внедрение операционной системы 4.4 BSD».
источник
locate
работает и как это связано с обновлением программы locate при запускеupdatedb
(в частности, я использую загрузку с PC-BSD, DragonflyBSD и Ubuntu Natty с Live CD и сравнение различных установок. и интерфейсы)