На какие области разделено пространство тома fat32

Обновлено: 07.07.2024

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

· загрузочная запись (boot record, BR);

· резервная область, включающая дополнительную системную структуру FSInfo;

· две копии таблиц размещения файлов FAT 1 и FAT 2.

Корневой каталог в системной области FAT32 отсутствует и может быть расположен в любом месте области данных раздела и иметь произвольный размер.

Общее число зарезервированных секторов теперь перед первой FAT равно 32.

Область данных логического диска содержит файлы и каталоги, подчиненные корневому каталогу, и разделена на участки одинакового размера – кластеры. Кластер может состоять из одного или нескольких последовательно расположенных на диске секторов. Число секторов в кластере должно быть кратно 2 n и может принимать значения от 1 до 64. Размер кластера зависит от объема логического диска.


В первом секторе логического диска с системой FAT32 располагается загрузочный сектор (Boot Record – BR) и блок параметров BIOS (BPB). Блок параметров BIOS в FАТ32 занимает больше места, чем стандартный, и называется Big FAT BIOS Parameter Block (BF_BPB). Из-за этого загрузочный сектор теперь занимает не один, а три физических сектора, причем имеется еще дополнительный и размещается через три физических сектора в седьмом, восьмом и девятом физическом секторе.

BF_BPB - это расширенная версия ВРВ, которая использовалась в 12- и 16-разрядной FAT. Он содержит те же структуры, что и стандартный BPB, но включает несколько дополнительных полей, которые используются только в FAT32. Начальный участок данного блока (табл. 1) для всех типов FAT идентичен за исключением полей со смещением 0x11 и 0x16, в которых для FAT 32 указываются нулевые значения.

Смещение Размер, байт Описание
0x00 Безусловный переход (jmp) на загрузочный код
0x03 Идентификатор фирмы-изготовителя
0x0B Число байт в секторе (512)
0x0D Число секторов в кластере
0x0E Число резервных секторов в резервной области раздела, начиная с первого сектора раздела
0x10 Число таблиц (копий) FAT
0x11 Для FAT12/FAT16 - количество 32-байтных дескрипторов файлов в корневом каталоге; для FAT32 это поле имеет значение 0
0x13 Общее число секторов в разделе; если данное поле содержит 0, то число секторов задается полем по смещению 0x20
0x15 Тип носителя. Для жесткого диска имеет значение 0xF8; для гибкого диска (2 стороны, 18 секторов на дорожке) – 0xF0
0x16 Для FAT12/FAT16 это поле содержит количество секторов, занимаемых одной копией FAT; для FAT32 это поле имеет значение 0
0x18 Число секторов на дорожке (для прерывания 0x13)
0x1A Число рабочих поверхностей (для прерывания 0x13)
0x1C Число скрытых секторов перед разделом
0x20 Общее число секторов в разделе. Поле используется, если в разделе свыше 65535 секторов, в противном случае поле содержит 0.

Существенные различия в структуре загрузочных секторов для разных типов FAT начинаются со смещения 0x24. Для FAT32 структура этой части BPB (BF_BPB) имеет вид, представленный в табл. 2.

Смещение Размер, байт Описание
0x24 Количество секторов, занимаемых одной копией FAT
0x28 Номер активной FAT
0x2A Номер версии FAT32: старший байт - номер версии, младший – номер ревизии. В настоящее время используется значение 0:0
0x2С Номер кластера для первого кластера корневого каталога
0x30 Номер сектора структуры FSInfo в резервной области логического диска
0x32 Номер сектора (в резервной области логического диска), используемого для хранения резервной копии загрузочного сектора
0x34 Зарезервировано (содержит 0)

Кроме перечисленных полей, загрузочный сектор логического диска должен содержать в байте со смещением 0x1FE код 0x55, а в следующем байте (смещение 0x1FF) – код 0xAA. Указанные два байта являются признаком загрузочного диска.

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

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

Смещение Размер, байт Описание
0x000 Значение 0x41615252 – сигнатура, которая служит признаком того, данный сектор содержит структуру FSInfo
0x004 Зарезервировано (содержит 0)
0x1E4 Значение 0x61417272 (сигнатура)
0x1E8 Содержит текущее число свободных кластеров на диске. Если в поле записано значение 0xFFFFFFFF, то число свободных кластеров неизвестно, и его необходимо вычислять
0x1EC Содержит номер кластера, с которого дисковый драйвер должен начинать поиск свободных кластеров. Если в поле записано значение 0xFFFFFFFF, то поиск свободных кластеров нужно начинать с кластера номер 2
0x1F0 Зарезервировано (содержит 0)
0x1FC Сигнатура 0xAA550000 – признак конца структуры FSInfo

Еще одно важное новшество в FАТ32 состоит в следующем. В прежних версиях файловой системы FAT повреждение загрузочного сектора приводило к полной потере всего содержимого диска. В FAT32 при подготовке раздела с помощью системных программ (например, программой FDISK) создается резервная копия загрузочного сектора, которая помещается в логический сектор 6 данного раздела. Если новая MBR при обращении к загрузочному сектору обнаруживает ошибку чтения или неправильную сигнатуру, она ищет сектор 6 и считывает остальную часть загрузочного кода уже из него.

Предназначение FAT32 не изменилось. Она по-прежнему используется как таблица, связывающая отдельные кластеры файла. Элементы таблицы FAT теперь в 2 раза длиннее (4 байта). Старшие 4 бита каждого 32-битного значения зарезервированы и не участвуют в формировании номера кластера, поэтому максимальное число кластеров в 32-разрядной FAT равно 268 435 445.

Если кластер свободен, то соответствующий элемент FAT содержит код 0. Элементы каталожного дескриптора, указывающие на первый кластер файла, теперь состоят из четырех байтов, а содержимое этих байтов является номером (адресом) следующего кластера и элемента таблицы FAT, который содержит номер следующего кластера файла, а также является номером элемента таблицы FAT и т. д. до последнего кластера файла. Элемент FAT, соответствующий последнему кластеру в цепочке, содержит сигнатуру конца файла 0xFFFFFFF8. Если элемент FAT содержит код 0x0FFFFFF7, то кластер помечается как поврежденный и не должен выделяться системой.

Начальный кластер, указанный в 32-х байтном дескрипторе каталога, сообщает операционной системе, где на диске искать первую часть файла и где в таблице FAT32 искать следующий номер кластера. В показанном ниже дескрипторе каталога адрес начального кластера выделен полужирным шрифтом.

49 4F 20 20 20 20 20 20 - 44 4F 53 07 00 00 00 00 IO SYS.
00 00 00 00 00 00 80 32 - ЗЕ 1В 02 00 46 9F 00 00 .

Для указания номера кластера используются два дополнительных байта. Они размещаются в зарезервированном поле дескриптора (в примере, показанном выше, это поле содержит код 00 00). Объединяя их с обычными (существующими в FAT16) двумя байтами (02 00), операционная система получает нужное значение (00 00 00 02) и ищет по нему соответствующий элемент таблицы FAT. Ниже показан пример записи с номерами кластеров файла в 32-разрядной таблице FAT:

F8 FF FF 0F FF FF FF 0F - 03 00 00 0004 00 00 00

05 00 00 0006 00 00 00 - 07 00 00 00 08 00 00 00

09 00 00 00 0А 00 00 00 - 0В 00 00 00 0С 00 00 00

0D 00 00 00 0Е 00 00 00 - 0F 00 00 00 10 00 00 00

11 00 00 00 12 00 00 00 - 13 00 00 00 14 00 00 00

15 00 00 00 16 00 00 00 - 17 00 00 00 18 00 00 00

19 00 00 00 1А 00 00 00 - 1В 00 00 00 FF FF FF F8

Как и раньше в FAT 16, F8 - это байт, содержащий дескриптор носителя. Следующие семь байтов, FF FF 0F FF FF FF 0F, зарезервированы. Номера кластеров записываются как четырехбайтовые числа, в которых младшие байты указаны первыми. Их следует читать так:

Код в таблице 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00
Читаемое значение

Конец цепочки кластеров для файла помечается маркером FFFFFFF8.

Корневой каталог в FAT32 может содержать до 65 535 элементов. В загрузочном секторе появился новый элемент, который указывает на первый кластер корневого каталога. Поэтому корневой каталог больше не привязан к строго определенному участка на диске (раньше он должен был находиться непосредственно за второй таблицей FAT) и может расширяться точно так же, как и любой подкаталог.

В файловых системах FAT32 и VFAT (виртуальная FAT, расширение FAT16) включена поддержка длинных имен файлов (long file name, LFN). Для хранения длинного имени используются дескрипторы каталога, смежные с основным дескриптором. Имя файла записывается не ASCII-символами, а в системе кодирования Unicode. В одном дескрипторе каталога можно сохранить фрагмент длиной до 13 символов Unicode. Неиспользованный участок последнего дескриптора заполняется кодами 0xFFFF. Структура дескриптора каталога для длинного имени файла представлена в табл. 4.

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

Смещение Размер (байт) Описание
0x00 Номер фрагмента
0x01 Символы 1-5 имени файла в Unicode
0x0B Атрибуты файла
0x0C Байт флагов
0x0D Контрольная сумма короткого имени
0x0E Символы 6-11 имени файла в Unicode
0x1A Номер первого кластера (заполняется нулями)
0x1C Символы 12-13 имени файла в Unicode

Псевдоним удовлетворяет формату "8.3”, составляется из первых шести символов имени файла, дополняемых знаками

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

В качестве примера ниже приводится структура дескрипторов каталога для файла с именем "The quick brown fox". Система создала представление этого имени в формате "8.3", THEQUI

1.FOX (в элементе каталога нет "точки", поскольку предполагается, что точка следует после восьмого символа), и использовала два дополнительных 32-х байтных дескриптора для хранения длинного Unicode-имени. Каждая строка на рисунке состоит из 16 байт.

Что такое файловая система и зачем жесткому диску нужны FAT32 и NTFS?

Форматирование флешки или системного накопителя — стандартная задача компьютерного пользователя. В современных операционных системах процесс сильно упрощен, поэтому справится даже новичок. Система самостоятельно определяет, какие настройки подходят определенному устройству и какую файловую систему выбрать при форматировании. Так, Windows форматирует системные накопители в NTFS, а флешки превращает в FAT32. Почему так происходит? Чем отличаются эти файловые системы и вообще, зачем диску нужен «формат»?

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

Например, мы посетили библиотеку в поисках произведения «Таинственный остров». По просьбе читателя библиотекарь обращается к каталогу, ищет отдел, в котором хранятся книги с названиями, начинающимися на букву «Т», затем находит шкаф, полку и место, где хранится интересующее читателя издание. Пользуясь такой системой, библиотекарь найдет книгу за считанные секунды, гораздо дольше ему придется доставать и нести ее читателю через весь зал. Аналогично работает и файловая система в накопителе.


Теперь представим, что из библиотеки вывезли все шкафы и полки, а книги теперь лежат на столах, стульях, полу и подоконниках. Произведение Жюля Верна будет практически невозможно найти среди тысяч печатных экземпляров: оно может находиться в любом месте, так как книги разбросаны в неизвестном порядке. При этом, несмотря на беспорядок, библиотека все-таки выполняет свою основную задачу — она хранит книги. Но практической пользы от этого мало: в системе хранения нарушены структура и каталогизация. То же самое происходит, если накопитель лишен какой-либо файловой системы.

Что такое файловая система

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


Например, записывая фотографию на обычный винчестер, компьютер разбивает файл на части. Каждому кусочку файла соответствует ячейка на поверхности магнитной пластины диска. При этом, если любая программа обратится к нужному файлу, то ни она, ни диск не будут знать, что это за файл, где он расположен, как он называется, сколько весит и какие ячейки занимает в накопителе. Единственное, что известно программе — это имя файла, его размер и другие атрибуты, которые она передает файловой системе как условный знак для поиска этого файла в ячейках.

Чтобы понять, кто за что отвечает и кем является, рассмотрим структуру на книгах и библиотеках. Так, в цепочке «пользователь-файл» есть несколько действующих лиц, без которых работа системы невозможна:

  • Накопитель — это библиотека (как здание или организация).
  • Пользователь — это читатель, который пришел в библиотеку за произведением Жюля Верна.
  • Файл — это книга с понятным названием (атрибутом) или другим условным опознавательным знаком, например, упомянутый выше «Таинственный остров».
  • Драйвер файловой системы — это библиотекарь, который выступает в роли посредника или проводника между читателем и книгой. Или между пользователем (компьютером, операционной системой) и файлом (ячейками с информацией в микросхемах памяти или на магнитных пластинах).
  • Файловая система — порядок, в соответствии с которым в библиотеке расставлены книги, а также каталог, с помощью которого специалист находит книги. Системы бывают разные: книги можно расставить по росту, цвету обложки, жанру, году выпуска или названию в алфавитном порядке. На диске файловая система отвечает за организацию файлов.


Дисковая система — это тоже библиотека. Вместо больших помещений здесь используются компактные корпуса накопителей, а в качестве полок с книгами выступают микросхемы памяти в твердотельных накопителях или магнитные пластины классических винчестеров. Система каталогизации библиотеки — это файловая система компьютера. Как и способы сортировки книг в библиотеке, компьютерные файловые системы делятся на несколько типов. Самые распространенные среди компьютеров на ОС Windows — это NTFS и FAT32.

NTFS — New Technology File System

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

NTFS — фирменная файловая система Microsoft, которую разработчики начали внедрять в операционную систему Windows, начиная с версии NT 3.1. Несмотря на байки о ненадежности и низкой отказоустойчивости этой системы, NTFS считается самым лучшим и удачным решением для работы актуальных операционных систем Windows. Конечно, как и любая другая система, NTFS не лишена недостатков — это слишком сложное устройство ФС, особенно по современным меркам. Ведь известно — чем сложнее устройство, тем больше в нем уязвимостей.


Структура и фрагментация

Файловая система NTFS делит пространство накопителя на кластеры — блоки, размером от 512 байт до 64 КБ. По умолчанию Windows делит блоки по 4 КБ каждый.


Способ организации файлового пространства на диске с NTFS подразумевает наличие специального раздела, в котором ФС хранит сервисные данные о своей работе. А именно, ведет некий каталог, в котором записываются различные данные о файлах и разделах. Это раздел MFT (Master File Table) — свободное пространство с метафайлом, под который система выделяет 12% от общего объема.

MFT является динамическим разделом — по мере накопления информации на диске, он может сокращаться, чтобы освободить место под пользовательские файлы. Однако при первом же свободном гигабайте на диске, раздел MFT снова заберет свое «законное» место, при этом новая часть метафайла может фрагментироваться и оказаться уже не в начале диска, а в конце или в середине. Отсюда существует распространенная проблема фрагментации файловой системы, когда части каталогов разбросаны по всему диску. Тогда, чтобы найти какой-либо файл, диск судорожно ищет их по всей поверхности, отсюда снижение скорости доступа и общей производительности компьютера. Фрагментация — не самая сильная сторона NTFS.

Файлы и каталоги

Организация данных в этой ФС имеет структуру бинарного дерева: каждый элемент в системе обрабатывается не иерархически, а через бинарные запросы. Например, чтобы найти файл с именем «К» среди тысячи других файлов, система делит каталог на две части и начинает поиск с середины. Например, узнает, в какой части необходимо искать данный файл, если за середину каталога принят файл с названием «Т»? В таком случае система ответит — ищите среди тех файлов, которые идут до файла с именем «Т». То есть, имея отсортированный по алфавиту каталог, система понимает, что файл с необходимым именем находится в одной из двух частей, и время на поиск файла сокращается в два раза — это улучшает скорость работы с мелкими одиночными файлами.


Все файлы в этой системе существуют в виде потоков. Фактически, для того, чтобы превратить блоки с данными в единый файл, этой ФС необходим только файл с метаданными. Это своего рода инструкция по сборке файлов из кусочков данных, которые хранятся в ячейках по всей поверхности накопителя. Благодаря гибкой файловой структуре, объекты NTFS могут принимать множество дополнительных свойств. Например, содержать в названии до 65535 различных символов Unicode. При этом максимальная длина имени файла достигает 255 символов.

Журналирование

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


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

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

Шифрование

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


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

Файловая система NTFS также отличается:

  • Поддержкой больших томов и файлов — до 8 ПБ;
  • Несколькими уровнями безопасности, в том числе, поддержкой шифрования;
  • Распределением прав доступа к файлам;
  • Возможностью сжатия;
  • Поддержкой до 4 294 967 295 (232−1) файлов.

Вывод: система NTFS «заточена» под работу с операционной системой, а также для накопителей с большим объемом и несколькими разделами.

FAT32 — File Allocation Table

Обновленная файловая система пришла на смену устаревшей FAT16. Ее также разработали специалисты Microsoft, но, в отличие от NTFS, она распространяется в виде открытого исходного кода. Поэтому разработчики любого софта могут беспрепятственно компилировать и внедрять драйвер в свое ПО. Например, поддержка FAT32 есть не только в «родной» операционной системе, но и в любой другой — linux, MacOS, Android, даже в таких проприетарных системах, как iOS.


В ранних версиях ОС Windows файловая система FAT32 даже использовалась в качестве основной ФС для системного раздела. Но позже разработчики отказались от этого решения в пользу новой и прогрессивной NTFS. Впрочем, несмотря на некоторые особенности FAT32, эта ФС все еще повсеместно используется во флешках и картах памяти.

Проще некуда

Файловая система FAT32 — это автомат Калашникова. Она максимально упрощена:.Здесь нет продвинутых систем безопасности и шифрования, система не умеет журналировать свою работу. Это частично сказывается на производительности — в некоторых случаях скорость чтения или записи может быть выше, чем у более новой и сложной NTFS. Правда, это сильно зависит от условий работы — например, от количества обрабатываемых файлов. Так, работа с массивами мелких файлов может стать настоящим испытанием для накопителя, отформатированного в этой файловой системе.

Впрочем, такие задания редко выполняют на тех накопителях, которые используют FAT32. Обычно это внешние устройства с небольшим объемом. Более того, файловая система не умеет работать с объемными разделами. Например, штатные средства ОС Windows не позволяют создавать на диске с FAT32 разделы, объем которых превышает 32 ГБ. К этим недостаткам относятся и ограничения по максимальному размеру файла. Максимальный размер файла, который запоминает накопитель, составляет 4 ГБ.

Все это, конечно же, влияет на популярность файловой системы и ее удобство. Особенно заметны недостатки устаревшей системы стали после того, как почти у каждого пользователя в арсенале появились флешки с объемом от 64 ГБ — FAT32 такому устройству не к лицу.

Структура

Еще больше красок в устаревание вносит древняя структура: файлы в FAT32 хранятся иерархически, а не в виде бинарного дерева, где каждый отдельный объект может быть доступен независимо от остальных. Если бы такая система использовалась в обычной библиотеке, то поиск одной книги мог бы растянуться на несколько часов: чтобы найти книгу с буквой «Ц» в названии, библиотекарю придется достать все книги с полочек по очереди, начиная с экземпляров на «А», и только после этого взять нужную. Любопытно представить, как бы работала в таком режиме Научная библиотека МГУ, где на физических и виртуальных полках хранится более 10 миллионов экземпляров.


Несмотря на перечисленные особенности, FAT32 все еще неплохо справляется со своими задачами. Например, отсутствие журналирования идет на пользу накопителям, которые быстро изнашиваются от частых перезаписей ячеек. К тому же, работа с объемными файлами и разделами на обычной флешке мало кого интересует. Как правило, они «переносят» легковесные офисные файлы, фотографии, короткие видеоматериалы и установочные файлы программ. Вряд ли кто-то попытается загружать образ фильма в формате Blu-ray на флешку: для этого больше подойдет внешний жесткий диск или твердотельный накопитель с большим объемом.

Вывод: появление флешек с большим объемом внесло коррективы в существование FAT32. Однако на рынке все еще преобладают устройства с объемом не более 32 ГБ — этот формат FAT32 еще тянет.

Практичность превыше всего

Большая и сложная NTFS была разработана еще в 1990-х годах. Несмотря на это, файловая система здравствует до сих пор и спокойно переваривает все современные ОС от Microsoft. Конечно, фирменная технология из Редмонда не панацея: если отказаться от «окон» на компьютере, то и NTFS сразу станет ненужной. Правда, для этого придется смириться с Linux на борту или же переехать на платформу Apple — там, между прочим, используется совсем новая APFS, которую яблочные разработчики представили всего несколько лет назад.


Что касается неоднозначной ситуации с FAT32, то, скорее всего, файловая система уже находится на закате популярности. Специалисты пытаются заменить неактуальную файловую систему более удобными и гибкими EXT. Эти системы имеют открытый исходный код и используются в Unix подобных ОС. Драйверы для этих файловых систем легко портируются под любые операционные системы, поэтому такой накопитель поддерживается даже в актуальной Windows 10, достаточно установить распространенный пакет драйверов.

Вывод: если выбирать файловую систему, то лучше ориентироваться на практичность. Для серьезных задач и под системные нужды обязательно выделять накопитель с NTFS на борту. В то же время, для флешки с маленьким объемом будет достаточно и FAT32 — эта ФС широко поддерживается всеми возможными устройствами. Если же пользователь ставит повышенные требования к системе хранения и обработке файлов — добро пожаловать в мир ZFS.


Это целая система внутри системы, где организация файлов в дисковом пространстве происходит по другим законам. Например, при записи информации, ZFS пишет новые данные в новые блоки, а старые оставляет «жить» до того момента, пока не подтвердит, что свежие данные записаны и готовы к работе. Это необходимо для платформ с уклоном в отказоустойчивость, хотя вряд ли пригодится домашнему юзеру. Чтобы файловая система работала как надо, необходимо иметь двойной запас свободного места на диске: для старых данных и следующего потока новых данных. Поэтому ZFS чаще используют в системах хранения данных с большим объемом. Но это уже совсем другая история.

Файловая система FAT (File Allocation Table) была разработана Биллом Гейтсом и Марком Макдональдом в 1977 году и первоначально использовалась в операционной системе 86-DOS. Чтобы добиться переносимости программ из операционной системы CP/M в 86-DOS, в ней были сохранены ранее принятые ограничения на имена файлов. В дальнейшем 86-DOS была приобретена Microsoft и стала основой для ОС MS-DOS 1.0, выпущенной в августе 1981 года. FAT была предназначена для работы с гибкими дисками размером менее 1 Мб и вначале не предусматривала поддержки жёстких дисков.

Структура раздела FAT изображена на рисунке.

Рисунок 1. Структура раздела с файловой системой FAT

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

  • загрузочная запись (boot record, BR);
  • резервная область;
  • таблицы размещения файлов;
  • область корневого каталога (не существует в FAT32).

Область данных логического диска содержит файлы и каталоги, подчиненные корневому, и разделена на участки одинакового размера – кластеры. Кластер может состоять из одного или нескольких последовательно расположенных на диске секторов. Число секторов в кластере должно быть кратно 2N и может принимать значения от 1 до 64. Размер кластера зависит от типа используемой файловой системы и объема логического диска.

Назначение, структура и типы таблицы размещения файлов

Своё название FAT получила от одноимённой таблицы размещения файлов – File Allocation Table, FAT. В таблице размещения файлов хранится информация о кластерах логического диска. Каждому кластеру соответствует элемент таблицы FAT, содержащий информацию о том, свободен данный кластер или занят данными файла. Если кластер занят под файл, то в соответствующем элементе таблицы размещения файлов указывается адрес кластера, содержащего следующую часть файла. Номер начального кластера, занятого файлом, хранится в элементе каталога, содержащего запись об этом файле. Последний элемент списка кластеров содержит признак конца файла (EOF – End Of File). Первые два элемента FAT являются резервными.

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

Существуют следующие типы FAT – FAT12, FAT16, FAT32. Названия типов FAT ведут свое происхождение от размера элемента: элемент FAT12 имеет размер 12 бит (1,5 байт), FAT16 – 16 бит (2 байта), FAT32 – 32 бита (4 байта). В FAT32 четыре старших двоичных разряда зарезервированы и игнорируются в процессе работы операционной системы.

За таблицами размещения файлов следует корневой каталог. Каждому файлу и подкаталогу в корневом каталоге соответствует 32-байтный элемент каталога (directory entry), содержащий имя файла, его атрибуты (архивный, скрытый, системный и «только для чтения»), дату и время создания (или внесения в него последних изменений), а также прочую информацию. Для файловых систем FAT12 и FAT16 положение корневого каталога на разделе и его размер жестко зафиксированы. В FAT32 корневой каталог может быть расположен в любом месте области данных раздела и иметь произвольный размер.

Форматы имен файлов

Структура элемента каталога для короткого имени файла представлена в таблице 1.

Первый байт короткого имени выполняет функции признака занятости каталога:

  • если первый байт равен 0xE5, то элемент каталога свободен и его можно использовать при создании нового файла;
  • если первый байт равен 0x00, то элемент каталога свободен и является началом чистой области каталога (после него нет ни одного задействованного элемента).

Таблица 1. Структура элемента каталога для короткого имени файла

На использование ASCII-символов в коротком имени накладывается ряд ограничений:

  • нельзя использовать символы с кодами меньше 0x20 (за исключением кода 0x05 в первом байте короткого имени);
  • нельзя использовать символы с кодами 0x22, 0x2A, 0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x5B, 0x5C, 0x5D, 0x7C;
  • нельзя использовать символ пробела (0x20) в первом байте имени.

В файловых системах FAT32 и VFAT (виртуальная FAT, расширение FAT16) включена поддержка длинных имен файлов (long file name, LFN). Для хранения длинного имени используются элементы каталога, смежные с основным элементом. Имя файла записывается не ASCII-символами, а в Unicode. В одном элементе каталога можно сохранить фрагмент длиной до 13 символов Unicode. Неиспользованный участок последнего фрагмента заполняется кодами 0xFFFF. Структура элемента каталога для длинного имени файла представлена в таблице 2.

Таблица 2. Структура элемента каталога для длинного имени файла

В первом секторе логического диска с системой FAT располагается загрузочный сектор и блок параметров BIOS. Начальный участок данного блока для всех типов FAT идентичен (таблица 3). Различия в структуре загрузочных секторов для разных типов FAT начинаются со смещения 0x24. Для FAT12 и FAT16 структура имеет вид, показанный в таблице 4, для FAT32 – в таблице 5.

Таблица 3. Начальный участок загрузочного сектора

Таблица 4. Структура загрузочного сектора FAT12/FAT16

Смещение Размер, байт Описание 0x24 1 Номер дисковода для прерывания 0х13 0x25 1 0x26 1 Признак расширенной загрузочной записи (0x29) 0x27 4 Номер логического диска 0x2B 11 Метка диска 0x36 8 Текстовая строка с аббревиатурой типа файловой системы

Таблица 5. Структура загрузочного сектора FAT32

Размер, байт Описание 4 Количество секторов, занимаемых одной копией FAT 2 Номер активной FAT 2 Номер версии FAT32: старший байт - номер версии, младший – номер ревизии. В настоящее время используется значение 0:0 4 Номер кластера для первого кластера корневого каталога 2 Номер сектора структуры FSINFO в резервной области логического диска 2 Номер сектора(в резервной области логического диска), используемого для хранения резервной копии загрузочного сектора 12 Зарезервировано (содержит 0)

Кроме перечисленных в таблицах 2-го и 3-го полей, нулевой сектор логического диска должен содержать в байте со смещением 0x1FE код 0x55, а в следующем байте (смещение 0x1FF) – код 0xAA. Указанные два байта являются признаком загрузочного диска.

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

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

Таблица 6. Структура сектора FSInfo и резервного загрузочного сектора FAT32

Размер, байт Описание 4 Значение 0x41615252 – сигнатура, которая служит признаком того, данный сектор содержит структуру FSInfo 480 Зарезервировано (содержит 0) 4 Значение 0x61417272 (сигнатура) 4 Содержит текущее число свободных кластеров на диске. Если в поле записано значение 0xFFFFFFFF, то число свободных кластеров неизвестно, и его необходимо вычислять 4 Содержит номер кластера, с которого дисковый драйвер должен начинать поиск свободных кластеров. Если в поле записано значение 0xFFFFFFFF, то поиск свободных кластеров нужно начинать с кластера номер 2 12 Зарезервировано (содержит 0) 4 Сигнатура 0xAA550000 – признак конца структуры FSInfo

Для доступа к содержимому файла, находящемуся на разделе с файловой системой FAT, необходимо получить номер первого кластера файла. Этот номер, как мы уже установили, входит в состав элемента каталога, содержащего запись о файле. Номеру первого кластера соответствует элемент таблицы FAT, в котором хранится адрес кластера, содержащего следующую часть файла. Элемент FAT, соответствующий последнему кластеру в цепочке, содержит сигнатуру конца файла. Для FAT12 это значение составляет 0xFFF, для FAT16 – 0xFFFF, для FAT32 – 0xFFFFFFFF.

Рассмотрим программную реализацию алгоритма чтения для каждого типа FAT, и начнём с FAT16.

Все исходные тексты, рассматриваемые в статье, доступны на сайте журнала.

Программная реализация алгоритма чтения файла с логического раздела с файловой системой FAT16

Разработаем модуль, выполняющий чтение N первых кластеров файла, созданного на разделе с файловой системой FAT16. Параметр N (число кластеров для считывания) является переменной величиной и задается пользователем. Имя файла соответствует формату «8.3», т.е. является коротким. Модуль функционирует под управлением ОС Linux.

Определим необходимые заголовочные файлы:

Заголовочный файл split.h имеет следующее содержание:

__u8 name[9]; // имя файла

__u8 ext[4]; // расширение файла

int name_len, // длина имени файла

ext_len; // длина расширения файла

Cтруктура split_name предназначена для хранения составных частей короткого имени файла (имени и расширения) и их длин.

В заголовочном файле определены структурные типы, описывающие основные компоненты файловой системы FAT – загрузочный сектор, сектор FSInfo, структуры элементов каталога для короткого и длинного имён файлов.

Рассмотрим кратко поля, которые входят в каждую из этих структур.

    1. Структура загрузочного сектора struct fat_boot_sector:
      • __s8 system_id[8] – системный идентификатор;
      • __u8 sector_size[2] – размер сектора в байтах;
      • __u8 cluster_size – размер кластера в секторах;
      • __u16 reserved – число резервных секторов в резервной области раздела;
      • __u8 fats – количество копий FAT;
      • __u8 dir_entries[2] – количество 32-байтных дескрипторов файлов в корневом каталоге;
      • __u8 sectors[2] – число секторов на разделе; если это поле равно 0, используется поле total_sect;
      • __u8 media – тип носителя, на котором создана файловая система;
      • __u16 fat_length – размер FAT в секторах;
      • __u32 total_sect – размер раздела FAT в секторах (если поле sectors == 0).
      • __u32 fat32_length – размер FAT32 в секторах;
      • __u32 root_cluster – номер первого кластера корневого каталога;
      • __u16 info_sector – номер сектора, содержащего структуру FSInfo.

    Следующие поля данной структуры используются только FAT32:

    1. Структура сектора FSInfo struct fat_boot_fsinfo:
      • __u32 signature1 – сигнатура 0x41615252;
      • __u32 signature2 – сигнатура 0x61417272;
      • __u32 free_clusters – количество свободных кластеров. Если поле содержит -1, поиск свободных кластеров нужно начинать с кластера номер 2.
    2. Структура элемента каталога короткого имени struct msdos_dir_entry:
      • __s8 name[8],ext[3] – имя и расширение файла;
      • __u8 attr – атрибуты файла;
      • __u8 ctime_ms – это поле уточняет время создания файла до мс (используется только FAT32);
      • __u16 ctime – время создания файла (используется только FAT32);
      • __u16 cdate – дата создания файла (используется только FAT32);
      • __u16 adate – дата последнего доступа к файлу (используется только FAT32);
      • __u16 starthi – старшие 16 бит номера первого кластера файла (используется только FAT32);
      • __u16 time,date,start – время и дата создания файла, номер первого кластер файла;
      • __u32 size – размер файла (в байтах).
    3. Структура элемента каталога длинного имени:
      • __u8 id – номер элемента;
      • __u8 name0_4[10] – символы 1 – 5 имени;
      • __u8 attr – атрибуты файла;
      • __u8 alias_checksum – контрольная сумма короткого имени;
      • __u8 name5_10[12] – символы 6 – 11 имени;
      • __u8 name11_12[4] – символы 12 – 13 имени.

    Продолжим рассмотрение программной реализации алгоритма и определим имя раздела, на котором создана файловая система FAT16:

    struct fat_boot_sector fbs; // структура загрузочного сектора

    struct msdos_dir_entry dentry; // структура элемента каталога

    __u16 *fat16; // сюда копируем таблицу FAT16

    __u16 sector_size; // размер сектора (из FAT16)

    __u16 dir_entries; // число 32-байтных дескрипторов

    // в root-каталоге (0 для FAT32)

    __u16 sectors; // общее число секторов в разделе

    __u32 fat16_size; // размер FAT16

    __u32 root_size; // размер корневого каталога

    __u32 data_start; // начало области данных

    __u16 byte_per_cluster; // размер кластера в байтах

    __u16 next_cluster; // очередной кластер в цепочке

    __u8 *dir_entry = NULL; // указатель на записи каталога

    int hard; // дескриптор файла устройства

    Начнём рассмотрение с главной функции:

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

    __u8 *full_path = "/Folder1/Folder2/text.txt";

    Открываем файл устройства:

    hard = open(FAT16_PART_NAME, O_RDONLY);

    Считываем первые 10 кластеров файла. Считывание выполняет функция fat16_read_file(). Параметры функции – полное имя файла и число кластеров для чтения. Функция возвращает число прочитанных кластеров или -1, если при чтении произошла ошибка:

    num = fat16_read_file(full_path, 10);

    if(num < 0) perror("fat16_read_file");

    else printf("Read %d clusters ", num);

    Закрываем файл устройства и выходим:

    Функция чтения кластеров файла имеет следующий вид:

    int fat16_read_file(__u8 *full_path, int num)

    struct split_name sn; // структура для хранения составных частей файла

    __u8 tmp_name_buff[SHORT_NAME]; // буфер для временного хранения составных элементов полного пути файла

    static int i = 1;

    __u16 start_cluster, next_cluster;

    Параметры функции мы перечислили при рассмотрении функции main.

    Подготовительные операции – обнуляем буфер tmp_name_buff и структуру struct split_name sn:

    memset(tmp_name_buff, 0, SHORT_NAME);

    memset((void *)&sn, 0, sizeof(struct split_name));

    Первым символом в абсолютном путевом имени файла должен быть прямой слэш (/). Проверяем это:

    if(full_path[0] != "/") return -1;

    Считываем с раздела загрузочный сектор:

    if(read_fbs() < 0) return -1;

    Считанный загрузочный сектор находится сейчас в глобальной структуре struct fat_boot_sector fbs. Скопируем из этой структуры размер сектора, число записей в корневом каталоге и общее число секторов на разделе:

    memcpy((void *)&sector_size, (void *)fbs.sector_size, 2);

    memcpy((void *)&dir_entries, (void *)fbs.dir_entries, 2);

    memcpy((void *)&sectors, (void *)fbs.sectors, 2);

    Определим размер кластера в байтах:

    byte_per_cluster = fbs.cluster_size * 512

    Отобразим информацию, находящуюся в загрузочном секторе:

    printf("System id - %s ", fbs.system_id);

    printf("Sector size - %d ", sector_size);

    printf("Cluster size - %d ", fbs.cluster_size);

    printf("Reserved - %d ", fbs.reserved);

    printf("FATs number - %d ",fbs.fats);

    printf("Dir entries - %d ", dir_entries);

    printf("Sectors - %d ", sectors);

    printf("Media - 0x%X ", fbs.media);

    printf("FAT16 length - %u ", fbs.fat_length);

    printf("Total sect - %u ", fbs.total_sect);

    printf("Byte per cluster - %d ", byte_per_cluster);

    Вычисляем размер FAT16 в байтах и считываем её:

    fat16_size = fbs.fat_length * 512;

    if(read_fat16() < 0) return -1;

    Считываем корневой каталог:

    if(read_root_dentry() < 0) return -1;

    Сейчас указатель dir_entry позиционирован на область памяти, содержащую записи корневого каталога. Размер этой области памяти равен размеру корневого каталога (root_size).

    Сохраним (для контроля) содержимое корневого каталога в отдельном файле:

    fat = open("dir16", O_CREAT|O_WRONLY, 0600);

    write(fat, dir_entry, root_size);

    Вычисляем начало области данных:

    data_start = 512 * fbs.reserved + fat16_size * fbs.fats + root_size;

    Имея все записи корневого каталога, мы можем добраться до содержимого файла test.txt. С этой целью организуем цикл. В теле цикла проведем разбор полного имени файла, выделяя его элементы – подкаталоги (их у нас два, Folder1 и Folder2) и имя искомого файла (test.txt).

    memset(tmp_name_buff, 0, SHORT_NAME);

    memset((void *)&sn, 0, sizeof(struct split_name));

    for(n = 0 ; n < SHORT_NAME; n++, i++)

    Заполняем структуру struct split_name sn соответствующей информацией. Заполнение выполняет функция split_name, при этом выполняется проверка имени файла на соответствие формату «8.3»:

    if(split_name(tmp_name_buff, &sn) < 0)

    printf("not valid name ");

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

    printf("No such file! ");

    Проверяем атрибуты файла. Если это каталог, считываем его содержимое и продолжаем цикл:

    if(read_directory(dentry.start) < 0) return -1;

    Если это файл – считываем первые num кластеров. Для контроля считанную информацию сохраним в отдельном файле:

    tmp_buff = (__u8 *)malloc(byte_per_cluster); // сюда будет считываться содержимое кластера

    n = open("clust", O_CREAT|O_RDWR, 0600); // в этом файле сохраним считанную информацию

    printf("file`s first cluster - 0x%X .. ", start_cluster);

    Для считывания кластеров файла организуем цикл:

    for(i = 0; i < num; i++)

    memset(tmp_buff, 0, byte_per_cluster);

    Считываем содержимое кластера в буфер tmp_buff и сохраняем его в отдельном файле:

    if(read_cluster(start_cluster, tmp_buff) < 0) return -1;

    if(write(n, tmp_buff, byte_per_cluster) < 0)

    Считываем из FAT16 номер следующего кластера, занятого под данный файл. Если это последний кластер – прерываем цикл и возвращаемся в главную функцию:

    Читайте также: