Особенности файловых систем FAT32, NTFS и exFAT. Форматирование флешки в FAT32 или NTFS — что лучше

NTFS, FAT или exFAT это совершенно разные файловые системы, которые могут использоваться для хранения данных на различных носителях. Обе созданы в компании Microsoft и в основном используются для Windows, но поддержка в ядре Linux для них тоже есть.

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

Файловая система устанавливает основные правила того как будут организованны данные при записи на носитель, независимо от того, что это - жесткий диск или флеш накопитель. Файловая система описывает каким образом будут организованы папки.

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

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

Файловые системы fat32 и ntfs очень сильно отличаются. FAT расшифровывается как File Allocation Table. Это очень давняя файловая система в истории вычислительных систем. Ее история началась в 1977 году. Тогда была разработана 8 битная файловая система, которая использовалась в NCR 7200 на основе Intel 8080. Это был терминал ввода, который работал с гибкими дисками. Файловая система была написана сотрудником Microsoft, Марком Макдональдом после обсуждения ее концепции с Билом Гейтсом.

Затем файловая система FAT начала использоваться в операционной системе MDOS для платформы Z80. Спустя несколько лет были выпущены новые версии, такие как FAT12, FAT16 и FAT32.

FAT32 увеличила максимальный размер тома до 16 Тб, по сравнению с FAT16. Также был увеличен размер файла до 4 Гб. File Allocation Table 32 бит вышла в августе 1995 года для Windows 95. Но эта файловая система все еще не может использоваться для установки тяжелых приложений или хранения больших файлов. Поэтому Microsoft разработала новую файловую систему - NTFS, которая лишена таких недостатков.

FAT32 - это отличная файловая система для внешних носителей, если вам нужно передавать файлы размером не более чем 4 Гб. Она поддерживается множеством различных устройств, таких как фотоаппараты, камеры, музыкальные плееры. Все версии Windows и дистрибутивы Linux полностью поддерживают FAT32. Даже Apple MacOS ее поддерживает.

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

Для своих новых систем Microsoft разработала новую файловую систему - New Technology File System или NTFS. Она появилась в 1993 году, в Windows NT 3.1. NTFS сняла многие ограничения на размеры файлов и диска. Ее разработка началась еще в далеком 1980 году, в результате объединения Microsoft и IBM для создания новой файловой системы с улучшенной производительностью.

Но сотрудничество компаний продлилось недолго, и IBM выпустила HPFS, которая использовалась в OS/2, а в Microsoft создали NTFS 1.0. Максимальный размер одного файла в NTFS может достигать 16 экзабайт, а это значит, что в ней поместятся даже самые большие файлы.

NTFS 3.1 была выпущена для Windows XP и получила множество интересных улучшений, таких как поддержку уменьшения размера разделов, автоматическое восстановление и символические ссылки, а максимальный размер диска с файловой системой увеличен до 256 ТБ. Это несмотря на максимальный размер файла в 16 Эб.

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

Сейчас это журналируемая файловая система, все действия с файлами заносятся в специальный журнал, с помощью которого файловая система может быть очень быстро восстановлена при повреждениях. NTFS поддерживается в Windows XP и более поздних версиях. Если сравнивать fat или ntfs, то последняя в Linux поддерживается не полностью, возможна запись и восстановление при повреждениях, а в MacOS поддерживается только чтение.

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

Файловая система exFAT - это еще один проект Microsoft по улучшению старой файловой системы. Ее можно исполосовать там, где не подходит FAT32. Она намного легче за NTFS, но поддерживает файлы размером более 4 Гб, и тоже часто применяется на флешках и накопителях. При ее разработке Microsoft использовала свою технологию поиска имен файлов по хэшу, что очень сильно улучшает производительность.

Большинство стран признают патентное право США, поэтому любая реализация exFAT невозможна в любых системах с закрытым или открытым исходным кодом. Но Microsoft хочет чтобы эта файловая система свободно распространялась и использовалась. Поэтому была разработана версия exFAT на основе FUSE под названием fuse-exfat. Она дает полный доступ на чтение и запись. Также была создана реализация на уровне ядра Linux в Samsung, которая сейчас тоже есть в открытом доступе.

Эта файловая система тоже имеет максимальное ограничение на размер файла 16 ЭБ, но она намного легче и не имеет никаких дополнительных возможностей. Если говорить про совместимость, то она полностью поддерживается в Windows, MacOS, Android и Linux.

Различия FAT и Ntfs

А теперь рассмотрим основные различия FAT и NTFS в виде краткого резюме по каждой из файловых систем:

FAT32

  • Совместимость: Windows, Mac, Linux, игровые консоли, практически все устройства, имеющие USB порт;
  • Плюсы: кроссплатформенность, легкость;
  • Минусы: максимальный размер файла 4 ГБ и раздела 16 ГБ, не журналируемая;
  • Использование: внешние носители.

NTFS

  • Совместимость: Windows, Linux, Xbox One, и только чтение в Mac;
  • Плюсы: журналируемая, большие лимиты на размер раздела и файла, шифрование, автоматическое восстановление;
  • Минусы: ограниченная кроссплатформенность;
  • Использование: для установки Windows.

exFAT

  • Совместимость: Windows XP и выше, MacOS X 10.6.5, Linux (fuse), Android;
  • Плюсы: большой лимит на размер раздела и файла, легкая по сравнению с NTFS;
  • Минусы: Microsoft ограничивает ее использование лицензионным соглашением;
  • Использование: для внешних носителей и внешних жестких дисков.

Выводы

В этой статье мы выполнили сравнение fat и ntfs. Это очень разные файловые системы. Но понять какая файловая система лучше fat или ntfs сложно, с одной стороны NTFS имеет намного больше возможностей, но зато FAT более легкая и поддерживается везде, где это возможно. Для разделов данных в Linux, которые должны быть доступны в Windows лучше использовать FAT, а не NTFS, поскольку она поддерживается лучше. А по-вашему что лучше fat или ntfs для Linux?

ВЛАДИМИР МЕШКОВ

Архитектура файловой системы FAT

Общая характеристика файловой системы FAT. Структура раздела с файловой системой FAT

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

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

Одной из характеристик ранних версий FAT (FAT12 и FAT16) является использование коротких имен файлов. Короткое имя состоит из двух полей – 8-байтного поля, содержащего собственно имя файла, и 3-байтного поля, содержащего расширение (формат «8.3»). Если введенное пользователем имя файла короче 8 символов, то оно дополняется пробелами (код 0x20); если введенное расширение короче трёх байтов, то оно также дополняется пробелами.

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

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

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

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

Смещение

Размер (байт) Содержание
0x00 11 Короткое имя файла
0x0B 1 Атрибуты файла
0x0C 1 Зарезервировано для Windows NT.
0x0D 1 Поле, уточняющее время создания файла (содержит десятки миллисекунд). Поле обрабатывается только в FAT32
0x0E 1 Время создания файла. Поле обрабатывается только в FAT32
0x10 2 Дата создания файла. Поле обрабатывается только в FAT32
0x12 2 Дата последнего обращения к файлу для записи или считывания данных. Поле обрабатывается только в FAT32
0x14 2 Старшее слово номера первого кластера файла. Поле обрабатывается только в FAT32
0x16 2 Время выполнения последней операции записи в файл
0x18 2 Дата выполнения последней операции записи в файл
0x1A 2 Младшее слово номера первого кластера файла
0x1C 4 Размер файла в байтах

На использование 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. Структура элемента каталога для длинного имени файла

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

Загрузочный сектор

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

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

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

Таблица 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)

Смещение
0x24
0x28
0x2A
0x2С
0x30
0x32
0x34

Кроме перечисленных в таблицах 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

Смещение
0x000
0x004
0x1E4
0x1E8
0x1EC
0x1F0
0x1FC

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

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

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

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

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

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

#include

#include

#include

#include

#include

#include "split.h"

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

#include

#define SHORT_NAME 13 // максимальная длина короткого имени файла

struct split_name {

U8 name; // имя файла

U8 ext; // расширение файла

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

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

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

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

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

    1. Структура загрузочного сектора struct fat_boot_sector:
      • __s8 system_id – системный идентификатор;
      • __u8 sector_size – размер сектора в байтах;
      • __u8 cluster_size – размер кластера в секторах;
      • __u16 reserved – число резервных секторов в резервной области раздела;
      • __u8 fats – количество копий FAT;
      • __u8 dir_entries – количество 32-байтных дескрипторов файлов в корневом каталоге;
      • __u8 sectors – число секторов на разделе; если это поле равно 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,ext – имя и расширение файла;
    • __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 – символы 1 – 5 имени;
    • __u8 attr – атрибуты файла;
    • __u8 alias_checksum – контрольная сумма короткого имени;
    • __u8 name5_10 – символы 6 – 11 имени;
    • __u8 name11_12 – символы 12 – 13 имени.

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

#ifndef FAT16_PART_NAME

#define FAT16_PART_NAME "/dev/hda1"

#endif

Глобальные структуры:

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; // размер корневого каталога

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

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

int fat;

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

int main()

Int num;

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

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

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

Hard = open(FAT16_PART_NAME, O_RDONLY);

If(hard < 0) {

Perror(FAT16_PART_NAME);

Exit(-1);

Считываем первые 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);

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

Close(hard);

Return 0;

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

int fat16_read_file(__u8 *full_path, int num)

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

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

Static int i = 1;

Int n;

U8 *tmp_buff;

U16 start_cluster, next_cluster;

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

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

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

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

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

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

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

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).

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

#ifdef DEBUG

Close(fat);

#endif

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

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

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

While(1) {

Memset(tmp_name_buff, 0, SHORT_NAME);

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

For(n = 0 ; n < SHORT_NAME; n++, i++) {

If((tmp_name_buff[n] == "/") || (tmp_name_buff[n] == "?")) {

I++;

Break;

Tmp_name_buff[n] = "?";

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

< 0) {

Printf("not valid name ");

Return -1;

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

If(get_dentry(&sn) < 0) {

Printf("No such file! ");

Return -1;

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

If(dentry.attr & 0x10) {

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

Continue;

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

If(dentry.attr & 0x20) {

Start_cluster = dentry.start;

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

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

If(n < 0) {

Perror("open");

Return -1;

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

For(i = 0; i < num; i++) {

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

< 0) return -1;

< 0) {

Perror("write");

Close(n);

Return -1;

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

#ifdef DEBUG

Printf("OK. Readed ");

Printf("file`s next cluster - 0x%X .. ", next_cluster);

#endif

If(next_cluster == EOF_FAT16) {

#ifdef DEBUG

Printf("last cluster. ");

#endif

Free(tmp_buff);

Close(n);

Return ++i;

#ifdef DEBUG

Printf("stop reading ");

#endif

Return i;

Чтение загрузочного сектора FAT16 выполняет функция read_fbs(). Результат помещается в глобальную структуру fbs:

int read_fbs()

If(read(hard,(__u8 *)&fbs, sizeof(fbs)) < 0) return -1;

Return 0;

Чтение таблицы размещения файлов файловой системы FAT16 выполняет функция read_fat16():

int read_fat16()

U64 seek = (__u64)(fbs.reserved) * 512; // смещение к FAT16 от начала раздела

Fat16 = (void *)malloc(fat16_size);

If(pread64(hard, (__u8 *)fat16, fat16_size, seek) < 0) return -1;

Return 0;

Чтение корневого каталога выполняет функция read_root_dentry():

int read_root_dentry()

U64 seek = (__u64)fbs.reserved * 512 + fat16_size * fbs.fats; // смещение к корневому каталогу от начала раздела

Root_size = 32 * dir_entries; // вычисляем размер корневого каталога

Dir_entry = (__u8 *)malloc(root_size);

If(!dir_entry) return -1;

Memset(dir_entry, 0, root_size);

If(pread64(hard, dir_entry, root_size, seek) < 0) return -1;

Return 0;

Чтение кластера, принадлежащего файлу, выполняет функция read_cluster(). Входные параметры функции – номер кластера cluster_num и указатель на буфер __u8 *tmp_buff, куда нужно поместить результат чтения. Смещение к кластеру на разделе вычисляется по формуле (см. ):

SEEK = DATA_START + (CLUSTER_NUM - 2) * BYTE_PER_CLUSTER,

  • SEEK – смещение к кластеру на разделе
  • DATA_START – начало области данных
  • CLUSTER_NUM – порядковый номер кластера
  • BYTE_PER_CLUSTER – размер кластера в байтах

int read_cluster(__u16 cluster_num, __u8 *tmp_buff)

U64 seek = (__u64)(byte_per_cluster) * (cluster_num - 2) + data_start; // вычисляем смещение к кластеру

< 0) return -1;

Return 0;

Функция read_directory выполняет чтение записей каталога (не корневого) и помещает результат в область памяти, на которую настроен указатель dir_entry:

int read_directory(__u16 start_cluster)

Int i = 1;

U16 next_cluster;

For(; ;i++) {

Выделяем память для хранения содержимого каталога, считываем содержимое стартового кластера и получаем из таблицы FAT16 значение очередного кластера:

If(!dir_entry) return -1;

< 0) return -1;

Next_cluster = fat16;

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

#ifdef DEBUG

Printf("Next cluster - 0x%X ", next_cluster);

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

Write(fat, dir_entry, root_size);

Close(fat);

#endif

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

If(next_cluster & EOF_FAT16) break;

Start_cluster = next_cluster;

Return 0;

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

Int i = 0;

В глобальном буфере dir_entry находится массив элементов каталога, в котором мы собираемся искать запись файла (или каталога). Для поиска организуем цикл. В теле цикла производим копирование элементов каталога в глобальную структуру dentry и сравниваем значение полей name и ext этой структуры с соответствующими полями структуры struct split_name *sn. Совпадение этих полей означает, что мы нашли в массиве элементов каталога запись искомого файла:

for(; ; i++) {

If(!(memcmp(dentry.name, sn->name, sn->name_len)) &&

!(memcmp(dentry.ext, sn->ext, sn->ext_len)))

Break;

If(!dentry.name) return -1;

#ifdef DEBUG

Printf("name - %s ", dentry.name);

Printf("start cluster - 0x%X ", dentry.start);

Printf("file size - %u ", dentry.size);

Printf("file attrib - 0x%X ", dentry.attr);

#endif

Return 0;

Весь вышеприведенный код находится в каталоге FAT16, файл fat16.c. Для получения исполняемого модуля создадим Makefile следующего содержания:

INCDIR = /usr/src/linux/include

PHONY = clean

Fat16: fat16.o split.o

Gcc -I$(INCDIR) $^ -g -o $@

%.o: %.c

Gcc -I$(INCDIR) -DDEBUG -c $^

Clean:

Rm -f *.o

Rm -f ./fat16

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

В целом алгоритм чтения файла с раздела FAT12 идентичен алгоритму чтения файла с раздела FAT16. Отличие заключается в процедуре чтения элементов из таблицы FAT12. Таблица FAT16 рассматривалась нами как простой массив 16-разрядных элементов. Для чтения элементов таблицы FAT12 в предложен следующий алгоритм:

  • умножить номер элемента на 1.5;
  • извлечь из FAT 16-разрядное слово, используя в качестве смещения результат предыдущей операции;
  • если номер элемента четный, выполнить операцию AND над считанным словом и маской 0x0FFF. Если номер нечетный, сдвинуть считанное из таблицы слово на 4 бита в сторону младших разрядов.

Базируясь на этом алгоритме, реализуем функцию чтения элементов из таблицы FAT12:

int get_cluster(__u16 cluster_num)

U16 seek;

U16 clust;

Вычисляем смещение в таблице FAT12 и считываем из таблицы 16-разрядное слово:

Seek = (cluster_num * 3) / 2;

Memcpy((__u8 *)&clust, (__u8 *)(fat12 + seek), 2);

Если стартовый номер кластера – четное число, сдвигаем считанное из таблицы значение на 4 бита в сторону младших разрядов, если нечетное – суммируем его с 0x0FFF:

If(cluster_num % 2) clust >>= 4;

Else clust &= 0x0FFF;

Этот фрагмент можно также реализовать на ассемблере:

" xorw %%ax, %%ax "

" btw $0, %%cx "

" jnc 1f "

" shrw $4, %%dx "

" jmp 2f "

"1: andw $0x0FFF, %%dx "

"2: movw %%dx, %%ax "

:"=a" (next)

:"d" (clust), "c" (cluster_num));

Возвращаем результат:

Return clust;

Остановимся чуть подробнее на самом алгоритме. Предположим, что на разделе с FAT12 создан файл, который занимает 9-й и 10-й кластеры. Каждый элемент FAT12 занимает 12 бит. Т.к. из таблицы мы считываем 16-разрядные элементы, то смещение к 9-му элементу будет равно 13 байт (9 * 1.5 = 13, остаток отбрасываем), при этом младшие 4 разряда будут принадлежать 8-му элементу FAT. Их необходимо отбросить, а для этого достаточно сдвинуть считанный элемент на 4 бита в сторону младших разрядов, что и предусмотрено алгоритмом. Смещение к 10-му элементу будет равно 15 байт, и старшие 4 бита будут принадлежать 11-му элементу FAT. Чтобы их отбросить, необходимо выполнить операцию AND над 10-м элементом и маской 0x0FFF, что так же соответствует вышеприведенному алгоритму.

Исходные тексты модуля чтения файла с раздела FAT12 находятся в каталоге FAT12, файл fat12.c.

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

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

Логическая структура жесткого диска

Рассмотрим логическую структуру жесткого диска, соответствующую стандарту Microsoft – «основной раздел – расширенный раздел – разделы non-DOS».

Пространство на жестком диске может быть организовано в виде одного или нескольких разделов, а разделы могут содержать один или несколько логических дисков.

На жестком диске по физическому адресу 0-0-1 располагается главная загрузочная запись (Master Boot Record, MBR). В структуре MBR находятся следующие элементы:

  • внесистемный загрузчик (non-system bootstrap – NSB);
  • таблица описания разделов диска (таблица разделов, partition table, PT). Располагается в MBR по смещению 0x1BE и занимает 64 байта;
  • сигнатура MBR. Последние два байта MBR должны содержать число 0xAA55.

Таблица разделов описывает размещение и характеристики имеющихся на винчестере разделов. Разделы диска могут быть двух типов – primary (первичный, основной) и extended (расширенный). Максимальное число primary-разделов равно четырем. Наличие на диске хотя бы одного primary-раздела является обязательным. Extended-раздел может быть разделен на большое количество подразделов – логических дисков. Упрощенно структура MBR представлена в таблице 7. Таблица разделов располагается в конце MBR, для описания раздела в таблице отводится 16 байт.

Таблица 7. Структура MBR

Смещение Размер, байт 0 446 0x1BE 16 0x1CE 16 0x1DE 16 0x1EE 16 0x1FE 2

Структура записи элемента таблицы разделов показана в таблице 8.

Таблица 8. Структура записи элемента таблицы разделов

Смещение Размер, байт Содержание
0x00 1 Признак активности (0 - раздел не активный, 0x80 – раздел активный)
0x01 1 Номер головки диска, с которой начинается раздел
0x02 2 Номер цилиндра и номер сектора, с которых начинается раздел
0x04 1 Код типа раздела System ID
0x05 1 Номер головки диска, на которой заканчивается раздел
0x06 2 Номер цилиндра и номер сектора, которыми заканчивается раздел
0x08 4 Абсолютный (логический) номер начального сектора раздела
0x0C 4 Размер раздела (число секторов)

Первым байтом в элементе раздела идет флаг активности раздела (0 – неактивен, 0x80 – активен). Он служит для определения, является ли раздел системным загрузочным и есть ли необходимость производить загрузку операционной системы с него при старте компьютера. Активным может быть только один раздел. За флагом активности раздела следуют координаты начала раздела – три байта, означающие номер головки, номер сектора и номер цилиндра. Номера цилиндра и сектора задаются в формате прерывания Int 0x13, т.е. биты 0-5 содержат номер сектора, биты 6-7 – старшие два бита 10-разрядного номера цилиндра, биты 8-15 – младшие восемь бит номера цилиндра. Затем следует кодовый идентификатор System ID, указывающий на принадлежность данного раздела к той или иной операционной системе. Идентификатор занимает один байт. За системным идентификатором расположены координаты конца раздела – три байта, содержащие номера головки, сектора и цилиндра соответственно. Следующие четыре байта – это число секторов перед разделом, и последние четыре байта – размер раздела в секторах.

Таким образом, элемент таблицы раздела можно описать при помощи следующей структуры:

struct pt_struct {

U8 bootable; // флаг активности раздела

U8 start_part; // координаты начала раздела

U8 type_part; // системный идентификатор

U8 end_part; // координаты конца раздела

U32 sect_before; // число секторов перед разделом

U32 sect_total; // размер раздела в секторах (число секторов в разделе)

Элемент первичного раздела указывает сразу на загрузочный сектор логического диска (в первичном разделе всегда имеется только один логический диск), а элемент расширенного раздела – на список логических дисков, составленный из структур, которые именуются вторичными MBR (Secondary MBR, SMBR).

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

Вернемся к рассмотрению модуля чтения файла с раздела FAT32.

Заголовочные файлы:

#include

#include

#include

#include

#include

Сигнатура MBR:

#define SIGNATURE 0xAA55

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

#define DEVICE "/dev/hda"

Размер элемента таблицы разделов (16 байт):

#define PT_SIZE 0x10

Следующий массив структур устанавливает соответствие между кодом типа раздела и его символьным отображением:

struct systypes {

U8 part_type;

U8 *part_name;

struct systypes i386_sys_types = {

{0x00, "Empty"},

{0x01, "FAT12"},

{0x04, "FAT16 <32M"},

{0x05, "Extended"},

{0x06, "FAT16"},

{0x0b, "Win95 FAT32"},

{0x0c, "Win95 FAT32 (LBA)"},

{0x0e, "Win95 FAT16 (LBA)"},

{0x0f, "Win95 Ext"d (LBA)"},

{0x82, "Linux swap"},

{0x83, "Linux"},

{0x85, "Linux extended"},

{0x07, "HPFS/NTFS"}

Определим число элементов в массиве i386_sys_types при помощи макроса PART_NUM:

#define PART_NUM (sizeof(i386_sys_types) / sizeof(i386_sys_types))

Установим ограничение на количество логических дисков:

#define MAX_PART 20

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

struct pt_struct {

U8 bootable;

U8 start_part;

U8 type_part;

U8 end_part;

U32 sect_before;

U32 sect_total;

} pt_t;

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

U8 mbr; // сюда считаем MBR

Номер раздела, на котором создана файловая система FAT32:

#define FAT32_PART_NUM 5

Структуры загрузочного сектора, сектора FSInfo и элемента каталога (определены в файле ):

struct fat_boot_sector fbs;

struct fat_boot_fsinfo fsinfo;

struct msdos_dir_entry dentry;

U32 *fat32 = NULL; // сюда копируем таблицу FAT32

U16 sector_size; // размер сектора (из FAT32)

U16 dir_entries; // 0 для FAT32

U16 sectors; // число секторов на разделе

U32 fat32_size; // размер FAT32

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

U16 byte_per_cluster; // сколько байт в кластере (размер кластера в байтах)

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

U32 root_cluster; // ROOT cluster - начальный кластер корневого каталога

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

U64 start_seek = 0; // стартовое смещение к разделу (в байтах)

Главная функция:

int main()

Int num = 0;

Int cluster_num = 5; // сколько кластеров считывать из файла

U8 *full_path = "/Folder1/Folder2/readme"; // файл для считывания

Открываем устройство, получаем информацию о таблице разделов на устройстве и отображаем информацию о разделах:

Hard = open(DEV_NAME, O_RDONLY);

If(hard < 0) {

Perror(DEV_NAME);

Exit(-1);

If(get_pt_info(hard) < 0) {

Perror("get_pt_info");

Exit(-1);

Show_pt_info();

Вычисляем стартовое смещение к разделу:

Start_seek = (__u64)(pt_t.sect_before) * 512;

Считываем кластеры, принадлежащие файлу:

Num = fat32_read_file(full_path, cluster_num);

If(num < 0) perror("fat32_read_file");

Else printf("Read %d clusters\n", num);

Close(hard);

Return 0;

Информацию о таблице разделов считывает функция get_pt_info():

int get_pt_info(int hard)

Int i = 0;

U64 seek;

Считываем таблицу разделов из MBR и проверяем сигнатуру:

Read_main_ptable(hard);

If(check_sign() < 0) {

Printf("Not valid signature!\n");

Return -1;

Ищем идентификатор расширенного раздела. Если таковой имеется, вычисляем смещение к расширенному разделу и считываем информацию о логических дисках:

for(; i < 4; i++) {

If((pt_t[i].type_part == 0xF) || \

(pt_t[i].type_part == 0x5) || \

(pt_t[i].type_part == 0x0C)) {

Seek = (__u64)pt_t[i].sect_before * 512;

Read_ext_ptable(hard, seek);

Break;

Return 0;

Функция чтения таблицы разделов read_main_ptable():

void read_main_ptable(int hard)

If(read(hard, mbr, 512) < 0) {

Perror("read");

Close(hard);

Exit(-1);

Memset((void *)pt_t, 0, (PT_SIZE * 4));

Memcpy((void *)pt_t, mbr + 0x1BE, (PT_SIZE * 4));

Return;

Функция проверки сигнатуры check_sign():

int check_sign()

U16 sign = 0;

Memcpy((void *)&sign, (void *)(mbr + 0x1FE), 2);

#ifdef DEBUG

Printf("Signature - 0x%X\n", sign);

#endif

If(sign != SIGNATURE) return -1;

Return 0;

Функция чтения расширенной таблицы разделов:

void read_ext_ptable(int hard, __u64 seek)

Int num = 4; // начиная с этой позиции, массив структур pt_t будет заполняться информацией о логических дисках

U8 smbr;

Входные данные:

  • hard – дескриптор файла устройства;
  • seek – смещение к расширенному разделу от начала диска (в байтах).

Для получения информации о логических дисках организуем цикл:

For(;;num++) {

Считываем SMBR, находящуюся по смещению seek от начала диска:

Memset((void *)smbr, 0, 512);

Pread64(hard, smbr, 512, seek);

Заполняем два элемента таблицы pt_t, начиная с позиции num. Первый элемент будет указывать на логический диск, а второй – на следующую структуру SMBR:

Memset((void *)&pt_t, 0, PT_SIZE * 2);

Memcpy((void *)&pt_t, smbr + 0x1BE, PT_SIZE * 2);

Вносим поправку в поле «Номер начального сектора» – отсчет ведется от начала диска:

Pt_t.sect_before += (seek / 512);

Если код типа раздела равен нулю, то больше логических дисков нет:

If(!(pt_t.type_part)) break;

Вычисляем смещение к следующему SMBR:

Seek = ((__u64)(pt_t.sect_before + pt_t.sect_total)) * 512;

Return;

Функция show_pt_info() отображает информацию о найденных логических дисках на устройстве:

void show_pt_info()

Int i = 0, n;

#ifdef DEBUG

Printf("Число разделов на диске - %d\n", PART_NUM);

#endif

For(; i < MAX_PART; i++) {

If(!pt_t[i].type_part) break;

Printf("\nТип раздела %d - ", i);

For(n = 0; n < PART_NUM; n++) {

If(pt_t[i].type_part == i386_sys_types[n].part_type) {

Printf("%s\n", i386_sys_types[n].part_name);

Break;

If(n == PART_NUM) printf("unknown type\n");

Printf("Признак загрузки - 0x%X\n", pt_t[i].bootable);

Printf("Секторов в разделе %d - %d\n", i, pt_t[i].sect_total);

Printf("Секторов перед разделом %d - %d\n\n", i, pt_t[i].sect_before);

Return;

Чтение кластеров файла с раздела FAT32 выполняет функция fat32_read_file(). Эта функция имеет много общего с функцией fat16_read_file(), поэтому за подробными комментариями обратитесь к п. 6:

int fat32_read_file(__u8 *full_path, int num)

Struct split_name sn;

U8 tmp_name_buff;

Int i = 1, n;

U32 start_cluster, next_cluster;

U8 *tmp_buff;

Подготовительные операции – чистим буфер, структуру и проверяем первый слэш:

Memset(tmp_name_buff, 0, SHORT_NAME);

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

If(full_path != "/") return -1;

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

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

Memcpy((void *)§or_size, (void *)fbs.sector_size, 2);

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

Memcpy((void *)§ors, (void *)fbs.sectors, 2);

Считываем структуру FSInfo и отобразим сигнатуру, находящуюся в ней:

If(read_fs_info() < 0) return -1;

Printf("Signature1 - 0x%X\n", fsinfo.signature1);

Printf("Signature2 - 0x%X\n", fsinfo.signature2);

Fat32_size = fbs.fat32_length * 512; // размер FAT32 в байтах

Data_start = 512 * fbs.reserved + fat32_size * 2; // начало поля данных

Byte_per_cluster = fbs.cluster_size * 512; // размер кластера в байтах

Root_cluster = fbs.root_cluster; // номер кластера корневого каталога

Считываем FAT32:

If(read_fat32() < 0) return -1;

Выделяем память для записей каталога:

Dir_entry = (__u8 *)malloc(byte_per_cluster);

If(!dir_entry) return -1;

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

If(read_directory(root_cluster) < 0) return -1;

Проводим разбор полного пути файла и разделение каждого элемента на составляющие:

While(1) {

Memset(tmp_name_buff, 0, SHORT_NAME);

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

For(n = 0 ; n < SHORT_NAME; n++, i++) {

Tmp_name_buff[n] = full_path[i];

If((tmp_name_buff[n] == "/") || (tmp_name_buff[n] == "\0")) {

I++;

Break;

Tmp_name_buff[n] = "\0";

If(split_name(tmp_name_buff, &sn) < 0) {

Printf("not valid name\n");

Return -1;

If(get_dentry(&sn) < 0) {

Printf("No such file!\n");

Return -1;

Для получения стартового номера кластера в файловой системе FAT32 необходимо задействовать старшее слово номера первого кластера файла – поле starthi структуры dentry:

Start_cluster = (((__u32)dentry.starthi << 16) | dentry.start);

Проверяем байт атрибутов:

If(dentry.attr & 0x10) { // это каталог

If(read_directory(start_cluster) < 0) return -1;

Continue;

If(dentry.attr & 0x20) { // а это - файл

Tmp_buff = (__u8 *)malloc(byte_per_cluster);

N = open("clust", O_CREAT|O_RDWR, 0600);

If(n < 0) {

Perror("open");

Return -1;

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

For(i = 0; i < num; i++) {

Memset(tmp_buff, 0, byte_per_cluster);

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

If(write(n, tmp_buff, byte_per_cluster) < 0) {

Perror("write");

Return -1;

If(next_cluster == EOF_FAT32) {

Free(tmp_buff);

Close(n);

Return ++i;

Start_cluster = next_cluster;

Return i;

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

1) функция read_fbs() выполняет чтение загрузочного сектора:

int read_fbs()

If(pread64(hard, (__u8 *)&fbs, sizeof(fbs), start_seek) < 0) return -1;

Return 0;

2) функция read_fs_info() считывает структуру FSInfo:

int read_fs_info()

U64 seek = (__u64)fbs.info_sector * 512 + start_seek;

If(pread64(hard, (__u8 *)&fsinfo, sizeof(fsinfo), seek) < 0) return -1;

Return 0;

3) функция read_fat32() считывает таблицу FAT32:

int read_fat32()

U64 seek = (__u64)fbs.reserved * 512 + start_seek;

Fat32 = (void *)malloc(fat32_size);

If(!fat32) return -1;

If(pread64(hard, (__u8 *)fat32, fat32_size, seek) < 0) return -1;

Return 0;

Функция read_cluster() выполняет чтения кластера с указанным номером:

int read_cluster(__u32 cluster_num, __u8 *tmp_buff)

U64 seek = (__u64)(byte_per_cluster) * (cluster_num - 2) + data_start + start_seek;

If(pread64(hard, tmp_buff, byte_per_cluster, seek) < 0) return -1;

Return 0;

Чтением каталогов (в том числе и корневого) занимается функция read_directory():

int read_directory(__u32 start_cluster)

Int i = 2;

U32 next_cluster;

Параметры функции – стартовый кластер каталога. Считываем содержимое каталога в глобальный буфер dir_entry:

If(read_cluster(start_cluster, dir_entry) < 0) return -1;

Next_cluster = fat32;

Если каталог занимает один кластер – выходим, если нет – увеличиваем размер памяти и продолжаем чтение:

For(; ;i++) {

Start_cluster = next_cluster;

Dir_entry = (__u8 *)realloc(dir_entry, i * byte_per_cluster);

If(!dir_entry) return -1;

If(read_cluster(start_cluster, (dir_entry + (i - 1) * byte_per_cluster)) < 0) return -1;

Next_cluster = fat32;

If((next_cluster == EOF_FAT32) || (next_cluster == 0xFFFFFF8)) return 0;

Return 0;

Последняя функция, которую мы рассмотрим, ищет в содержимом каталога элемент, соответствующий искомому файлу:

int get_dentry(struct split_name *sn)

Int i = 0;

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

For(;;i++) {

Memcpy((void *)&dentry, dir_entry + i * sizeof(dentry), sizeof(dentry));

If(!(memcmp(dentry.name, sn->name, sn->name_len)) &&

!(memcmp(dentry.ext, sn->ext, sn->ext_len)))

Break;

If(!dentry.name) return -1;

Return 0;

На этом рассмотрение модуля чтения файла с раздела FAT32 завершим.

Исходные тексты модуля находятся в каталоге FAT32, файл fat32.c.

Отличия в организации хранения записей о файлах в каталогах для файловых систем FAT и EXT2

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

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

Рассмотрим, как обстоят дела в EXT2.

Предположим, у нас есть раздел с файловой системой EXT2, размер блока равен 4096 байт. На этом разделе мы создаем каталог. Размер каталога будет равен размеру блока – 4096 байт. В каталоге операционная система сразу создаёт две записи – запись текущего и запись родительского каталогов. Запись текущего каталога займет 12 байт, в то время как длина записи родительского будет равна 4084 байта. Создадим в этом каталоге какой-нибудь файл. После этого в каталоге будут присутствовать три записи – запись текущего каталога длиной 12 байт, запись родительского каталога длиной уже 12 байт, и запись созданного файла длиной, как вы наверно догадались, 4072 байт. Если мы удалим созданный файл, длина записи родительского каталога опять возрастёт до 4084 байт.

Таким образом, при создании файла драйвер файловой системы EXT2 ищет в каталоге запись максимальной длины и расщепляет её, выделяя место для новой записи. Ну, а если всё-таки места не хватает, под каталог отводится ещё один блок, и длина каталога становится равной 8192 байт.

И в заключение – небольшая правка к статье «Архитектура файловой системы EXT2» .

Эта правка касается функции определения номера inode по имени файла get_i_num(). Старый вариант этой функции выглядел так:

int get_i_num(char *name)

Int i = 0, rec_len = 0;

Struct ext2_dir_entry_2 dent;

For(; i < 700; i++) {

If(!memcmp(dent.name, name, dent.name_len)) break;

Rec_len += dent.rec_len;

Return dent.inode;

Исправленный вариант:

int get_i_num(char *name)

* Параметр функции - имя файла. Возвращаемое значение - номер inode файла.

Int rec_len = 0;

Struct ext2_dir_entry_2 dent; // эта структура описывает формат записи корневого каталога:

* В глобальном буфере buff находится массив записей каталога. Для определения порядкового номера inode файла необходимо найти

* в этом массиве запись с именем этого файла. Для этого организуем цикл:

For(;;) {

/* Копируем в структуру dent записи каталога: */

Memcpy((void *)&dent, (buff + rec_len), sizeof(dent));

* Длина имени файла равная нулю означает, что мы перебрали все записи каталога

* и записи с именем нашего файла не нашли. Значит, пора возвращаться:

If(!dent.name_len) return -1;

/* Поиск выполняется путем сравнения имен файлов. Если имена совпадают - выходим из цикла: */

If(!memcmp(dent.name, name, strlen(name))) break;

/* Если имена не совпали - смещаемся к следующей записи: */

Rec_len += dent.rec_len;

/* В случае успеха возвращаем номер inode файла: */

Return dent.inode;

Литература:

  1. В.Кулаков. Программирование на аппаратном уровне: специальный справочник. 2-е изд. / – СПб.: Питер, 2003 г. – 848 с.
  2. А.В.Гордеев, А.Ю.Молчанов. Системное программное обеспечение / – СПб.: Питер – 2002 г.
  3. Мешков В. Архитектура файловой системы ext2. – Журнал «Системный администратор», № 11(12), ноябрь 2003 г. – 26-32 с.

Вконтакте

До возникновения операционной системы Microsoft Windows NT у пользователей персональных компьютеров редко возникала проблема выбора файловой системы. Все владельцы операционных систем (ОС) MS-DOS и Microsoft Windows применяли одну из разновидностей файловой системы с названием FAT (FAT-12, FAT-16 или FAT-32).

Теперь же ситуация изменилась. Устанавливая ОС Microsoft Windows NT/2000/XP, при форматировании диска Вам необходимо сделать выбор между тремя файловыми системами - FAT-16, FAT-32 или NTFS.

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

Кратко о файловой системе FAT

Файловая система FAT появилась на заре развития персональных компьютеров и первоначально предназначалась для хранения файлов на дискетах.

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

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

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

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

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

При разработке формата таблицы FAT стояла задача экономии места, т.к. дискета имеет весьма небольшой объем (от 180 Кбайт до 2,44 Мбайт). Поэтому для хранения номеров кластера было отведено всего 12 двоичных разрядов. В результате таблицу FAT удалось упаковать так плотно, что она занимала всего один сектор дискеты.

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

Различные версии FAT

После появления жестких дисков большого объема (в те времена большими считались диски размером 10-20 Мбайт) количество кластеров увеличилось, и 12 разрядов стало недостаточно для хранения их номеров. Был разработан новый 16-разрядный формат таблицы размещения файлов, где для хранения номера одного кластера выделялось два байта. Старая файловая система, разработанная для дискет, стала называться FAT-12, а новая - FAT-16.

Увеличенная в размерах таблица FAT-16 перестала помещаться в одном секторе, однако при больших объемах диска этот недостаток не играл существенной роли. По-прежнему для страховки на диске хранилось две копии таблицы FAT.

Однако когда объем диска стал измеряться в сотнях Мбайт и даже в гигабайтах, файловая система FAT-16 опять стала неэффективной. Чтобы номера кластеров помещались в 16 разрядов, при форматировании дисков большого объема приходится увеличивать размер кластера до 16 Кбайт и даже больше. Это вызывало проблемы при необходимости хранения на диске большого количества маленьких файлов. Так как пространство для хранения файлов выделяется кластерами, даже для очень маленького файла приходится отводить слишком много дисковой памяти.

В результате была предпринята еще одна, по всей видимости, последняя попытка усовершенствования файловой системы FAT - размер ячейки таблицы размещения файлов был увеличен до 32. Это позволило форматировать диски размером в сотни Мбайт и единицы Гбайт с использованием относительно небольшого размера кластера. Новая файловая система стала называться FAT-32.

Стандарт 8.3

До появления ОС Microsoft Windows 95 пользователи персональных компьютеров были вынуждены использовать для именования файлов весьма неудобный "стандарт 8.3", в котором имя файла должно было состоять из 8 символов плюс 3 символа расширения. Это ограничение накладывалось не только программным интерфейсом операционной системы MS-DOS, но и структурой записи каталога файловой системы FAT.

После модификации структуры записей каталога ограничение на количество символов в имени файла было практически снято. Теперь длина имени файла может достигать 255 символов, что, очевидно, достаточно в большинстве случаев. Однако такая модифицированная файловая система FAT стала несовместима с операционной системой MS-DOS, а также с работающей в ее среде оболочкой Microsoft Windows версий 3.1 и 3.11.

Более подробно о форматах внутренних структур FAT Вы можете прочитать в нашей статье "Восстановление данных в разделах FAT", опубликованных на этом сайте.

Ограничения файловой системы FAT

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

Максимальный размер логического диска FAT-16 составляет 4 Гбайт, что очень мало по современным понятиям. Компания Microsoft, однако, не рекомендует создавать диски FAT-16 размером более 200 Мбайт, т.к. при этом дисковое пространство будет использоваться очень неэффективно.

Теоретически максимальный размер диска FAT-32 может составлять 8 Тбайт, что должно хватить для развертывания любых современных приложений. Это значение получается путем перемножения максимального количества кластеров (268 435 445) на максимальный размер кластера, допустимый в FAT-32 (32 Кбайт).

Однако на практике ситуация выглядит немного по-другому.

Из-за внутренних ограничений утилита ScanDisk в ОС Microsoft 95/98 не способна работать с дисками, превышающими по своему объему значение 127.53 Гбайт. Еще год назад такое ограничение не вызвало бы проблем, однако сегодня на рынке уже появились недорогие диски объемом 160 Гбайт, и скоро их объем будет еще больше.

Что же касается новых операционных систем Microsoft Windows 2000/XP, то они не способны создавать разделы FAT-32 с объемом, превышающим 32 Гбайт. Если Вам нужны разделы такого или большего объема, компания Microsoft предложит Вам использовать файловую систему NTFS.

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

В каталоге FAT-32 может хранить не более 65534 файлов.

Недостатки FAT

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

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

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

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

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

Современная файловая система NTFS, разработанная компанией Microsoft для своей операционной системы Microsoft Windows NT, лишена ограничений и недостатков FAT. С момента своего возникновения развивающаяся файловая система NTFS претерпела несколько усовершенствований, последние из которых (на момент создания этой статьи) были сделаны в ОС Microsoft Windows XP.

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

Файлы небольшого размера (порядка сотен байт) хранятся непосредственно в $MFT, что существенно ускоряет доступ к ним.

Заметим, однако, что накладные расходы NTFS на хранение системной информации, хотя и превышают накладные расходы FAT, все же не очень велики по сравнению с объемом современных дисков. Из-за того, что файл $MFT обычно располагается ближе к середине диска, разрушение первых дорожек диска NTFS не приводит к таким фатальным последствиям, как разрушение начальных областей диска FAT.

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

Перечислим некоторые, наиболее интересные возможности NTFS современных версий.

Средства разграничения доступа

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

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

Шифрование файлов

Упомянутые выше средства разграничения доступа окажутся бесполезными, если физический диск NTFS попадет в руки злоумышленнику. С использованием современных утилит содержимое такого диска может быть без особого труда прочитано в среде любой операционной системе - DOS, Microsoft Windows или Linux.

С целью обезопасить фалы пользователей от несанкционированного доступа, в операционных системах Microsoft Windows 2000/XP предусмотрено дополнительное шифрование файлов, хранящихся в разделах NTFS. И хотя стойкость такого шифрования, возможно, не слишком высока, она вполне достаточна в большинстве случаев.

Программный дисковый массив RAID

Средствами NTFS можно создать так называемый программный массив RAID 1 (Mirrored set). Этот массив, составляемый из двух физических или логических дисков одинакового объема, позволяет дублировать (или, как еще говорят, "зеркалировать") файлы.

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

Наборы Volume Set

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

Наборы, созданные из нескольких разделов или физических дисков, называются Volume Set (в терминологии ОС Microsoft Windows NT) или Spanned Volume (в терминологии ОС Windows 2000/XP).

Упаковка файлов

Для экономии дискового пространства можно использовать способность NTFS упаковывать (сжимать) файлы. Помимо этого NTFS позволяет создавать так называемые разреженные (sparse) файлы, которые содержат области нулевых данных. Такие файлы могут иметь большой объем, но при этом занимать мало места на диске, так как фактически хранятся только значащие байты файла.

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

Многопоточные файлы

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

Жесткие связи

Жесткие связи (hard links) позволяют назначать для одного физического файла несколько разных имен, располагая эти имена (т.е. ссылки на файл) в разных каталогах. При удалении связи не происходит удаления самого файла. Только когда все связи файла будут уничтожены, тогда будет удален и сам файл.

Заметим, что подобные возможности характерны для файловых систем, применяемых в Unix-подобных ОС, например, в Linux, FreeBSD и т.д.

Точки переопределения

Такие системные объекты NTFS, как точки переопределения (reparse points) позволяют переопределить любой файл или каталог. При этом, например, редко используемые переопределенные файлы или каталоги фактически могут храниться на магнитной ленте, загружаясь на диск только при необходимости.

Переходы

Пользуясь переходами NTFS, можно смонтировать в каталог диска другой жесткий диск или компакт-диск. Эта возможность первоначально существовала в файловых системах Unix-подобных ОС.

Квотирование дискового пространства

Файловая система NTFS, использованная в ОС Microsoft Windows 2000/XP, позволяет квотировать, или ограничивать дисковое пространство, предоставляемое в распоряжение пользователей. Такая возможность особенно полезна при создании файловых серверов.

Ведение журнала изменений

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

Ограничения NTFS

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

Максимальный размер логического диска NTFS составляет примерно 18 446 744 Тбайт, что, очевидно, достаточно для всех современных приложений, а также приложений, которые появятся в ближайшем будущем. Максимальный размер файла еще больше, так что это ограничение также несущественно.

Количество файлов, хранящихся в одном каталоге NTFS, ничем не ограничено, так что здесь тоже есть преимущество перед FAT.

Сравнение NTFS и FAT по скорости доступа к файлам

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

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

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

Для увеличения производительности NTFS можно увеличить размер кластера, однако это может привести к неэкономному использованию дискового пространства при хранении большого количества файлов, размер которых превышает 1-2 Кбайт и составляет десятки Кбайт. При увеличении размера кластера до 64 Кбайт можно получить максимальное повышение производительности, однако придется отказаться от упаковки файлов и применения утилит дефрагментации.

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

Так что же выбрать - FAT или NTFS?

Как видите, NTFS имеет многочисленные преимущества перед FAT, а ее ограничения в большинстве случаев несущественны. Если Вы стоите перед выбором файловой системы, рассмотрите в первую очередь возможность использования NTFS, и только потом - FAT.

Какие могут быть препятствия, затрудняющие замену FAT на NTFS?

Наиболее серьезное препятствие - необходимость использования ОС Microsoft Windows NT/2000/XP. Для нормальной работы этой ОС требуется как минимум 64 Мбайт оперативной памяти и процессор с тактовой частотой не ниже 200-300 Мгц. Впрочем, этим требованиям не удовлетворяют лишь очень старые компьютеры, не способные работать под управлением ОС Microsoft Windows современных версий.

Если же Ваш компьютер может работать в среде Microsoft Windows 2000/XP, и у Вас нет ни одного прикладного приложения, рассчитанного исключительно на ОС Microsoft Windows 95/98/ME, мы рекомендуем Вам при первой же возможности перейти к новой операционной системе, заменив при этом FAT на NTFS.

При этом Вы также получите заметное увеличение надежности работы, т.к. после установки всех необходимых пакетов исправлений (Service Pack), а также корректных версий драйверов периферийных устройств, ОС Microsoft Windows 2000/XP будет работать очень стабильно.

В некоторых случаях приходится совмещать в рамках одного физического диска несколько файловых систем. Например, если на Вашем компьютере установлено три операционные системы Microsoft Windows ME, Microsoft Windows XP и Linux, можно создать три файловые системы - FAT, NTFS и Ext2FS. Первая из них будет "видна" при работе в Microsoft Windows ME и Linux, вторая - только в Microsoft Windows XP, и третья - только в Linux (заметим, что в ОС LINUX существует также возможность доступа к разделам NTFS).

Но если Вы создаете сервер (файловый, базы данных или Web) на базе ОС Microsoft Window NT/2000/XP, то единственным разумным выбором будет NTFS. Только в этом случае удастся добиться необходимой стабильности, надежности и защищенности сервера.

Существует также общепринятое (и на наш взгляд, ошибочное) мнение, что домашним пользователям компьютеров не нужна ни ОС Microsoft Window NT/2000/XP, ни файловая система NTFS.

Конечно, если компьютер применяется исключительно для игр, из соображений совместимости лучше всего установить Microsoft Windows 98/ME и отформатировать диски в FAT. Однако если Вы работаете не только в офисе, но и дома, лучше использовать современные, профессиональные и надежные решения. Это позволит, в частности, организовать защиту от вторжения на Ваш компьютер через Интернет, ограничить доступ к каталогам и файлам с критичными данными, а также повысит шансы на успешное восстановление информации при возникновении различного рода сбоев.

Порой, чтение информации, воспроизведение музыки и фильмов с флешки или внешнего жесткого диска на всех устройствах, а именно: компьютере, бытовом DVD проигрывателе или телевизоре, Xbox или PS3, а также в магнитоле автомобиля может вызвать некоторые проблемы. Здесь поговорим о том, какую файловую систему лучше всего использовать, чтобы флешка всегда и везде читалась без проблем.

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

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

Помимо общеизвестных FAT32 и NTFS, а также несколько менее знакомых рядовому пользователю HFS+, EXT и других файловых систем, существуют еще десятки различных ФС, созданных для различных устройств определенного назначения. На сегодняшний день, когда большинство людей имеют дома более одного компьютера и других цифровых устройств, на которых могут использоваться операционные системы Windows, Linux, Mac OS X, Android и другие, вопрос о том, как отформатировать флешку или иной переносной диск так, чтобы он читался во всех этих устройствах, является достаточно актуальным. И с этим возникают проблемы.

Совместимость

В настоящее время существует две наиболее распространенных файловых системы (для России) - это NTFS (Windows), FAT32 (старый стандарт Windows). Также могут использоваться файловые системы Mac OS и Linux.

Логичным было бы предположить, что современные операционные системы будут работать с файловыми системами друг друга по умолчанию, но в большинстве случаев это не так. Mac OS X не может записывать данные на диск, отформатированный в NTFS. Windows 7 не распознает диски HFS+ и EXT и либо игнорирует их, либо сообщает о том, что диск не отформатирован.

Многие дистрибутивы Linux, например, Ubuntu поддерживают большинство файловых систем по умолчанию. Копирование из одной системы в другую является обычным процессом для Linux. Большинство дистрибутивов поддерживают HFS+ и NTFS «из коробки» либо их поддержка устанавливается одним бесплатным компонентом.

Кроме этого, игровые консоли, такие как Xbox 360 или Playstation 3 предоставляют лишь ограниченный доступ к определенным файловым системам, и позволяют только считывать данные с USB носителя. Чтобы ознакомиться с тем, какие файловые системы и какими устройствами поддерживаются, взгляните на эту таблицу.

Windows XP Windows 7/Vista Mac OS Leopard Mac OS Lion/Snow Leopard Ubuntu Linux Playstation 3 Xbox 360
NTFS(Windows) Да Да Только чтение Только чтение Да Нет Нет
FAT32(DOS, Windows) Да Да Да Да Да Да Да
exFAT(Windows) Да Да Нет Да Да, с пакетом ExFat Нет Нет
HFS+(Mac OS) Нет Нет Да Да Да Нет Да
EXT2, 3(Linux) Нет Нет Нет Нет Да Нет Да

Стоит отметить, что в таблицы отражены возможности ОС по работе с файловыми системами по умолчанию. Как в Mac OS, так и в Windows вы можете загрузить дополнительное программное обеспечение, которое позволит работать с неподдерживаемыми форматами.

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

Ограничения на размер файлов в файловых системах

Файловая система FAT32 была разработана достаточно давно и основывается на предыдущих версиях FAT, изначально применявшейся в ОС DOS. Дисков с сегодняшними объемами в то время не существовало, а потому каких-то предпосылок для того, чтобы обеспечить поддержку файлов размером более 4Гб файловой системой не было. На сегодняшний день, многим пользователям приходится сталкиваться с проблемами из-за этого. Ниже вы можете посмотреть сравнение файловых систем по размерам поддерживаемых файлов и разделов.

Современные файловые системы расширили ограничения на размер файлов до пределов, которые пока трудно представить (посмотрим, что будет лет через 20).

Каждая новая система выигрывает у FAT32 по размерам отдельных файлов и отдельного раздела диска. Таким образом, возраст FAT32 сказывается на возможности ее применения для различных целей. Одно из решений - использование файловой системы exFAT, поддержка которых появляется во многих операционных системах. Но, так или иначе, для обычной USB флешки, если на ней не хранятся файлы размером более 4 Гб, FAT32 будет самым лучшим выбором, а флешка будет прочитана практически где угодно.

Файловая система — это основа, на базе которой происходят манипуляции с любыми данными, выполняемыми на компьютере, начиная загрузкой ОС и заканчивая чтением текстовых документов в блокноте. Эпоха первых Windows проблемы выбора файловой системы не ставила, так как она была представлена в одном единственном варианте — FAT16.

С появлением Windows 95 появилась альтернатива существующей файловой системе в виде fat32, но выбор не стал проблематичным, так как усовершенствованная версия была, очевидно, лучше предыдущей.

А вот уже появление Windows XP внесло смуту в ряды пользователей по поводу вопроса выбора между существующими файловыми системами. Актуальным стал вопрос, что лучше fat32 или ntfs? Сейчас и попытаемся в этом разобраться.

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

Файловая система осуществляет управление процессами хранения и доступа к файлам на компьютере. Главное понятие в этой системе называется кластером — определение минимального размера данных на диске.

Так, если «вес» файла — 1 байт, а размер кластера на жестком диске составляет 8 КБ, соответственно файл на винчестере займет один кластер. В том случае, если «вес» файла составит 8,1 КБ, на диске его размер уже будет занимать два кластера, то есть 16 КБ. А теперь представьте, какое количество файлов может содержаться на жестком диске, и вы поймете насколько велико значение кластера и всей файловой системы в процессе хранения информации. Особо в данном случае хочется отметить, что размеры кластера зависят от типа файловой системы.

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

FAT32 и ее особенности

Итак, fat32 что это и каковы ее главные характеристики? В теории размер диска этой системы имеет ограничение 8 ТБ. Но, практика показывает, что те средства администрирования, которые встроены в наиболее распространенные ОС — Windows 2000 и Windows XP не имеют возможности создания раздела большего, чем 32 ГБ. Впрочем, в большинстве случаев этого более чем достаточно. Максимальный объем файла в fat32 — не более 4 ГБ.

А сейчас обратимся к фактам не совсем приятным. В числе других, важная характеристика файловой системы – это ее стабильность, параметры устойчивости ко всевозможным ошибкам. fat32 тут особо похвастать нечем. Самой распространенной ошибкой в этой области становится неправильная запись данных, которые говорят об объеме свободного места. В fat16 этот параметр вычислялся, а в fat32 он просто записывается в загрузочной области. В этой ситуации, когда мы копируем, удаляем или перемещаем файл, наша операционная система не справляется с обновлением записи данных, которые содержат информацию о количестве свободного места на диске. Исправляется данная ошибка только применением специальной программы, которая осуществляет полную проверку жесткого диска.

NTFS и ее особенности

Если выбирать между fat32 или ntfs по параметрам ограничений размера винчестера, то последняя в этом пункте очевидно выигрывает, так как у нее этих ограничений не имеется. Устойчивость этой файловой системы тоже несколько более высока, она может пережить даже значительные повреждения поверхности винчестера.

Организация каталога в этой системе представлена специфическим файлом, который имеет ряд ссылок на другие файлы и системы каталогов. Подобная система во много раз сокращает временные затраты на поиски необходимого файла. По этому параметру выбор между ntfs или fat32 очевиден.

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

Преимущества этой системы по сравнению с fat32 весомы, но в большинстве случаев и возможности последней для пользователей оказываются более чем достаточными.

Как форматировать флешку в ntfs или в fat32

Для более наглядной иллюстрации возможностей файловых систем рассмотрим их на примере форматирования флешки. Вопрос выбора, что лучше в данном случае — форматирование флешки в ntfs или в fat32 не составляет сколь-нибудь значительной проблемы, так как ответ на него прост и очевиден. Так, если планируется запись на этот носитель файлов, объем которых превышает 4 ГБ, тогда форматировать флешку в ntfs будет более разумно. Если же объем записываемых файлов будет меньше указанного параметра, смело выбираем fat32, мы ведь помним, что для fat32 максимальный размер файла (max file size) = 4Gb.

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

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

Пошаговая инструкция по форматированию флешки

Существует определенное количество причин, по которым форматирование флешки становится необходимым:

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

Как флешку отформатировать в ntfs или fat32? Мероприятие не представляет особой сложности, в силу чего этот способ очень распространен. Вот пошаговая инструкция выполнения процесса:

  • вставляем носитель в компьютер;
  • находим его в папке «Компьютер»;
  • кликаем на обозначение правой кнопкой мыши;
  • в появившемся списке выбираем «форматировать»;

  • в появившемся окне выбираем тип файловой системы, с помощью которой вы бы хотели отформатировать носитель (о параметрах выбора мы говорили выше);

  • пункт «размер кластера» не меняем;
  • в пункт «метка тома» вписываем имя носителя;
  • для активизации процесса нажимаем «начать»;

  • после завершения процесса жмем «ок».

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



Понравилась статья? Поделиться с друзьями: