Чтение онлайн

ЖАНРЫ

Шрифт:

Каждый жесткий диск состоит из одной или нескольких логических частей, называемых разделами (partitions). Расположение и размер раздела определяются при форматировании диска. В UNIX разделы выступают в качестве независимых устройств, доступ к которым осуществляется как к различным носителям данных.

Например, диск может состоять из четырех разделов, каждый из которых содержит свою файловую систему. Заметим, что в разделе может располагаться только одна файловая система, которая не может занимать несколько разделов. В другой конфигурации диск может состоять только из одного раздела, позволяя создание весьма емких файловых систем.

Файловая система s5fs занимает раздел диска и состоит из трех основных компонентов, как показано на рис. 4.1.

Рис. 4.1.

Структура файловой системы s5fs

 Суперблок (superblocк). Содержит общую информацию о файловой системе, например, об ее архитектуре, общем числе блоков и индексных дескрипторов, или метаданных (inode).

 Массив индексных дескрипторов (ilist). Содержит метаданные всех файлов файловой системы. Индексный дескриптор содержит статусную информацию о файле и указывает на расположение данных этого файла. Ядро обращается к inode по индексу в массиве ilist. Один inode является корневым (root) inode файловой системы, через него обеспечивается доступ к структуре каталогов и файлов после монтирования файловой системы. Размер массива ilist является фиксированным и задается при создании файловой системы. Таким образом, файловая система s5fs имеет ограничение по числу файлов, которые могут храниться в ней, независимо от размера этих файлов.

 Блоки хранения данных. Данные обычных файлов и каталогов хранятся в блоках. Обработка файла осуществляется через inode, содержащего ссылки на блоки данных. Блоки хранения данных занимают большую часть дискового раздела, и их число определяет максимальный суммарный объем файлов данной файловой системы. Размер блока кратен 512 байтам, например файловая система S51K SCO UNIX использует размер блока в 1 Кбайт (отсюда и название).

Рассмотрим подробнее каждый из перечисленных компонентов.

Суперблок

Суперблок содержит информацию, необходимую для монтирования и управления работой файловой системы в целом (например, для размещения новых файлов). В каждой файловой системе существует только один суперблок, который располагается в начале раздела. Суперблок считывается в память при монтировании файловой системы и находится там до ее отключения (размонтирования).

Суперблок содержит следующую информацию:

 Тип файловой системы (

s_type
)

 Размер файловой системы в логических блоках, включая сам суперблок, ilist и блоки хранения данных (

s_fsize
)

 Размер массива индексных дескрипторов (

s_isize
)

 Число свободных блоков, доступных для размещения (

s_tfree
)

 Число свободных inode, доступных для размещения (

s_tinode
)

 Флаги (флаг модификации

s_fmod
, флаг режима монтирования
s_fronly
)

 Размер логического блока (512, 1024, 2048)

 Список номеров свободных inode

 Список адресов свободных блоков

Поскольку число свободных inode и блоков хранения данных может быть значительным, хранение двух последних списков целиком в суперблоке непрактично. Например, для индексных дескрипторов хранится только часть списка. Когда число свободных inode в этом списке приближается к 0, ядро просматривает ilist и вновь формирует список свободных inode. Для этого ядро анализирует поле

di_mode
индексного дескриптора, которое равно 0 у свободных inode.

К сожалению, такой подход неприменим в отношении свободных блоков хранения данных, поскольку по содержимому блока нельзя определить, свободен он или нет. Поэтому необходимо хранить список адресов свободных блоков целиком. Список адресов свободных блоков может занимать несколько блоков хранения данных, но суперблок содержит только один блок этого списка. Первый элемент этого блока указывает на блок, хранящий продолжение списка и т.д., как это показано на рис. 4.1.

Выделение свободных блоков для размещения файла производится

с конца списка суперблока. Когда в списке остается единственный элемент, ядро интерпретирует его как указатель на блок, содержащий продолжение списка. В этом случае содержимое этого блока считывается в суперблок и блок становится свободным. Такой подход позволяет использовать дисковое пространство под списки, пропорциональное свободному месту в файловой системе. Другими словами, когда свободного места практически не остается, список адресов свободных блоков целиком помещается в суперблоке.

Индексные дескрипторы

Индексный дескриптор, или inode, содержит информацию о файле, необходимую для обработки данных, т.е. метаданные файла. Каждый файл ассоциирован с одним inode, хотя может иметь несколько имен в файловой системе, каждое из которых указывает на один и тот же inode.

Индексный дескриптор не содержит:

 имени файла, которое содержится в блоках хранения данных каталога;

 содержимого файла, которое размещено в блоках хранения данных.

При открытии файла ядро помещает копию дискового inode в память в таблицу in-core inode, которая содержит несколько дополнительных полей. Структура дискового inode (

struct dinode
) приведена на рис. 4.2. Основные поля дискового inode следующие:

di_mode
Тип файла, дополнительные атрибуты выполнения и права доступа.
di_nlinks
Число ссылок на файл, т.е. количество имен, которые имеет файл в файловой системе.
di_uid
,
di_gid
Идентификаторы владельца-пользователя и владельца- группы.
di_size
Размер файла в байтах. Для специальных файлов это поле содержит старший и младший номера устройства.
di_atime
Время последнего доступа к файлу.
di_mtime
Время последней модификации.
di_ctime
Время последней модификации inode (кроме модификации полей di_atime, di_mtime).
di_addr[13]
Массив адресов дисковых блоков хранения данных.

Рис. 4.2. Структура дискового inode

Поле

di_mode
хранит несколько атрибутов файла: тип файла (
IFREG
для обычных файлов,
IFDIR
для каталогов,
IFBLK
или
IFCHR
для специальных файлов блочных и символьных устройств соответственно); права доступа к файлу для трех классов пользователей и дополнительные атрибуты выполнения (SUID, SGID и sticky bit), значения этих атрибутов были подробно рассмотрены в главе 1.

Заметим, что в индексном дескрипторе отсутствует информация о времени создания файла. Вместо этого inode хранит три значения времени: время последнего доступа (

di_atime
), время последней модификации содержимого файла (
di_mtime
) и время последней модификации метаданных файла (
di_ctime
). В последнем случае не учитываются модификации полей
di_atime
и
di_mtime
. Таким образом,
di_ctime
изменяется, когда изменяется размер файла, владелец, группа, или число связей.

Поделиться с друзьями: