путаница в отношениях между inode и dentry в VFS (виртуальная файловая система), где отображается соответствие между именем файла и inode - PullRequest
0 голосов
/ 01 мая 2020

Существует множество объяснений и разделов книг, касающихся Linux Виртуальной файловой системы, в том числе здесь, в SOF. Но я все еще немного сбит с толку относительно связи между struct dentry и struct inode и отображением между именем файла и Inode.

Я думал, что dentry способ файловой системы для определения индекса, но в каждой ссылке, в которой я читал, говорится, что объект dentry находится в памяти, поэтому после перезапуска компьютера, как найти новый созданный файл?

Итак, когда вы создаете файл с путем / a / b / c, а затем хотите открыть этот файл, как его находит файловая система? если бы вы могли сослаться на объекты dentry и Inode в своем ответе

1 Ответ

0 голосов
/ 04 мая 2020

Файловая система состоит из двух основных блоков поведения:

  • Формат на диске, способ хранения хранимых данных на постоянном носителе.
  • Синхронизация между процессами, ядром код и аппаратные средства при доступе к хранимым данным.

Файловая система, такая как FAT32, имеет формат на диске, который может быть прочитан в Windows, Ma c и Linux - на Формат диска остается прежним, но часть синхронизации и доступа различается в разных операционных системах.

Форматы файловых систем на диске, такие как UFS и ext3, и, действительно, большинство Unix -бредных файловых систем определяют понятия "inode" и "Дентри". FAT32 и SMB этого не делают.

Тем не менее, Linux и другие ядра считают чрезвычайно полезным иметь общий код в разных форматах на диске, поэтому был создан уровень абстракции VFS. Этот уровень абстракции существует только в памяти; он не предписывает отдельным файловым системам ничего о формате на диске.

Однако абстракция VFS (API, который необходимо реализовать отдельными файловыми системами) определяет структуры данных, такие как struct inode и struct dentry - но они существуют только в памяти.

ext4, например, имеет довольно прямое отображение между inode in-memory и dentries на inode in-disk и dentries. Он имеет соответствующие struct ext4_inode (хранится в i_private) и struct ext4_dir_entry (хранится в d_fsdata).

Так что на ext4 поиск /a/b/c выполняется с помощью:

  • Получение root struct inode, который уже кэшируется в VFS во время монтирования
  • Запрос ext4 загрузить a из этого инода.
  • Содержимое инода представляет собой список (ну, возможно, более сложная структура данных) из ext4_dir_entry s - ext4 найдет правильную
  • ext4 посмотрит на номер инода ext4_dir_entry и загрузит ext4_inode в struct inode в кеше VFS.
  • Используя кэшированные struct inode и ext4_dir_entry, ext4 создаст struct dentry и вернет его в VFS.
  • VFS рассмотрит дентри inode и попросите ext4 загрузить с него b.
  • Процесс повторяется.

Обратите внимание, что абстракция VFS не соответствует 100% для ext4:

  • struct dentry не содержит номер индекса - индекс должен быть загружен
  • struct dentry кэширует тип индекса, тогда как ext4_dir_entry нет.
...