Билет 06 - honeycarbs/bmstu-os-6sem GitHub Wiki
Файловая система, задачи файловой системы и иерархическая организация ФС. Файловая подсистема LINUX: поддержка большого числа файловых систем и структура, описывающая файловую систему. VFS: четыре основные структуры файловой системы и связь между ними. Раздел жесткого диска и суперблок. Структура struct super_operations. Монтирование файловой системы, команда mount и функции монтирования и их параметры, точка монтирования – корневой каталог и inode. Пример (лаб. раб.)
Задачи файловой системы и иерархическая организация ФС.
Файловая система - порядок, определяющий способ организации, хранения, именования и доступа к данным на вторичных носителях информации.
Любая ФС имеет иерархическую структуру, это связано с разными уровнями ФС, т.к. различные задачи, которые ей решаются, выполняются на разных уровнях ОС. Именование файлов (символьный уровень) - самый высокий уровень ФС. Он позволяет пользователю в удобной форме задавать имена файлов и искать их в каталогах.

Символьный уровень Это уровень именования файлов. Сюда входит организация каталогов, подкаталогов.
В Unix/Linux имя файла не является его идентификатором. Один и тот же файл может иметь множество имён (было дело, когда создавали хардлинки). Это делалость для того, чтобы к одному и тому же файлу можно было получать доступ из разных директорий. Файлы в системе идентифицируются с помощью структур inode.
Базовый уровень Это уровень формирования дескриптора файлов. Должны быть соответствующие структуры, позволяющие хранить необходимую для файла информацию.
В ядре существует два типа inode (Index Node): дисковый и ядрёный. Чтобы получить доступ к файлу требуется перейти с символьного уровня к номеру inode, которым и идентифицируется в системе файл.
Обоснованием использования двух типов inode в системе является факт того, что Unix изначально создавалась как система которая поддерживает очень большие файлы. Для того чтобы адресовать данные которые находятся в этих файлах, необходимо иметь соответствующие структуры. Так как именно inode как сейчас принято говорить, является дескриптором файла, то такая информация должна храниться в дисковом inode.
В inode ядра такая информация не нужна, но нужна информация, которая обеспечивает нахождение файла, принадлежность к файловой системе, к каталогам и подкаталогам.
Проверка прав доступа
У каждого файла существуют права доступа. Эти права отдельно устанавливаются для пользователя, для группы пользователей и для остального мира. (команда chmod)
Логический уровень
Логическое адресное простраство файла аналогичено адресному пространству процесса: оно начинается с нулевого адреса и представляет собой непрерывную последовательность адресов.
Логический уровень позволяет обеспечить доступ к данным хранящимся в файле в формате, который отличается от формата их физического хранения. Фактически в результате запроса на запись или чтение данных из файла этот запрос преобразуется в запрос на физическую последовательность байтов. Структурами данных, записываемых в файл, управляет пользователь, система данные, записываемые в файл, никак не интерпретирует. Например, в бинарные файлы мы можем записывать объявленную в программе структуру, и только в этой программе определены размеры и назначение этих полей данных. С текстовыми файлами всё несколько иначе, так как информация хранится в виде символов, то текстовый файл может быть открыт, прочитан, отредактирован в любом текстовом редакторе.
Системы Windows и Unix/Linux поддерживают два типа файлов: байт-ориентированные и блок-ориентированные. Это вытекает из существования двух типов внешних устройств: символьных и блочных. (В настоящее время появились еще сетевые устройства)
Физический уровень Это уровень хранения и доступа к данным.
Задачи:
- собственно именование файлов – присвоение файлам уникальных идентификаторов, с помощью которых обеспечивается доступ к файлам
- обеспечение программного интерфейса для работы с файлами пользователей и приложений
- отображение логической модели (представления) файлов на физическую организацию хранения данных на внешних носителях.
- обеспечение длительного хранения файлов, доступа к ним, обеспечение защиты от несанкционированного доступа к ним.
- обеспечение совместного использования файлов
Файловая подсистема LINUX: поддержка большого числа файловых систем и структура, описывающая файловую систему.
ФС UNIX организована через интерфейс VFS/vnode. В Linux не определена vnode, только VFS. Задача vnode - ОС без изменений ядра могла поддерживать большое кол-во самых разных ФС.

Современные ФС поддерживают т.н. очень большие файлы. Проводится аналогия с управлением памятью страницами по запросу. Это означает, что любая страница адресного пространства процесса может быть загружена в любую страницу физической памяти. Для того, чтобы управлять этим, существуют таблицы страниц. Аналогично современные ФС обеспечивают хранение файлов вразброс, т.е. файл не занимает на диске непрерывную последовательность адресов. Это обеспечивается хранением адресов блоков.
Возможность поддержки большого количества разных ФС реализуется засчет того, что в состав системы входит слой абстракции над собственным низкоуровневым интерфейсом ФС. Для этого ВФС предоставляет общую файловую модель, которая способна отображать общие возможности и поведение любой возможной ФС.
Такой уровень абстракции работает на основе базовых концептуальных интерфейсов и структур данных, которые поддерживаются конкретными ФС. Фактически код любой ФС скрывает детали реализации непосредственной работы с данными, организованными в файлы, а именно предоставляют пользователю набор API, таких как открыть файл, прочить, удалить и т.д. В любом варианте любая ФС поддерживает такие понятия как файл, каталог, и действия, определенные над ними.
struct superblock - суперблок Суперблок - контейнер для высокоуровневых метаданных о ФС. Структура находится на диске и для надежности хранится в нескольких местах. В структуре хранятся управляющие параметры ФС (такие как суммарное число блоков, свободное число блоков, корневой inode и т.д.).
В системе существует суперблок на диске и суперблок в оперативной памяти. Суперблок на диске хранит информацию, необходимую системе для доступа к физическому файлу, т.е. хранит информацию о структуре ФС. Суперблок в памяти предоставляет информацию, необходимую для управления смонтированной ФС
Для создания файловой системы потребуется выделить раздел - то есть выделить объём вторичной памяти для хранения данных файловой системы. Суперблок описывает данный раздел.
struct superblock
{
struct list_head s_list; // обеспечивает организацию связного списка
dev_t s_dev; // информация об устройстве, на котором находится файловая система
unsigned char s_block_size_bits; // размер блока в битах
unsigned long s_block_size_size; // размер блока в байтах
loff_t s_maxbytes; // максимально возможный размер файла
struct file_system_types *s_type; // тип файловой системы (один тип)
const struct super_operations *s_op; // все операции, определенные на суперблоке
...
unsigned long s_flags; // флаги монтирования
...
unsigned long s_magic; // магическое число для доступа к суперблоку
struct dentry *s_root; // точка монтирования
...
int s_count; // счетчик ссылок на суперблок
struct list_head s_mounts; // список монтирований
struct block_device *s_bdev; // связанное блочное устройство
char s_id[32]; // символьное имя
...
fmode_t s_mode; // права доступа для монтирования
...
const struct dentry_operations *s_d_op; // в этом суперблоке операции над структурой dentry
...
struct list_head s_inodes; // список всех inode'ов
...
}
struct inode - индексный узел
inode содержит информацию о файле. Каждый файл имеет один inode, но может иметь несколько имен, то есть жестких ссылок (hardlink).
Для получения доступа к файлу система ищет номер inode в таблице inode-ов.
Индексный дескриптор существует двух форматов в системе: дисковый inode и inode ядра. Очевидно что они описывают один и тот же файл, но информация в inode ядра актуальна для ядра, для динамического обращения. Дисковый inode, кроме информации о файле, о его типе, параметрах прав доступа, должен содержать информацию, которая позволяет адресовать информацию, которая хранится в данном файле.
inode-кэш состоит из: глобального кэша массивов, глобального списка inode-in-use, глобального списка inode_unused, списка изменённых inode-ов, SLAB cache inode_chache.
struct inode
{
umode_t i_mode; //права доступа
unsigned short i_opflags;
kuid_t i_uid;
kgid_t i_gid;
unsigned int i_flags;
...
const struct inode_operations *i_op; /* указатель на ту таблицу операций с индексом к
оторые определены в конкретной системе для работы с этим индексом.
Такая структура создаётся для конкретной файловой системы */
struct super_block *i_sb; /*указатель на связаный суперблок, так как именно он хранит информацию об inode данной файловой системы. */
struct address_space *i_mapping;
...
unsigned long i_ino;
union
{
const unsigned int i_nlink;
unsigned int _i_nlink;
};
...
struct list_head i_lru; /*inode LRU list. LRU используется для inode. Если открыли файл, то очень вероятно что вы будете работать с этим файлом.*/
...
union{
struct hlist_head i_dentry;
struct rcu_head i_rcu;
};
...
atomic_t i_count; /* счётчик ссылок */
...
atomic_t i_writecount; /*счётчик исп-я для записи */
...
count struct file_operations *i_top;
struct address_space i_data;
struct list_head i_devices; /* список блочных устройств */
...
}
struct dentry (от directory entry) - элемент каталога
VFS реализует системные вызовы open, stat, chmod и аналогичные. Переданный им аргумент pathname используется VFS для поиска в кэше записей каталога или в кэше dentry, который называется dcache. Это обеспечивает очень быстрый механизм поиска для перевода пути (имени файла) в конкретный dentry. Dentries находятся в RAM и никогда не сохраняются на диск: они существуют только для увеличения производительности.
Структура dentry содержит указатель на суперблок и это корневой каталог дерева директорий.
struct file - файл Для всех ФС существует общие понятия: файлы, каталоги. Также все ФС поддерживают действия, определённые на файлах: создание, удаление, переименования, закрытие, открытие. Таким образом в Unix/Linux определён стандартный интерфейс виртуальной файловой системы.
Связь структур:
