Исконной файловой системой UNIX является s5fs. Файловая система FFS появилась позже, она обладает лучшей производительностью, функциональностью и надежностью. Файловые системы современных версий UNIX используют базовые идеи, заложенные в системах s5fs и FFS, которые и сегодня поддерживаются в большинстве версий UNIX.
Каждый жесткий диск состоит из одной или нескольких логических частей, называемых разделами (partitions). В UNIX разделы выступают в качестве независимых устройств, доступ к которым осуществляется как к различным носителям данных. Каждый раздел имеет свою файловую систему. Файловая система s5fs занимает раздел диска и состоит из трёх основных компонентов:
· суперблок. Содержит общую информацию о файловой системе;
· массив индексных дескрипторов (ilist). Содержит метаданные всех файлов файловой системы. Индексный дескриптор содержит статусную информацию о файле и указывает на расположение данных этого файла. Ядро обращается к inode по индексу в массиве ilist. Один inode является корневым (root) inode файловой системы, через него обеспечивается доступ к структуре каталогов и файлов. Размер массива ilist является фиксированным и задается при создании файловой системы. Таким образом, файловая система s5fs имеет ограничения по числу файлов, которые могут в ней храниться, независимо от размера этих файлов;
· Блоки хранения данных – занимают большую часть дискового раздела, и их число определяет максимальный суммарный объем данной файловой системы. Размер блока кратен 512 битам.
Суперблоксчитывается в память при монтировании файловой системы и находится там до её отключения. Суперблок содержит следующую информацию:
F Тип файловой системы (s_type);
F Размер файловой системы в логических блоках, включая сам суперблок, ilist и блоки хранения данных (s_fsize);
F Размер массива индексных дескрипторов (s_isize);
F Число свободных блоков, доступных для размещения (s_tfree);
F Число свободных inode, доступных для размещения (s_tinode);
F Флаги (флаг модификации s_fmod, флаг режима монтирования s_fronly);
F Размер логического блока (512, 1024, 2048);
F Список номеров свободных inode;
F Список адресов свободных блоков.
Индексные дескрипторы.Индексный дескриптор не содержит:
F Имени файла, которое содержится в блоках хранения данных каталога;
F Содержимого файла, которое размещено в блоках хранения данных.
При открытии файла ядро помещает копию дискового inode в память в таблицу, которая содержит несколько дополнительных полей.
Основными полями дискового inode являются следующие:
F Di_mode – тип файла, дополнительные атрибуты выполнения и права доступа;
F Di_nlinks – число ссылок на файл, т.е. количество имён, которые имеет файл в файловой системе;
F Di_uid, di_gid – идентификаторы владельца-пользователя и владельца-группы;
F Di_size – размер файла в байтах;
F Di_atime – время последнего доступа к файлу;
F Di_mtime – время последней модификации;
F Di_ctime – время последней модификации inode кроме полей di_atime, di_mtime;
F Di_addr[13] – массив адресов дисковых блоков хранения данных.
Индексный дескриптор содержит информацию о расположении данных файла. Эта информация хранится в виде массива, каждый элемент которого содержит физический адрес дискового блока, а индексом массива является номер логического блока файла. Массив имеет фиксированный размер и состоит из 13 элементов. При этом первые 10 адресуют непосредственно блоки хранения данных файла. Одиннадцатый элемент адресует блок, в свою очередь содержащий адрес блоков хранения данных. Двенадцатый элемент указывает на дисковый блок, также хранящий адреса блоков, каждый из которых адресует блок хранения данных файла. Тринадцатый элемент используется для тройной косвенной адресации, когда для нахождения адреса блока хранения данных файла используется три дополнительных блока.
Такой подход позволяет поддерживать работу с файлами с размером до десятка мегабайт. Для относительно небольших файлов (до 10 Кбайт при размере блока 1024 байт) используется прямая индексация, обеспечивающая максимальную производительность.
Для файлов размер которых не превышает 266 Кбайт (10 Кбайт + 256*1024), достаточно простой косвенно адресации. При использовании тройной косвенной адресации можно обеспечить доступ к 16 777 216 блокам (256*256*256).