Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек_1_9_Структура файловой системы.doc
Скачиваний:
14
Добавлен:
21.09.2019
Размер:
526.85 Кб
Скачать

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

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

В мире UNIX существует несколько разных видов файловых систем со своей структурой внешней памяти. Наиболее известны традиционная (первая) файловая система UNIX System V (s5fs) и файловая система семейства UNIX BSD (ufs).

Файловые системы современных версий UNIX имеют весьма сложную архитектуру, различаются для разных версий, но все они используют базовые идеи, заложенные в s5fs и ufs.

Базовая файловая система s5fs

состоит из четырех компонентов (рис. 1).

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

Кратко опишем суть и назначение каждой области диска.

  • Boot-блок содержит программу раскрутки, которая служит для первоначального запуска ОС UNIX. В файловых системах ufs реально используется boot-блок только корневой файловой системы. В дополнительных файловых системах эта область присутствует, но не используется.

  • Суперблок - это наиболее ответственная область файловой системы, содержащая информацию, которая необходима для работы с файловой системой в целом. Суперблок содержит список свободных блоков и свободные i-узлы (information nodes - информационные узлы).

  • Массив индексных дескрипторов (ilist) содержит список i-узлов, соответствующих метаданным всех файлов данной файловой системы. Максимальное число файлов, которые могут быть созданы в файловой системе, определяется числом i-узлов в массиве ilist. В i-узле хранится информация, описывающая файл: режимы доступа к файлу, время создания и последней модификации, идентификатор пользователя и идентификатор группы создателя файла, описание блочной структуры файла, т.е. номера его блоков, и т.д. Ядро обращается к inode по индексу в массиве ilist. Один inode является корневым, через него обеспечивается доступ к структуре каталогов и файлов. По соглашению номер 1 не используется. Первым используемым номером всегда является 2.

  • Блоки данных - в этой части файловой системы хранятся реальные данные файлов. Блоки данных занимают большую часть дискового раздела. Их число определяет максимальный суммарный объем всех файлов данной файловой системы. Размер блока данных определяется при форматировании файловой системы командой mkfs и может быть установлен в 512, 1024, 2048, 4096 или 8192 байтов.

Вообще-то каждый дисковый блок содержит либо некоторое число inode (индексов), либо данные файла. Т.е. несколько inode сгруппированы в одном блоке. Команда df -t может показать число имеющихся/свободных индексных описателей (inode) и блоков.

Рассмотрим подробнее некоторые компоненты.

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

    • тип Ф.С.

    • размер Ф.С. в блоках

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

    • число свободных блоков

    • число свободных inode

    • флаги (модификации и режима монтирования)

    • размер блока

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

    • список номеров свободных блоков

Хранение двух последних списков целиком в суперблоке непрактично, т.к. они м.б. очень большими. Поэтому для индексных дескрипторов хранится только часть списка. Когда в этом подсписке число свободных inode приближается к нулю, ядро вновь просматривает ilist и формирует новый список (у свободных inode поле di_mode = 0).

В отношении блоков такой подход неприменим. По содержимому блока нельзя судить, свободен он или занят. Поэтому необходимо хранить список номеров свободных блоков целиком. Но он может занимать много (!) блоков. Поэтому в суперблоке находится только один из них. А первый элемент этого блока указывает на блок, хранящий продолжение списка. Выделение свободных блоков происходит с конца списка суперблока. Как только в списке останется один элемент (первый), ядро его интерпретирует как указатель на блок, содержащий продолжение списка. Содержимое этого блока считывается в суперблок (а он же в памяти, как мы помним) и сам он становится свободным.

Индексные дескрипторы содержат информацию о файле, необходимую для его обработки. Они не содержат имени файла, поэтому один файл может иметь несколько имен. При открытии файла процессом ядро помещает копию inode в память в таблицу открытых файлов этого процесса. Структура дискового inode (struct dinode) приведена на рис. 2.

di_mode

di_nlinks

di_uid

di_gid

d i_size

di_atime

di_mtime

di_ctime

di_adr[0]

di_adr[1]

di_adr[2]

di_adr[3]

di_adr[4]

di_adr[5]

di_adr[6]

di_adr[7]

di_adr[8]

di_adr[9]

d i_adr[10]

di_adr[11]

di_adr[12]


тип

s

s

t

r

w

x

r

w

x

r

w

x

SUID SGID user group other


Рис. 2

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

Блоки хранения данных в общем случае располагаются не последовательно. Каждый блок может использоваться только одним файлом (в других Ф.С. это может быть и не так). Достоинства этого способа заключается в эффективном использовании дискового пространства, но последний блок используется не полностью (в среднем наполовину). С течением времени файлы становятся сильно «разбросанными» по диску, что замедляет к ним доступ, уменьшает производительность обмена данными.

В inode информация о блоках, принадлежащих файлу, хранится в виде массива из 13 элементов. Первые 10 элементов адресуют непосредственно блоки, в которых хранятся данные файла. 11-й элемент содержит адрес блока, в которм находятся адреса блоков хранения данных. 12-й элемент указывает на блок, содержащий адреса блоков, а те, в свою очередь, указывают на блоки с данными файла. 13-й элемент массива используется для тройной косвенной адресации. Т.о. для маленьких файлов (до 10к при размере блока = 1024байта) используется прямая индексация, обеспечивающая максимальную производительность. Для файлов, размер которых не превышает 266к (10к+256 адресов*1024байта), достаточно простой косвенной адресации. При использовании тройной косвенной адресации можно обеспечить доступ к 16 777 215 блокам.

Файлы в UNIX могут содержать т.н. «дыры». Каким образом? Зачем? Недостатки? - для отличников.

Каталог s5fs

На ранних UNIX-системах номера индексов в каталогах были 2-х байтными (2+14=16). Значит, число inode в s5fs не могло превышать 216 = 65536. Ограничение на имя файла – 14 байт. Современные системы предоставляют длинные имена для файлов. Каждый элемент каталога имеет различную длину (до 255 байт). Номера индексов при этом 32-х (или даже 64 разрядные) – 4 байта или 8 байт.

Специальные имена ‘.’ и ‘..’ на самом деле просто являются прямыми (жесткими) ссылками. Эти ссылки создает сама ОС, т.к. код уровня пользователя не может создать прямую ссылку на каталог.

При удалении имени файла из каталога, номер соответствующего inode устанавливается равным 0. При помещении новых файлов в этот каталог они будут использоваться первыми.

Исследовать этот механизм можно с помощью команды hd, которая выводит не интерпретированное содержание каталога (файла) – шестнадцатиричный дамп. для отличников

Достоинства, недостатки, ограничения s5fs

Простая, понятная. Но имеет низкую надежность и производительность.

Слабое место (низкая надежность) – суперблок. Он несет информацию обо всей Ф.С. в целом и при его повреждении Ф.С. не сможет функционировать. Один экземпляр суперблока – это очень мало, и вероятность его повреждения достаточно велика.

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

Потеря дискового пространства за счет неполного использования последнего блока ( в среднем – половины блока – это много для дисков того времени).

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

Файловая система BSD UNIX

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

Файловая система Linux – ext2 (ext3) – очень похожа на файловую систему ufs.

Свойства файловой системы ext2:

максимальный размер файловой системы 4 Тбайт

максимальный размер файла 2 Гбайт

максимальная длина имени файла 255 символов

максимальный размер блока 1024 байт

количество выделяемых индексных дескрипторов 1 на 4096 байт раздела

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

Организация Ф.С. предусматривает деление дискового раздела на несколько групп цилиндров (cylinder group). Группа цилиндров – это последовательность из нескольких дисковых цилиндров. Каждая группа цилиндров содержит Boot-блок, резервную копию суперблока, массив inode, данные о свободных блоках и итоговую информацию об использовании блоков в этой группе (рис. 3).

Рис. 3. Структура файловой системы ufs

  • Размер блока группы цилиндров зависит от размера файловой системы. Для каждой группы цилиндров при создании файловой системы выделяется место под определенное количество inode. При этом обычно на каждые 2к блоков хранения данных создается один inode. Вместо того, чтобы группировать все inode в начале, создаются отдельные кластеры inode, которые рассредоточиваются по всему разделу. Тем самым уменьшается время доступа к данным, уменьшается вероятность отери всех индексных дескрипторов в результате сбоя.

  • Управляющая информация размещается не в начале группы цилиндров, а с некоторым смещением от начала. Иначе для всех групп она бы располагалась на одной пластине диска и могла бы быть уничтожена при выходе из строя этой пластины. Это смещение выбирается равным одному сектору (?) относительно предыдущей группы, т.о. для соседних групп она начинается на разных пластинах диска. Потеря одного сектора, цилиндра или пластины не приведет к потере всех копий суперблока.

Размер блока может быть увеличен (аж!) до 64к. Кажется, что это может привести к колоссальной потере дискового пространства (до 60 %) Но этот недостаток преодолен за счет возможной фрагментации блока. Каждый блок может быть разбит на 2, 4 или 8 фрагментов. Блок является единицей передачи данных в операциях ввода-вывода. Фрагмент определяет адресуемую единицу хранения данных на диске. Минимальный размер фрагмента определяется размером сектора (единицей адресации диска). Информация о свободном пространстве в группе цилиндров хранится не в виде списка, а в виде битовой карты блоков, которая описывает свободное пространство в фрагментах, для определения того, свободен ли данный блок или не.. Ядро анализирует биты фрагментов, составляющих блок (рис. 4)


Адреса

блоков/

фрагментов

Блоки хранения данных

1

1

1

1

0

0

0

0

1

1

1

1

0

0

0

0

0

0

1

1

1

1

1

1

Карта свободных блоков/фрагментов

Рис. 4

При размещении блоков используется стратегия, направленная на увеличение производительность Ф.С. Вот ее некоторые принципы:

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

  • все файлы каталога по возможности размещаются в одной группе цилиндров (т.к. многие команды работают с файлами одного и того же каталога);

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

  • данные файла размещаются не в соседних блоках, а через пропуски в несколько секторов, т.о. не потребуются холостые обороты диска (т.к. при чтении блока часть времени уходит на завершение чтения блока и подготовке к чтению нового блока, а за это время диск переместится из-под головки).

В предельном варианте, когда все данные локализованы в одной большой группе цилиндра, получаем s5fs. Но параметры файловой системы ufs начинают резко ухудшаться по мере уменьшения свободного места, т.к. размещение блоков становится далеким от оптимального. Практика показывает, что Ф.С. имеет удовлетворительные характеристики при наличии более 10% свободного места.

Структура каталога ufs была изменена для поддержки длинных (до 255 символов) имен.

Вместо записей фиксированной длины (16 байт) имеются записи переменной длины:

d_ino номер inode

d_reclen длина записи

d_namlen длина имени файла

d_name[ ] имя файла, дополненное нулями до 4-байтной границы.

При удалении имени файла принадлежащая ему запись присоединяется к предыдущей и значение ее поля d_reclen увеличивается на соответствующую величину. Удаление первой записи выражается в присвоении нулевого значения полю d_ino.

Поддержка нескольких ФС.

В современных ОС может быть несколько систем управления файлами, что обеспечивает работу нескольких Ф.С. Популярность Ф.С. приводит к её «миграции» в другие ОС из «родной». Например, FAT из MSDOS→ в OS/2→в Windows.

Обычно в ОС имеется специальный слой ПО, отвечающий за решение задачи и за то, какую Ф.С. использовать? Например, слой VFS (Vital File System) в UNIX, в Windows 9x.

Виртуальная файловая система

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

     

Рис. 1. Архитектура виртуальной файловой системы

Виртуальная Ф.С. основана на представлении метаданных файла в виде, сходном с традиционной семантикой UNIX. Интерфейсом работы с файлами является vnode (от virtual inode – виртуальный файловый дескриптор). Структура данных vnode одинакова для всех файлов, независимо от типа реальной Ф.С., где фактически располагается файл (даже и для DOS, в которой структура файла и его метаданные существенно отличаются от представления в UNIX). Данные vnode содержат информацию, необходимую для работы виртуальной Ф.С. и неизменные характеристики файла, например:

  • число ссылок на vnode;

  • тип vnode (обычный файл, каталог, специальный файл, …);

  • указатель на Ф.С., в которой находится файл;

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