Файловая система состоит из двух основных блоков поведения:
- Формат на диске, способ хранения хранимых данных на постоянном носителе.
- Синхронизация между процессами, ядром код и аппаратные средства при доступе к хранимым данным.
Файловая система, такая как 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
нет.