Потрібна файлова система NTFS. Файлові системи FAT, FAT16, FAT32

Потрібна файлова система NTFS. Файлові системи FAT, FAT16, FAT32

ВОЛОДИМИР МІШКІВ

Архітектура файлової системи 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;
  • не можна використовувати символ пробілу (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; // Довжина розширення файлу

Структура 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 була розглянута у .

З 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 с.

Крім решти завдань, виконує своє основне призначення - організує роботу з даними по певній структурі. Для цього використовується файлова система. Що таке ФС і якою вона може бути, а також інша інформація про неї буде подана далі.

Загальний опис

Файлова система є частиною операційної системи, яка несе відповідальність за розміщення, зберігання, видалення інформації на носіях, надання користувачам та додаткам цієї інформації, а також забезпечення її безпечного використання. Крім того, саме вона допомагає у відновленні даних у разі апаратного чи програмного збою. Тому така важлива файлова система. Що таке ФС і якою вона може бути? Є кілька видів:

Для жорстких дисків, тобто пристроїв із довільним доступом;

Для магнітних стрічок, тобто пристроїв із послідовним доступом;

Для оптичних носіїв;

Віртуальні системи;

Мережеві системи.5

Як логічна одиниця зберігання даних у файловій системі служить файл, тобто впорядкована сукупність даних, що має певне ім'я. Усі дані, що використовуються операційною системою, представлені у вигляді файлів: програми, зображення, тексти, музика, відео, а також драйвера, бібліотеки та інше. Кожен такий елемент має ім'я, тип, розширення, атрибути і розмір. Отже, тепер ви знаєте, Файлова система є сукупністю таких елементів, а також способи роботи з ними. Залежно від цього, як вона використовується і які принципи нею застосовні, можна розрізняти кілька основних видів ФС.

Програмний підхід

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

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

Файлова система FAT

Цей тип розроблявся ще 1977 року Біллом Гейтсом і Марком МакДональдом. Спочатку її використовували в ОС 86-DOS. Якщо говорити про те, що таке файлова система FAT, то варто відзначити, що спочатку вона не була здатна підтримувати жорсткі диски, а працювала тільки з носіями гнучкими об'ємом до 1 мегабайта. Зараз це обмеження вже неактуальне, а ця ФС використовувалася компанією "Майкрософт" для ОС MS-DOS 1.0 та наступних версій. У FAT використовуються певні угоди щодо найменування файлів:

На початку імені має бути буква або цифра, а в ньому самому може бути будь-який символ ASCII, крім пробілу та спеціальних елементів;

Довжина імені має бути не більше 8 символів, після нього ставиться крапка, а далі вказується розширення, що складається із трьох літер;

У іменах файлів може використовуватися будь-який регістр, він різниться і зберігається.

Оскільки спочатку FAT проектувалася для однопользовательской ОС DOS, вона передбачала зберігання даних про власника чи повноваженнях доступу. На даний момент ця файлова система поширена найбільш сильно, тією чи іншою мірою її підтримує більшість. Її універсальність дає можливість використовувати її на томах, з якими ведеться робота різними ОС. Це проста ФС, яка не здатна запобігти псуванню файлів через некоректне завершення роботи комп'ютера. У складі операційних систем, що працюють на її основі, є спеціальні утиліти, які перевіряють структуру та коригують невідповідність файлів.

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

Ця ФС є найкращою до роботи з ОС Windows NT, оскільки вона розроблялася спеціально під неї. До складу ОС включена утиліта convert, яка конвертує томи з FAT та HPFS у томи NTFS. Якщо говорити про те, що таке файлова система NTFS, то варто зазначити, що в ній істотно розширені можливості керування доступом до певних каталогів і файлів, введено безліч атрибутів, реалізовані засоби стиснення файлів динамічно, стійкість до відмов, підтримуються вимоги стандарту POSIX. У ФС можна використовувати імена довжиною до 255 символів, при цьому коротке ім'я в ній генерується так само, як і в VFAT. Розбираючись, що таке файлова система NTFS, слід зазначити, що у разі збою операційної системи вона здатна сама відновлюватися, тому дисковий том залишиться доступним, а каталожна структура не постраждає.

Особливості NTFS

На томі NTFS кожен файл представлений записом таблиці MFT. Перші 16 записів таблиці зарезервовані файловою системою для зберігання спеціальної інформації. У першому записі описана сама файлова таблиця. При руйнуванні першого запису зчитується другий пошуку дзеркального файлу MFT, де перший запис ідентична основний таблиці. На логічному центрі диска розміщується копія початкового завантаження файлу. Третій запис таблиці містить файл реєстрації, який використовується для відновлення даних. У сімнадцятому та наступних записах файлової таблиці знаходиться інформація про файли та каталоги, які є на жорсткому диску.

Журнал транзакцій містить повний набір операцій, що змінюють структуру тома, серед яких представлені операції зі створення файлів, і навіть будь-які команди, які впливають структуру каталогів. Журнал транзакцій призначений відновлення NTFS в результаті збою системи. Запис для кореневого каталогу містить список каталогів і файлів, які знаходяться в кореневому каталозі.

Особливості EFS

Шифрована файлова система (EFS) є компонентом Windows, за допомогою якого відомості на жорсткому диску можуть зберігатися в зашифрованому форматі. Шифрування стало найсильнішим захистом, який може запропонувати дана операційна система. У цьому випадку шифрування для користувача є досить простою дією, для цього потрібно встановити прапорець у властивостях папки або файлу. Можна вказати, хто може читати такі файли. Відбувається шифрування при закритті файлів, а коли вони відкриваються, автоматично стають готовими до використання.

Особливості RAW

Пристрої, призначені для зберігання даних, є найбільш вразливими комплектуючими, які найчастіше схильні до пошкоджень не тільки у фізичному плані, але й у логічному. Певні проблеми з обладнанням можуть виявитися фатальними, інші мають якісь рішення. Іноді у користувачів виникає запитання: "Що таке файлова система RAW?"

Як відомо, для запису на жорсткий диск або флеш-накопичувач будь-якої інформації у накопичувача повинна бути ФС. Найбільш поширеними є FAT та NTFS. А RAW навіть не є файловою системою, якою ми зазвичай її собі уявляємо. Насправді, це логічна помилка вже встановленої системи, тобто її фактична відсутність для Windows. Найчастіше RAW пов'язані з руйнуванням структури файлової системи. Після цього ОС не просто до даних, а й не відображає технічну інформацію з обладнання.

Особливості UDF

Універсальний дисковий формат (UDF) розроблений для заміни CDFS та додавання підтримки пристроїв DVD-ROM. Якщо говорити про те, що таке, то це нова реалізація старої версії для якої відповідає вимогам. Вона характеризується певними особливостями:

Довжина імен файлів може бути 255 символів;

Регістр імені може бути нижнім та верхнім;

Максимальна довжина колії становить 1023 символи.

Починаючи з Windows XP, ця файлова система підтримує читання та запис.

Дана ФС використовується для флеш-накопичувачів, які передбачається застосовувати під час роботи з різними комп'ютерами, які працюють під управлінням різних операційних систем, зокрема Windows та Linux. Саме EXFAT стала тим «містком» між ними, так як вона здатна працювати з даними, які отримують від ОС, у кожній з яких працює своя файлова система. Що таке та як це працює, буде зрозуміло вже на практиці.

Висновки

Як відомо з описаного вище, у кожній операційній системі використовуються певні файлові системи. Призначені для зберігання упорядкованих структур даних на фізичних носіях інформації. Якщо у вас раптом при користуванні комп'ютером виникає питання про те, що таке кінцева файлова система, цілком можливо, що при спробі скопіювати певний файл на носій перед вами з'явилося повідомлення про перевищення дозволеного розміру. Саме тому необхідно знати, в якому ФС який розмір файлів вважається допустимим, щоб при перенесенні інформації не стикатися з проблемами.

Файлові системи FAT

FAT16

Файлова система FAT16 розпочала своє існування ще за часів, що передували MS-DOS, і підтримується всіма операційними системами Microsoft для забезпечення сумісності. Її назва File Allocation Table (таблиця розташування файлів) відмінно відображає фізичну організацію файлової системи, до основних характеристик якої можна віднести те, що максимальний розмір тома, що підтримується (жорсткого диска або розділу на жорсткому диску) не перевищує 4095 Мбайт. За часів MS-DOS 4-гігабайтні жорсткі диски здавалися нездійсненною мрією (розкішшю були диски об'ємом 20-40 Мбайт), тому такий запас був цілком виправданим.

Том відформатований для використання FAT16 поділяється на кластери. Розмір кластера за замовчуванням залежить від розміру тома і може коливатися від 512 до 64 Кбайт. У табл. 2 показано як розмір кластера залежить від розміру тому. Зазначимо, що розмір кластера може відрізнятись від значення за замовчуванням, але повинен мати одне із значень, зазначених у табл. 2 .

Не рекомендується використовувати файлову систему FAT16 на томах більше 511 Мбайт, тому що для відносно невеликих за обсягом файлів дисковий простір буде використовуватися вкрай неефективно (файл розміром в 1 байт буде займати 64 Кбайт). Незалежно від розміру кластера, файлова система FAT16 не підтримується для томів більше 4 Гбайт.

FAT32

Починаючи з Microsoft Windows 95 OEM Service Release 2 (OSR2), у Windows з'явилася підтримка 32-бітної FAT. Для систем на базі Windows NT ця файлова система вперше почала підтримуватись у Microsoft Windows 2000. Якщо FAT16 може підтримувати томи об'ємом до 4 Гбайт, то FAT32 здатна обслуговувати томи об'ємом до 2 Тбайт. Розмір кластера FAT32 може змінюватися від 1 (512 байт) до 64 секторів (32 Кбайт). Для зберігання значень кластерів FAT32 потрібно 4 байт (32 біт, а не 16, як у FAT16). Це означає, що деякі файлові утиліти, розраховані на FAT16, не можуть працювати з FAT32.

Основною відмінністю FAT32 від FAT16 є те, що змінився розмір логічного розділу диска. FAT32 підтримує об'ємом тома до 127 Гбайт. При цьому, якщо при використанні FAT16 з 2-гігабайтними дисками був потрібний кластер розміром 32 Кбайт, то FAT32 кластер розміром 4 Кбайт підходить для дисків об'ємом від 512 Мбайт до 8 Гбайт (табл. 4).

Це означає більш ефективне використання дискового простору - що менше кластер, тим менше місця потрібно для зберігання файлу і, як наслідок, диск рідше стає фрагментованим.

При застосуванні FAT32 максимальний розмір файлу може сягати 4 Гбайт мінус 2 байти. Якщо при використанні FAT16 максимальна кількість входжень у кореневий каталог обмежувалася 512, FAT32 дозволяє збільшити це число до 65 535.

FAT32 накладає обмеження на мінімальний розмір тому - він має бути не менше 65527 кластерів. При цьому розмір кластера не може бути таким, щоб FAT займала понад 16 Мбайт-64 Кбайт/4 або 4 млн. кластерів.

При використанні довгих імен файлів дані, необхідні для доступу з FAT16 та FAT32, не перекриваються. При створенні файлу з довгим ім'ям Windows створює відповідне ім'я у форматі 8.3 та одне або більше входжень до каталогу для зберігання довгого імені (по 13 символів з довгого імені файлу на кожне входження). Кожне наступне входження зберігає відповідну частину імені файлу у форматі Unicode. Такі входження мають атрибути "ідентифікатор тома", "тільки читання", "системний" та "прихований" - набір, що ігнорується MS-DOS; у цій операційній системі доступ до файлу здійснюється за його псевдонімом у форматі 8.3.

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

До складу Microsoft Windows 2000 входить підтримка нової версії файлової системи NTFS, яка забезпечує роботу з сервісами каталогів Active Directory, точки перерахунку (reparse points), засоби захисту інформації, контроль за доступом і ряд інших можливостей.

Як і при використанні FAT, основною інформаційною одиницею NTFS є кластер. У табл. 5 показані розміри кластерів за промовчанням для томів різної ємності.

При формуванні файлової системи NTFS програма форматування створює файл Master File Table (MTF) та інші області зберігання метаданих. Метадані використовуються NTFS для реалізації файлової структури. Перші 16 записів в MFT зарезервовані NTFS. Розташування файлів метаданих $Mft та $MftMirr записано у завантажувальному секторі диска. Якщо перший запис MFT пошкоджено, NTFS зчитує другий запис для знаходження копії першої. Повна копія завантажувального сектора розміщується наприкінці тома. У табл. 6 перераховані основні метадані, що зберігаються в MFT.

Інші записи MFT містять записи для кожного файлу та каталогу, розміщених на цьому томі.

Зазвичай один файл використовує один запис у MFT, але якщо файл має великий набір атрибутів або він стає занадто фрагментованим, то для зберігання інформації про нього можуть знадобитися додаткові записи. У цьому випадку перший запис про файл, який називається базовим записом, зберігає розташування інших записів. Дані про файли та каталоги невеликого розміру (до 1500 байт) повністю містяться у першому записі.

Атрибути файлів у NTFS

Кожен зайнятий сектор на NTFS-томі належить тому чи іншому файлу. Навіть метадані файлової системи є частиною файлу. NTFS розглядає кожен файл (або каталог) як набір файлових атрибутів. Такі елементи, як ім'я файлу, інформація про його захист і навіть дані в ньому є атрибутами файлу. Кожен атрибут ідентифікується кодом певного типу та, опціонально, ім'ям атрибута.

Якщо атрибути файлу містяться у файловому записі, вони називаються резидентними атрибутами. Такими атрибутами завжди є ім'я файлу та дата його створення. У тих випадках, коли інформація про файл занадто велика, щоб вміститися в один MFT-запис, деякі атрибути файлу стають нерезидентними. Резидентні атрибути зберігаються в одному або більше кластерах і є потік альтернативних даних для поточного тому (про це трохи нижче). Для опису місцезнаходження резидентних та нерезидентних атрибутів NTFS створює атрибут Attribute List.

У табл. 7 показані основні атрибути файлів, визначені у NTFS. У майбутньому цей список може бути розширено.

Файлова система CDFS

У Windows 2000 забезпечується підтримка файлової системи CDFS, що відповідає стандарту ISO'9660, що описує розташування інформації на CD-ROM. Підтримуються довгі імена файлів відповідно до ISO'9660 Level 2.

При створенні CD-ROM для використання під керуванням Windows 2000 слід мати на увазі наступне:

  • всі імена каталогів та файлів повинні містити не менше 32 символів;
  • всі імена каталогів та файлів повинні складатися лише із символів верхнього регістру;
  • глибина каталогів має перевищувати 8 рівнів від кореня;
  • Використання розширень імен файлів не є обов'язковим.

Порівняння файлових систем

Під керуванням Microsoft Windows 2000 можливе використання файлових систем FAT16, FAT32, NTFS або їх комбінацій. Вибір операційної системи залежить від наступних критеріїв:

  • того, як використовується комп'ютер;
  • апаратної платформи;
  • розміру та числа жорстких дисків;
  • безпеки інформації

Файлові системи FAT

Як ви вже могли помітити, цифри в назві файлових систем - FAT16 і FAT32 - вказують на кількість біт, необхідних зберігання інформації про номери кластерів, використовуваних файлом. Так, у FAT16 застосовується 16-бітова адресація і, відповідно, можливе використання до 2 16 адрес. У Windows 2000 перші чотири біти таблиці розташування файлів FAT32 необхідні власних потреб, у FAT32 число адрес досягає 2 28 .

У табл. 8 показано розміри кластерів для файлових систем FAT16 та FAT32.

Крім істотних відмінностей у розмірі кластера FAT32 також дозволяє кореневому каталогу розширюватися (FAT16 число входжень обмежено 512 і може бути навіть нижче при використанні довгих імен файлів).

Переваги FAT16

Серед переваг FAT16 можна назвати такі:

  • файлова система підтримується операційними системами MS-DOS, Windows 95, Windows 98, Windows NT, Windows 2000, і навіть деякими операційними системами UNIX;
  • існує велика кількість програм, що дозволяють виправляти помилки у цій файловій системі та відновлювати дані;
  • у разі виникнення проблем із завантаженням з жорсткого диска система може бути завантажена з флоппі-диска;
  • Ця файлова система досить ефективна для томів об'ємом менше 256 Мбайт.
Недоліки FAT16

До основних недоліків FAT16 відносяться:

  • кореневий каталог не може містити понад 512 елементів. Використання довгих імен файлів значно скорочує кількість цих елементів;
  • FAT16 підтримує не більше 65536 кластерів, а так як деякі кластери зарезервовані операційною системою, число доступних кластерів - 65524. Кожен кластер має фіксований розмір для даного логічного пристрою. При досягненні максимальної кількості кластерів при їх максимальному розмірі (32 Кбайт) максимальний обсяг тома, що підтримується, обмежується 4 Гбайт (під керуванням Windows 2000). Для підтримки сумісності з MS-DOS, Windows 95 та Windows 98 обсяг тома під FAT16 не повинен перевищувати 2 Гбайт;
  • у FAT16 не підтримується вбудований захист файлів та їх стиснення;
  • на дисках великого об'єму втрачається багато місця за рахунок того, що використовується максимальний кластер. Місце під файл виділяється виходячи з розміру файлу, а кластера.
Переваги FAT32

Серед переваг FAT32 можна відзначити такі:

  • виділення дискового простору виконується ефективніше, особливо у дисків великого обсягу;
  • кореневий каталог в FAT32 є звичайним ланцюжком кластерів і може знаходитися в будь-якому місці диска. Завдяки цьому FAT32 не накладає жодних обмежень на кількість елементів у кореневому каталозі;
  • за рахунок використання кластерів меншого розміру (4 Кбайт на дисках об'ємом до 8 Гбайт) зайнятий дисковий простір зазвичай на 10-15% менше, ніж під FAT16;
  • FAT32 є більш надійною файловою системою. Зокрема, вона підтримує можливість переміщення кореневого каталогу та використання резервної копії FAT. Крім цього, завантажувальний запис містить ряд критичних для файлової системи даних.
Недоліки FAT32

Основні недоліки FAT32:

  • розмір тома під час використання FAT32 під Windows 2000 обмежений 32 Гбайт;
  • томи FAT32 недоступні з інших операційних систем – лише з Windows 95 OSR2 та Windows 98;
  • не підтримується резервна копія завантажувального сектора;
  • у FAT32 не підтримується вбудований захист файлів та їх стиснення.

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

Під час роботи в Windows 2000 Microsoft рекомендується відформатувати всі розділи жорсткого диска під NTFS, за винятком тих конфігурацій, коли використовується кілька операційних систем (крім Windows 2000 та Windows NT). Застосування NTFS замість FAT дозволяє використовувати функції, доступні NTFS. До них, зокрема, належать:

  • можливість відновлення. Ця можливість "вбудована" у файлову систему. NTFS гарантує збереження даних за рахунок того, що використовує протокол та деякі алгоритми відновлення інформації. У разі системного збою NTFS використовує протокол та додаткову інформацію для автоматичного відновлення цілісності файлової системи;
  • стиснення інформації. Для томів NTFS Windows 2000 підтримує стиснення окремих файлів. Такі стислі файли можуть використовуватися Windows-додатками без попереднього розпакування, яке відбувається автоматично під час читання з файлу. При закритті та збереженні файл знову упаковується;
  • Крім цього, можна виділити такі переваги NTFS:

Деякі функції операційної системи потребують наявності NTFS;

Швидкість доступу набагато вище - NTFS мінімізує кількість звернень до диска, необхідних знаходження файла;

Захист файлів та каталогів. Тільки на томах NTFS можливе завдання атрибутів доступу до файлів та папок;

При використанні NTFS Windows 2000 підтримує об'ємом тома до 2 Тбайт;

Файлова система підтримує резервну копію завантажувального сектора - вона розміщується наприкінці тома;

NTFS підтримує систему шифрування Encrypted File System (EFS), що забезпечує захист від неавторизованого доступу до вмісту файлів;

У разі використання квот можна обмежити обсяг дискового простору, який займає користувача.

Недоліки NTFS

Говорячи про недоліки файлової системи NTFS, слід зазначити, що:

  • NTFS-томи недоступні в MS-DOS, Windows 95 і Windows 98. Крім цього, ряд функцій, реалізованих в NTFS під Windows 2000, недоступний у Windows 4.0 і раніше версіях;
  • для томів невеликого об'єму, що містять багато невеликих файлів, можливе зниження продуктивності в порівнянні з FAT.

Файлова система та швидкість

Як ми вже з'ясували, для томів невеликого обсягу FAT16 або FAT32 забезпечує швидший доступ до файлів у порівнянні з NTFS, оскільки:

  • FAT має більш просту структуру;
  • розмір каталогів менший;
  • FAT не підтримує захист файлів від несанкціонованого доступу – системі не потрібно перевіряти права доступу до файлів.

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

Одне входження до FAT містить номер кластера для першого кластера каталогу. Для перегляду файлу FAT потрібен пошук у всій файловій структурі.

Порівнюючи швидкість операцій, що виконуються для каталогів, що містять короткі та довгі імена файлів, слід враховувати, що швидкість операцій для FAT залежить від самої операції та розміру каталогу. Якщо FAT шукає неіснуючий файл, пошук виконується по всьому каталогу - ця операція займає більше часу, ніж пошук структури, заснованої на B-деревах, що використовується в NTFS. Середній час, необхідний пошуку файлу, в FAT виражається як функція від N/2, в NTFS - як log N, де N - це число файлів.

Низка наступних факторів впливає на швидкість читання та запису файлів під керуванням Windows 2000:

  • Фрагментація файлу. Якщо файл сильно фрагментований, NTFS зазвичай потрібно менше звернень до диска, ніж FAT знаходження всіх фрагментів;
  • Розмір кластера. Для обох файлових систем розмір кластера за замовчуванням залежить від обсягу тома і завжди виражається ступенем числа 2. Адреси в FAT16 - 16-бітові, FAT32 - 32-бітові, в NTFS - 64-бітові;
  • розмір кластера за замовчуванням у FAT базується на тому факті, що таблиця розташування файлів може мати не більше 65 535 входжень - розмір кластера є функцією від об'єму тома, поділеного на 65 535. Таким чином, розмір кластера за замовчуванням для тома FAT завжди більше, ніж розмір кластера для тому NTFS того ж обсягу. Зазначимо, що більший розмір кластера для томів FAT означає, що FAT томи можуть бути менш фрагментованими;
  • розташування файлів невеликого розміру. При використанні NTFS файли невеликого розміру містяться в записі MFT. Розмір файлу, який міститься в один запис MFT, залежить від кількості атрибутів цього файлу.

Максимальний розмір томів NTFS

Теоретично NTFS підтримує томи з числом кластерів до 232 . Проте крім відсутності жорстких дисків такого обсягу існують інші обмеження на максимальний розмір тома.

Одним із таких обмежень є таблиця розділів. Індустріальні стандарти обмежують розмір таблиці розділів 232 секторами. Іншим обмеженням є розмір сектора, який зазвичай дорівнює 512 байт. Оскільки розмір сектора може змінитися в майбутньому, поточний розмір дає обмеження на розмір одного тома - 2 Тбайт (231 x 512 байт = 241). Таким чином, 2 Тбайт є практичною межею для фізичних та логічних томів NTFS.

У табл. 11 показано основні обмеження NTFS.

Керування доступом до файлів та каталогів

Використовуючи томи NTFS, можна встановлювати права доступу до файлів і каталогів. Ці права доступу вказують, які користувачі та групи мають доступ до них та який рівень доступу допустимо. Такі права доступу поширюються як на користувачів, що працюють за комп'ютером, на якому розміщуються файли, так і на користувачів, які звертаються до файлів через мережу, коли файл знаходиться в каталозі, відкритому для віддаленого доступу.

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

Під керуванням FAT16 і FAT32 також можна встановлювати атрибути файлів, але вони не забезпечують права доступу до файлів.

У версії NTFS, яка використовується в Windows 2000, з'явився новий тип дозволу на доступ - успадковані дозволи. Вкладка Security містить опцію Можна вносити необмежені можливості від parent до propagate до цього файлу об'єкта, яка за умовчанням перебуває у активному стані. Ця опція значно скорочує час, який потрібно змінити права доступу до файлів і підкаталогів. Наприклад, для зміни прав доступу до дерева, що містить сотні підкаталогів та файлів, достатньо включити цю опцію - у Windows NT 4 необхідно змінити атрибути кожного окремого файлу та підкаталогу.

На рис. 5 показано діалогову панель Properties та вкладку Security (розділ Advanced) - перераховано розширені права доступу до файлу.

Нагадаємо, що для томів FAT можна керувати доступом лише на рівні томів і такий контроль можливий лише за віддаленого доступу.

Стиснення файлів та каталогів

Windows 2000 підтримує стиснення файлів і каталогів, розташованих на NTFS-томах. Стислі файли доступні для читання та запису будь-якими програмами Windows. Для цього немає необхідності в їхньому попередньому розпакуванні. Використовуваний алгоритм стиснення схожий з тим, який використовується в DoubleSpace (MS-DOS 6.0) і DriveSpace (MS-DOS 6.22), але має одну істотну відмінність - під керуванням MS-DOS виконується стиск цілого первинного розділу або логічного пристрою, тоді як під NTFS можна упаковувати окремі файли та каталоги.

Алгоритм стиснення NTFS розроблено з урахуванням підтримки кластерів розміром до 4 Кбайт. Якщо розмір кластера більше 4 Кбайт, функції стиснення NTFS стають недоступними.

Самовідновлення NTFS

Файлова система NTFS має здатність самовідновлення і може підтримувати свою цілісність за рахунок використання протоколу виконуваних дій та інших механізмів.

NTFS розглядає кожну операцію, яка модифікує системні файли на NTFS-томах, як транзакцію і зберігає інформацію про таку транзакцію в протоколі. Почата транзакція може бути повністю завершена (commit), або відкочується (rollback). В останньому випадку NTFS тому повертається в стан, що передує початку транзакції. Щоб керувати транзакціями, NTFS записує всі операції, які входять у транзакцію, у файл протоколу, як здійснити запис на диск. Після завершення транзакції всі операції виконуються. Таким чином, під керуванням NTFS не може бути незавершених операцій. У разі дискових збоїв незавершені операції просто скасовуються.

Під керуванням NTFS також виконуються операції, що дозволяють "на льоту" визначати дефектні кластери та відводити нові кластери для файлових операцій. Цей механізм називається cluster remapping.

У цьому огляді ми розглянули різні файлові системи, що підтримуються в Microsoft Windows 2000, обговорили пристрій кожної з них, відзначили їх переваги та недоліки. Найбільш перспективною є файлова система NTFS, яка має великий набір функцій, недоступних в інших файлових системах. Нова версія NTFS, підтримувана Microsoft Windows 2000, має ще більшу функціональність і тому рекомендується для використання при встановленні операційної системи Win 2000.

Комп'ютерПрес 7"2000

FAT(англ. File Allocation Table- «Таблиця розміщення файлів»)- класична архітектура файлової системи, яка через свою простоту все ще широко використовується для флеш-накопичувачів. Використовується в дискетах та деяких інших носіях інформації. Раніше використовувалась і на жорстких дисках.

Файлова система була розроблена Біллом Гейтсом та Марком Мак Дональдом у 1977 році і спочатку використовувалася в операційній системі 86-DOS. Надалі 86-DOS було придбано Microsoft і став основою ОС MS-DOS 1.0, випущеної серпні 1981 року. FAT була призначена для роботи з гнучкими дисками розміром менше 1 Мб і спочатку не передбачала підтримки жорстких дисків.

Наразі існує чотири версії FAT - FAT8, FAT12, FAT16і FAT32. Вони відрізняються розрядністю записів у дисковій структурі, тобто кількістю біт, відведених для зберігання номера кластера. FAT12 застосовується в основному для дискет, FAT16 – для дисків малого об'єму, FAT32 – для жорстких дисків. На основі FAT була розроблена нова файлова система exFAT(extended FAT), що використовується переважно для флеш-накопичувачів.

Файлова система FAT заповнює вільне місце на диску послідовно від початку до кінця. При створенні нового файлу або збільшення вже існуючого вона шукає перший вільний кластер у таблиці розміщення файлів. Якщо одні файли були видалені, а інші змінилися в розмірі, порожні кластери, що з'являються в результаті, будуть розсіяні по диску. Якщо кластери, що містять дані файлу, розташовані не поспіль, файл виявляється фрагментованим. Сильно фрагментовані файли значно знижують ефективність роботи, оскільки головки читання/записи під час пошуку чергової записи файлу повинні переміщатися з однієї області диска на іншу. Бажано, щоб кластери, виділені на зберігання файлу, йшли підрят, оскільки це дозволяє скоротити час його пошуку. Однак, це можна зробити лише за допомогою спеціальної програми, подібна процедура отримала назву дефрагментаціїфайлу.

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

FAT - проста файлова система, що не запобігає псуванню файлів через ненормальне завершення роботи комп'ютера, вона є однією з найпоширеніших файлових систем, і її підтримують більшість ОС.

Організація файлової системи fat

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

A- доріжка

C-кластер

Малюнок 1- Структура диска

Доріжки- Це концентричні кола, що покривають поверхню диска. Найближчою до краю диска доріжці присвоєно номер 0, наступний за нею - 1 і т.д. Якщо дискета двостороння, то пронумеровано обидві сторони. Номер першої сторони – 0, номер другої – 1.

Кожна доріжка розбивається на ділянки, які називаються секторами. Секторам також надаються номери. Першому сектору на доріжці надається номер 1, другому - 2 і т.д.

Жорсткий диск складається з однієї або кількох круглих пластин. Для зберігання інформації використовуються обидві поверхні пластини. Кожна поверхня розбивається на доріжки, доріжки, своєю чергою, - на сектори. Доріжки однакового радіусу складають циліндр. Таким чином, усі нульові доріжки становлять циліндр із номером нуль, доріжки із номером 1 - циліндр із номером 1 і т.д.

Тому поверхню жорсткого диска можна розглядати як тривимірну матрицю, вимірами якої є номери поверхні, циліндраі сектора.Під циліндром розуміється сукупність всіх доріжок, що належать різним поверхням і знаходяться на рівній відстані від осі обертання.

Кожен з нас хоча б раз у житті форматував флешку, SD-карту, зовнішній або внутрішній жорсткий диск і напевно пам'ятає, що перед початком форматування будь-якого з перелічених вище пристроїв операційна система Windows завжди ставить питання - в яку файлову систему ви хочете відформатувати ваш пристрій: FAT32 , NTFS чи exFAT?

Зрозуміло, більшість користувачів не знають різниці між ними і зазвичай вибирають той варіант, який встановлений за умовчанням. А все тому, що Windows, ставлячи це питання, ніяк не пояснює різницю між ними. Ми ж у цій статті постараємося зрозумілою мовою вам пояснити її і розповісти, чим відрізняється файлова система FAT32 від NTFS і exFAT.

FAT32є найстарішою з файлових систем, що розглядаються, і найчастіше використовується на переносних флеш-накопичувачах - флешках або SD-картах.

NTFSвикористовується Windows як основна файлова система для диска, на якому встановлена ​​ця операційна система, вона також відмінно підходить і для інших вбудованих дисків і розділів жорсткого диска комп'ютера під керуванням Windows.

exFATє більш сучасним аналогом застарілої системи FAT32 і її підтримує більше пристроїв, ніж NTFS, але все ще не так багато, як "класичну" FAT32.

Тепер розглянемо докладніше кожну з цих файлових систем.

Файлова система FAT32

FAT32є найстарішою файловою системою з цих статей. Вона почала активно використовуватися починаючи з Windows 95 і прийшла на заміну системі, що ще більш застаріла - FAT16.

Великий вік цієї файлової системи має свої переваги та недоліки.

До переваг у цьому випадку можна віднести той факт, що FAT32 стала своєрідним стандартом і використовується досі у всіх змінних носіях за умовчанням. Якщо ви сьогодні купите флешку або SD-карту – "із заводу" на ній буде встановлена ​​файлова система FAT32. Зроблено це в першу чергу для того, щоб ваш змінний носій могли підтримувати не тільки сучасні комп'ютери та гаджети, але й старі пристрої та ігрові консолі, які мають USB порт і вміють працювати тільки з файловою системою FAT32.

Однак, у зв'язку з віком цієї системи, вона має деякі недоліки, основним з яких є обмеження за розміром файлу і всього тому. Кожен окремий файл у цій файловій системі не може мати розмір більше 4 гігабайт, а весь розділ із файловою системою FAT32 не може бути більше 8 терабайт.

І якщо з другим мінусом ще цілком можна змиритися (поки мало хто використовує накопичувачі розміром більше 8Тб), то обмеження на розмір файлу є досить серйозним мінусом - більшість відео у високій якості зараз вже не вкладаються в розмір 4Гб, особливо якщо вони в сучасному форматі 4K.

Однак поки що ця файлова система ще цілком підходить для переносних пристроїв (на зразок флешок і SD-карт, на яких розміщується безліч невеликих файлів), але для жорсткого диска комп'ютера вона вже зовсім не годиться. В першу чергу, їй не вистачає деяких функцій безпеки, які є в більш сучасній файловій системі NTFS, і через це ви вже не зможете встановити сучасну версію Windows на диск з системою FAT32, вам потрібно переформатувати його в NTFS.

Сумісність FAT32

Пристрої з файловою системою FAT32 є найбільш універсальними і сумісні з усіма версіями операційних систем Windows, Mac OS, Linux, будь-якими ігровими консолями і практично всім, що має USB порт.

Обмеження FAT32

Основним мінусом цієї файлової системи є обмеження на розмір файлу та тому - максимальний розмір файлу не може перевищувати 4 GB, а максимальний розмір розділу обмежений 8 TB.

Застосування FAT32

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

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

NTFS- це сучасніша і технологічніша файлова система, про що говорить навіть розшифровка абревіатури її назви -" new technology file system". Найбільше її любить операційна система Windows, що загалом і не дивно - адже і те, й інше розроблено компанією Microsoft.

Починаючи з версії операційної системи від Microsoft під назвою XP, в якій система NTFS вперше і стала стандартною, при встановленні Windows діалогове вікно обов'язково попросить вас відформатувати системний розділ саме в цю файлову систему. На даний момент вважається, що про обмеження файлової системи NTFS вам, теоретично, не доведеться турбуватися ще довгі роки.

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

Саме тому розділ вашого диска, на який встановлена ​​операційна система Windows, обов'язково повинен бути відформатований в NTFS. Якщо ви збираєтеся інсталювати програми на інші розділи того ж диска або інші жорсткі диски, вони також повинні мати відповідну файлову систему.

На жаль, NTFS не сумісна з більшістю інших операційних систем, оскільки вона була розроблена під вимоги Windows. З нею відмінно працюють всі версії операційної системи від Microsoft починаючи з XP і закінчуючи останньою на сьогоднішній день Windows 10, але інші ОС мають значні обмеження при роботі з нею.

Наприклад, Mac OS може лише зчитувати дані з дисків із файловою системою NTFS, але не може записувати на них. Деякі рідкісні дистрибутиви лінукса можуть мати можливість запису на диски з NTFS, але більшість все ж таки обмежені лише читанням інформації. Жодна з версії Playstation не може працювати з NTFS, як і Xbox 360 від Microsoft, і лише нова Xbox One підтримує цю файлову систему.

Сумісність NTFS

Ця файлова система відмінно працює з усіма останніми версіями операційної системи Windows, починаючи з XP, має обмеження на запис у Mac OS і Linux, і не працює з більшістю інших пристроїв, за винятком хіба що Xbox One.

Обмеження NTFS

Обмеження на розмір фалів або розділів у NTFS ще довго не повинні упертися в рамки, тому можна сказати, що на даний момент їх немає.

Застосування NTFS

Використання цієї файлової системи розумно тільки на жорстких дисках і SSD, на яких встановлена ​​операційна система Windows, оскільки тільки з нею цей формат розкриває всі свої переваги.

Файлова система exFAT

exFATбула вперше представлена ​​в 2008 році і є найсучаснішою з файлових систем, що розглядаються в цій статті, її підтримка була додана в Windows починаючи з версії XP за допомогою оновлень ОС.

Файлова система exFAT була створена та оптимізована для використання на зовнішніх накопичувачах - флешках, SD-картах та зовнішніх жорстких дисках, та покликана замінити собою застарілу систему FAT32. Вона є найлегшою і найпростішою файловою системою завдяки відсутності різних спеціалізованих особливостей, властивих NTFS, так само як і повній відсутності обмежень на розмір файлу і розділу, які має FAT32.

Також exFAT має кращу сумісність з різними операційними системами, ніж NTFS, і пристрої з нею чудово читаються та перезаписуються як на Windows та Mac OS, так і на Linux (за умови встановлення деякого програмного забезпечення).

Так як exFAT підтримується операційною системою Mac OS за умовчанням, то ймовірно вона підтримуватиметься і більшістю інших сучасних девайсів, з яким працюють пристрої від Apple, наприклад, цифровими камерами.

Сучасні версії ігрових консолей, такі як Xbox One та Playstation 4, також підтримують пристрої з файловою системою exFAT, на відміну від попередніх версій (Xbox 360 і Playstation 3).

Сумісність exFAT

exFAT чудово працює з усіма сучасними версіями Windows (починаючи з XP) та Mac OS. Для роботи з Linux потрібне встановлення додаткового програмного забезпечення. Ця файлова система підтримує набагато більше різних пристроїв, ніж NTFS, проте деякі з них (переважно старі версії) все ще можуть працювати тільки з FAT32.

Обмеження exFAT

Також, як і у випадку з NTFS, реалістичних обмежень на розмір файлу або розділу в системі exFAT поки що немає.

Застосування exFAT

Ця файлова система відмінно підходить для використання на різних знімних носіях, розмір файлів на яких може перевищувати 4 Гб (зовнішні жорсткі диски, флешки великого об'єму). Якщо всі пристрої, з якими ви працюєте, є сучасними, ви можете відмовитися від FAT32 на знімних накопичувачах на користь exFAT.

Підсумовуючи можна зробити такі висновки: NTFS відмінно підходить для системного жорсткого диска з ОС Windows, exFAT краще використовувати на знімних носіях інформації, а FAT32 варто використовувати лише в тому випадку, якщо ви хочете домогтися максимальної сумісності з усією різноманітністю ваших пристроїв.

 

 

Це цікаво: