Каква е разликата между FAT32, NTFS и exFAT. Форматиране на USB флаш устройство във FAT32 или NTFS - кое е по-добре? Файлова система NTFS - описание, приложение и ключови свойства

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

Файлова архитектура FAT системи

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

Файловата система FAT (File Allocation Table) е разработена от Бил Гейтс и Марк Макдоналд през 1977 г. и първоначално е била използвана в операционната система 86-DOS. За да се постигне преносимост на програми от операционната система CP/M към 86-DOS, в нея бяха запазени приетите по-рано ограничения за имена на файлове. По-късно 86-DOS е придобит от Microsoft и става основа за MS-DOS 1.0, издаден през август 1981 г. FAT е проектиран да работи с флопи дискове с размер по-малък от 1MB и първоначално не поддържа твърди дискове.

Структурата на FAT дяла е показана на фигурата.

Във файловата система FAT дисковото пространство на логическия дял е разделено на две области - системната област и областта на данните (вижте фигура 1). Системната област се създава и инициализира при форматиране и впоследствие се актуализира при манипулация файлова структура... Системната област на файловите системи FAT се състои от следните компоненти:

  • запис за зареждане (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-байтов запис в директорията, съдържащ името на файла, атрибутите на файла (архивиран, скрит, системен и само за четене), дата и час на създаване (или последна промяна), както и друга информация . За файлови системи 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, 0x7D;
  • не можете да използвате интервал (0x20) в първия байт на името.

Файловите системи FAT32 и VFAT (виртуален FAT, разширение FAT16) поддържат дълги имена на файлове (LFN). За съхраняване на дългото име се използват елементите на директорията, съседни на основния елемент. Името на файла не се изписва в ASCII символи, а в Unicode. Част от до 13 Unicode символа може да се съхранява в един запис в каталога. Неизползваната част от последния фрагмент е изпълнена с 0xFFFF кодове. Структурата на запис в директорията за дълго име на файл е показана в Таблица 2.

Таблица 2. Структура на запис в директория за дълго име на файл

пристрастие Размер (байтове) Съдържание
0x00 1 Номер на фрагмента
0x01 10 Уникод знаци от името на файла 1-5
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 Прекъсване на устройство с номер 0x13 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
0x2C
0x30
0x32
0x34

В допълнение към полетата, изброени в таблици 2 и 3, нулевият сектор на логическия диск трябва да съдържа кода 0x55 в байта с отместване 0x1FE и кода 0xAA в следващия байт (отместване 0x1FF). Изброените два байта са идентификатор на диск за зареждане.

По този начин секторът за зареждане изпълнява две важни функции: описва структурата на данните на диска и също така ви позволява да стартирате операционната система.

На логически диск с организация 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 OS.

Нека дефинираме необходимите заглавни файлове:

#включи

#включи

#включи

#включи

#включи

#include "split.h"

Заглавният файл split.h има следното съдържание:

#включи

#define SHORT_NAME 13 // максимална дължина на кратко име на файл

struct split_name (

U8 име; // Име на файл

U8 вътрешен; // разширение на файл

Int name_len, // дължина на името на файла

Ext_len; // дължина на разширението на файла

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

Заглавният файл дефинира структурни типове, които описват основните компоненти на файловата система FAT - сектор за зареждане, сектор FSInfo, структури на елементи на директория за къси и дълги имена на файлове.

Нека разгледаме накратко полетата, които са включени във всяка една от тези структури.

    1. Структура на стартиращия сектор структура fat_boot_sector:
      • __s8 system_id- системен идентификатор;
      • __u8 sector_size - размер на сектора в байтове;
      • __u8 cluster_size- размерът на клъстера в сектори;
      • __u16 запазен- броят на резервните сектори в свободната зона на дяла;
      • __u8 мазнини- брой FAT копия;
      • __u8 dir_entries- броят на 32-байтовите файлови дескриптори в основната директория;
      • __u8 сектори- броят на секторите на дял; ако това поле е 0, се използва полето total_sect;
      • __u8 медии- вида на носителя, на който е създадена файловата система;
      • __u16 дебела_дължина- размер на FAT в сектори;
      • __u32 общо_сект- размер на FAT дяла в сектори (ако секторите на полето == 0).
      • __u32 fat32_length- FAT32 размер в сектори;
      • __u32 root_cluster- номер на първия клъстер на основната директория;
      • __u16 инфо_сектор- номер на сектора, съдържащ структурата на FSInfo.

Следните полета в тази структура се използват само от FAT32:

  1. Структура на сектора FSInfo struct fat_boot_fsinfo:
    • __u32 подпис1- подпис 0x41615252;
    • __u32 подпис2- подпис 0x61417272;
    • __u32 свободни_клъстери- броят на свободните клъстери. Ако полето съдържа -1, търсенето на свободни клъстери трябва да започне от клъстер номер 2.
  2. Структурата на записа в директорията на краткото име struct msdos_dir_entry:
    • __s8 име, вътр- име и разширение на файла;
    • __u8 attr- файлови атрибути;
    • __u8 ctime_ms- това поле посочва времето на създаване на файла до ms (използва се само FAT32);
    • __u16 cвреме- време за създаване на файл (използва се само FAT32);
    • __u16 cdate- дата на създаване на файла (използва се само FAT32);
    • __u16 adate- дата на последния достъп до файла (използва се само FAT32);
    • __u16 starthi- високи 16 бита от номера на първия клъстер на файла (използва се само FAT32);
    • __u16 час, дата, начало- час и дата на създаване на файла, номер на първия клъстер на файла;
    • __u32 размер- размер на файла (в байтове).
  3. Структура на елемент от директорията с дълго име:
    • __u8 id- Номер на артикул;
    • __u8 име0_4- знаци 1 - 5 от името;
    • __u8 attr- файлови атрибути;
    • __u8 псевдоним_контролна сума- контролна сума на краткото име;
    • __u8 име5_10- знаци 6 - 11 от името;
    • __u8 име11_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 * мазнини 16; // копирайте таблицата FAT16 тук

U16 сектор_размер; // размер на сектора (от FAT16)

U16 dir_entries; // брой 32-байтови дескриптори

// в основната директория (0 за FAT32)

сектори U16; // общ бройсектори в секция

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

U32 root_size; // размер на основната директория

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

U16 следващ_клъстер; // следващ клъстер във веригата

вътрешност мазнини;

Нека започнем с основната функция:

int main ()

Int num;

Задаваме пълното име на файла, чието съдържание искаме да прочетем. Нека ви напомня, че работим само с кратки имена на файлове. Процедурата за работа с дълги имена не е разгледана в тази статия.

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

Отворете файла на устройството:

Твърд = отворен (FAT16_PART_NAME, O_RDONLY);

Ако (трудно< 0) {

Грешка (FAT16_PART_NAME);

Изход (-1);

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

Брой = fat16_read_file (пълен_път, 10);

Ако (бр< 0) perror("fat16_read_file");

Else printf ("Четене% d клъстери", брой);

Затворете файла на устройството и излезте:

Затвори (твърдо);

Връщане 0;

Функцията за четене на клъстери от файлове изглежда така:

int fat16_read_file (__ u8 * пълен_път, int num)

Структура split_name sn; // структура за съхранение на съставните части на файла

U8 tmp_name_buff; // буфер за временно съхранение на съставните елементи от пълния път на файла

Статично int i = 1;

Int n;

U8 * tmp_buff;

U16 начален_клъстер, следващ_клъстер;

Изброихме параметрите на функцията, когато разглеждаме основната функция.

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

Първият знак в абсолютния път трябва да бъде наклонена черта (/). Проверяваме това:

Четем сектора за зареждане от дяла:

Ако (read_fbs ()< 0) return -1;

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

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

Byte_per_cluster = fbs.cluster_size * 512

Нека покажем информацията в сектора за зареждане:

Printf ("System ID -% s", fbs.system_id);

Printf ("Размер на сектор -% d", размер_сектор);

Printf ("Размер на клъстера -% d", fbs.cluster_size);

Printf ("Запазено -% d", fbs.reserved);

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

Printf ("Записи в директория -% d", dir_entries);

Printf ("Сектори -% d", сектори);

Printf ("Медия - 0x% X", fbs.media);

Printf ("FAT16 дължина -% u", fbs.fat_length);

Printf ("Общо секта -% u", fbs.total_sect);

Printf ("Байт на клъстер -% d", byte_per_cluster);

Изчислете размера на FAT16 в байтове и го прочетете:

Fat16_size = fbs.fat_length * 512;

Ако (read_fat16 ()< 0) return -1;

Четем главната директория:

Ако (read_root_dentry ()< 0) return -1;

Указателят на dir_entry вече е позициониран в областта на паметта, съдържаща записите в основната директория. Размерът на тази област на паметта е равен на размера на главната директория (root_size).

Нека запазим (за контрол) съдържанието на основната директория в отделен файл:

#ifdef ОТГРАНЯВАНЕ НА БЪГИ

Близки (мазнини);

#endif

Изчисляваме началото на областта с данни:

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

С всички записи в главната директория на място, можем да стигнем до съдържанието на файла test.txt. За целта ще организираме цикъл. В тялото на цикъла нека анализираме пълното име на файла, като подчертаем неговите елементи - поддиректории (имаме две от тях, Folder1 и Folder2) и името на желания файл (test.txt).

Докато (1) (

Memset (tmp_name_buff, 0, SHORT_NAME);

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

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

Ако ((tmp_name_buff [n] == "/") || (tmp_name_buff [n] == "?")) (

I ++;

Пауза;

Tmp_name_buff [n] = "?";

Попълнете структурата split_name sn с подходящата информация. Попълването се извършва от функцията split_name, докато името на файла се проверява спрямо формата "8.3":

< 0) {

Printf ("невалидно име");

Връщане -1;

За всеки елемент от пълното име на файла, ние дефинираме начален клъстер. За да направите това, потърсете в елементите на директорията (започвайки от корена) за запис, съответстващ на елемента с пълно име, и прочетете този запис. Функцията get_dentry () изпълнява процедурата за търсене:

Ако (get_dentry (& sn)< 0) {

Printf ("Няма такъв файл!");

Връщане -1;

Проверка на атрибутите на файла. Ако това е директория, прочетете съдържанието й и продължете цикъла:

Ако (dentry.attr & 0x10) (

Ако (read_directory (dentry.start)< 0) return -1;

Продължи;

Ако това е файл, прочетете първия брой клъстери. За контрол ще запазим прочетената информация в отделен файл:

Ако (dentry.attr & 0x20) (

Start_cluster = dentry.start;

Tmp_buff = (__u8 *) malloc (byte_per_cluster); // съдържанието на клъстера ще бъде прочетено тук

N = отворен ("клъст", O_CREAT | O_RDWR, 0600); // запазване на прочетената информация в този файл

Ако (n< 0) {

Perror ("отворен");

Връщане -1;

За да четем файловите клъстери, ще организираме цикъл:

За (i = 0; i< num; i++) {

Четем съдържанието на клъстера в буфера tmp_buff и го записваме в отделен файл:

< 0) return -1;

< 0) {

Perror ("пишете");

Затвори (n);

Връщане -1;

От FAT16 четем номера на следващия клъстер, зает от този файл. Ако това е последният клъстер, прекъсваме цикъла и се връщаме към основната функция:

#ifdef ОТГРАНЯВАНЕ НА БЪГИ

Printf ("OK. Прочетено");

Printf ("следващият клъстер на файла - 0x% X ..", next_cluster);

#endif

Ако (следващ_клъстер == EOF_FAT16) (

#ifdef ОТГРАНЯВАНЕ НА БЪГИ

Printf ("последен клъстер.");

#endif

Безплатно (tmp_buff);

Затвори (n);

Връщане ++ i;

#ifdef ОТГРАНЯВАНЕ НА БЪГИ

Printf ("спри да четеш");

#endif

Върнете i;

Четенето на сектора за зареждане на FAT16 се извършва от функцията read_fbs (). Резултатът се поставя в глобалната fbs структура:

int read_fbs ()

Ако (прочетете (твърдо, (__ u8 *) & fbs, sizeof (fbs))< 0) return -1;

Връщане 0;

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

int read_fat16 ()

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

Fat16 = (недействителен *) malloc (fat16_size);

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

Връщане 0;

Четенето на главната директория се извършва от функцията read_root_dentry ():

int read_root_dentry ()

U64 търсене = (__u64) fbs.reserved * 512 + fat16_size * fbs.fats; // отместване към основната директория от началото на секцията

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

Dir_entry = (__u8 *) malloc (root_size);

Ако (! Dir_entry) върне -1;

Memset (dir_entry, 0, root_size);

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

Връщане 0;

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

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

  • ТЪРСЕТЕ- изместване към клъстера на дяла
  • 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;

Връщане 0;

Функцията read_directory чете записите в директорията (не в основната) и поставя резултата в областта на паметта, на която е зададен указателят dir_entry:

int read_directory (__ u16 start_cluster)

Int i = 1;

U16 следващ_клъстер;

За (;; i ++) (

Разпределяме памет за съхраняване на съдържанието на директорията, четем съдържанието на началния клъстер и получаваме стойността на следващия клъстер от таблицата FAT16:

Ако (! Dir_entry) върне -1;

< 0) return -1;

Следващ_клъстер = fat16;

Нека запишем съдържанието на директорията в отделен файл (за контрол):

#ifdef ОТГРАНЯВАНЕ НА БЪГИ

Printf ("Следващ клъстер - 0x% X", следващ_клъстер);

Fat = отворен ("dir16", O_CREAT | O_WRONLY, 0600);

Напишете (fat, dir_entry, root_size);

Близки (мазнини);

#endif

Ако се достигне последният клъстер, излезте от цикъла, в противен случай продължете да четете директорията, увеличавайки размера на буфера dir_entry с още един клъстер:

Ако (следващ_клъстер и EOF_FAT16) се повреди;

Начален_клъстер = следващ_клъстер;

Връщане 0;

Функцията get_dentry () търси в съдържанието на директорията елемент, който съответства на файла, който търсите. Входните данни за тази функция са указател към структура split_name * sn, съдържаща елементите на краткото име на файл:

Int i = 0;

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

за (;; i ++) (

Ако (! (Memcmp (dentry.name, sn-> name, sn-> name_len)) &&

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

Пауза;

Ако (! Dentry.name) върне -1;

#ifdef ОТГРАНЯВАНЕ НА БЪГИ

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

Printf ("стартов клъстер - 0x% X", dentry.start);

Printf ("размер на файла -% u", dentry.size);

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

#endif

Връщане 0;

Целият код по-горе се намира в директорията FAT16, файл fat16.c. За да получите изпълнимия модул, създайте Makefile със следното съдържание:

INCDIR = / usr / src / linux / включва

ФОНИЯ = чист

Fat16: fat16.o split.o

Gcc -I $ (INCDIR) $ ^ -g -o [защитен с имейл]

% .o: % .c

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

чисти:

Rm -f * .o

Rm -f ./fat16

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

Като цяло, алгоритъмът за четене на файл от FAT12 дял е идентичен с алгоритъма за четене на файл от FAT16 дял. Разликата е в процедурата за четене на елементи от таблицата FAT12. Ние разглеждахме таблицата FAT16 като прост масив от 16-битови елементи. Предлага се следният алгоритъм за четене на елементи от таблицата FAT12:

  • умножете номера на елемента по 1,5;
  • извличане на 16-битова дума от FAT, използвайки резултата от предишната операция като отместване;
  • ако номерът на елемента е четен, извършете операцията И върху прочетената дума и маска 0x0FFF. Ако числото е нечетно, изместете прочетената дума от таблицата с 4 бита към най-малките битове.

Въз основа на този алгоритъм ще реализираме функцията за четене на елементи от таблицата FAT12:

int get_cluster (__ u16 cluster_num)

U16 търсене;

U16 куп;

Изчислете отместването в таблицата FAT12 и прочетете 16-битовата дума от таблицата:

Търсене = (номер_клъстер * 3) / 2;

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

Ако началният номер на клъстера е четно число, изместваме стойността, прочетена от таблицата с 4 бита към по-ниските цифри, ако е нечетна, я добавяме към 0x0FFF:

Ако (cluster_num% 2) клъст >> = 4;

Друга група & = 0x0FFF;

Този фрагмент може да бъде реализиран и в асемблер:

"xorw %% ax, %% ax"

"btw $ 0, %% cx"

"jnc 1f"

"shrw $ 4, %% dx"

"jmp 2f"

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

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

: "= a" (следващ)

: "d" (клъст), "c" (номер_клъстер));

Връщаме резултата:

Обратна група;

Нека се спрем малко повече на самия алгоритъм. Да приемем, че файл е създаден на FAT12 дял, който заема 9-ия и 10-ия клъстер. Всеки FAT12 елемент е с дължина 12 бита. Защото четем 16-битови елементи от таблицата, тогава отместването към 9-ия елемент ще бъде 13 байта (9 * 1,5 = 13, изхвърляме остатъка), докато най-малко значимите 4 бита ще принадлежат на 8-ия елемент на FAT. Те трябва да бъдат изхвърлени и за това е достатъчно прочетеният елемент да се измести с 4 бита към по-ниските цифри, което се осигурява от алгоритъма. Отместването към 10-ия елемент ще бъде 15 байта, а най-значимите 4 бита ще принадлежат на 11-ия елемент на FAT. За да ги изхвърлите, е необходимо да извършите операцията И върху 10-ия елемент и маската 0x0FFF, която също отговаря на горния алгоритъм.

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

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

Алгоритъмът за четене на файл от дял с файловата система FAT32 практически не се различава от алгоритъма за FAT16, с изключение на това, че при FAT32 главната директория може да се намира навсякъде в дяла и да има произволен размер. Затова, за да стане по-интересно, нека усложним задачата – да приемем, че знаем само номера на дяла с файловата система FAT32. За да прочетете информация от този раздел, първо трябва да определите неговите координати - отместването към секцията от началото на диска. И за това трябва да имате представа за логическата структура на твърдия диск.

Логическа структура на твърдия диск

Обмисли логическа структуратвърд диск, който отговаря на стандарта на Microsoft - "основен дял - разширен дял - дялове извън DOS."

Пространството на твърдия диск може да бъде организирано като един или повече дялове, а дяловете могат да съдържат едно или повече логически устройства.

Твърдият диск с физически адрес 0-0-1 съдържа главния запис за зареждане (MBR). Структурата на MBR съдържа следните елементи:

  • несистемно зареждане (NSB);
  • таблица с описание на дялове на диска (таблица на дялове, PT). Намира се в MBR при отместване 0x1BE и заема 64 байта;
  • MBR подпис. Последните два байта на MBR трябва да съдържат числото 0xAA55.

Таблицата на дяловете описва местоположението и характеристиките на наличните дялове на твърдия диск. Дисковите дялове могат да бъдат два вида - първични и разширени. Максималният брой първични дялове е четири. Задължително е да имате поне един първичен дял на диска. Разширеният дял може да бъде разделен на голям брой подсекции - логически устройства. Опростено 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 Код на типа на раздела за идентификация на системата
0x05 1 Номерът на главата на диска, където свършва дялът
0x06 2 Номер на цилиндъра и номер на сектор, който завършва секцията
0x08 4 Абсолютният (логически) номер на началния сектор на дяла
0x0C 4 Размер на дяла (брой сектори)

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

По този начин елемент от таблицата на разделите може да бъде описан със следната структура:

структура pt_struct (

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

U8 начална_част; // координати на началото на участъка

U8 тип_част; // системен идентификатор

U8 крайна_част; // координати на края на секцията

U32 sect_before; // брой сектори преди секцията

U32 sect_total; // размер на дяла в сектори (брой сектори в дяла)

Елементът на основния дял сочи директно към сектора за зареждане на логическия диск (винаги има само един логически диск в първичния дял), а елементът на разширения дял сочи към списък с логически дискове, съставен от структури, наречени вторични MBR (SMBR).

Всеки диск на разширения дял има собствен SMBR блок. SMBR има структура, подобна на MBR, но няма запис за зареждане (запълнен с нули) и се използват само две от четирите полета за дескриптор на дял. Първият елемент на дяла сочи към логическия диск, вторият елемент сочи към следващата SMBR структура в списъка. Последният SMBR от списъка съдържа кода на нулевата секция във втория елемент.

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

Заглавни файлове:

#включи

#включи

#включи

#включи

#включи

MBR подпис:

#define ПОДПИС 0xAA55

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

#define DEVICE "/ dev / hda"

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

#define PT_SIZE 0x10

Следният масив от структури задава съответствието между кода на типа раздел и неговото символно представяне:

структурни системни типове (

U8 тип_част;

U8 * име на частта;

struct systypes i386_sys_types = (

(0x00, "Празно"),

(0x01, "FAT12"),

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

(0x05, "Разширено"),

(0x06, "FAT16"),

(0x0b, "Win95 FAT32"),

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

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

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

(0x82, "размяна на Linux"),

(0x83, "Linux"),

(0x85, "Linux разширен"),

(0x07, "HPFS / NTFS")

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

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

Нека зададем ограничение за броя на логическите дискове:

#define MAX_PART 20

Следният структурен масив ще съдържа информация за логически дискове на устройството (твърд диск):

структура pt_struct (

U8 зареждащ;

U8 начална_част;

U8 тип_част;

U8 крайна_част;

U32 sect_before;

U32 sect_total;

) pt_t;

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

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 сектор_размер; // размер на сектора (от FAT32)

U16 dir_entries; // 0 за FAT32

сектори U16; // брой сектори на дял

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

U32 начало_данни; // начало на областта с данни

U16 byte_per_cluster; // колко байта има в клъстера (размер на клъстера в байтове)

U32 следващ_клъстер; // следващ клъстер във веригата

U32 root_cluster; // ROOT cluster - начален коренен клъстер

U8 * dir_entry = NULL; // указател към записи в директорията

U64 start_seek = 0; // начално отместване към секция (в байтове)

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

int main ()

Int брой = 0;

Int cluster_num = 5; // колко клъстера да прочетем от файла

U8 * full_path = "/ Папка1 / Папка2 / readme"; // файл за четене

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

Твърд = отворен (DEV_NAME, O_RDONLY);

Ако (трудно< 0) {

Грешка (DEV_NAME);

Изход (-1);

Ако (get_pt_info (трудно)< 0) {

Грешка ("get_pt_info");

Изход (-1);

Show_pt_info ();

Изчисляваме началното изместване за секцията:

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

Четем клъстерите, принадлежащи към файла:

Номер = fat32_read_file (пълен_път, номер_клъстер);

Ако (бр< 0) perror("fat32_read_file");

Else printf ("Прочетени% d клъстери \ n", брой);

Затвори (твърдо);

Връщане 0;

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

int get_pt_info (int hard)

Int i = 0;

U64 търсене;

Четем таблицата на дяловете от MBR и проверяваме подписа:

Read_main_ptable (твърдо);

Ако (check_sign ()< 0) {

Printf ("Невалиден подпис! \ N");

Връщане -1;

Търсим идентификатора на разширения раздел. Ако има такъв, изчисляваме отместването към разширения дял и четем информацията за логическите дискове:

за (; i< 4; i++) {

Ако ((pt_t [i] .type_part == 0xF) || \

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

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

Търсене = (__u64) pt_t [i] .sect_before * 512;

Read_ext_ptable (трудно, търсене);

Пауза;

Връщане 0;

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

void read_main_ptable (int hard)

Ако (прочетете (твърдо, mbr, 512)< 0) {

Грешка ("четене");

Затвори (твърдо);

Изход (-1);

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

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

Връщане;

Функция за проверка на подписа check_sign ():

int check_sign ()

U16 знак = 0;

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

#ifdef ОТГРАНЯВАНЕ НА БЪГИ

Printf ("Подпис - 0x% X \ n", знак);

#endif

Ако (знак! = ПОДПИС) върнете -1;

Връщане 0;

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

void read_ext_ptable (int hard, __u64 seek)

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

U8 smbr;

Входни данни:

  • трудно- файлов дескриптор на устройството;
  • търси- отместване към разширения дял от началото на диска (в байтове).

За да получим информация за логически дискове, ние организираме цикъл:

За (;; num ++) (

Четем SMBR, разположен в търсенето на отместване от началото на диска:

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

Pread64 (твърдо, smbr, 512, търсене);

Попълваме два елемента от таблицата pt_t, започвайки от позиция номер. Първият елемент ще сочи към логическото устройство, а вторият към следната SMBR структура:

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

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

Правим поправка в полето "Номер на началния сектор" - броенето е от началото на диска:

Pt_t.sect_before + = (търси / 512);

Ако кодът на типа на дяла е нула, тогава няма повече логически устройства:

Ако (! (Pt_t.type_part)) прекъсва;

Изчислете отместването към следващия SMBR:

Търсене = ((__u64) (pt_t.sect_before + pt_t.sect_total)) * 512;

Връщане;

Функцията show_pt_info () показва информация за намерените логически устройства на устройството:

void show_pt_info ()

Int i = 0, n;

#ifdef ОТГРАНЯВАНЕ НА БЪГИ

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

#endif

За (; i< MAX_PART; i++) {

Ако (! Pt_t [i] .type_part) прекъсва;

Printf ("\ nТип на секция% d -", i);

За (n = 0; n< PART_NUM; n++) {

Ако (pt_t [i] .type_part == i386_sys_types [n] .part_type) (

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

Пауза;

Ако (n == PART_NUM) printf ("неизвестен тип \ 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);

Връщане;

Четенето на файлови клъстери от FAT32 дял се извършва от функцията fat32_read_file (). Тази функция има много общо с функцията fat16_read_file (), така че вижте раздел 6 за подробни коментари:

int fat32_read_file (__ u8 * пълен_път, int num)

Структура split_name sn;

U8 tmp_name_buff;

Int i = 1, n;

U32 начален_клъстер, следващ_клъстер;

U8 * tmp_buff;

Подготвителни операции - изчистете буфера, структурата и проверете първата наклонена черта:

Memset (tmp_name_buff, 0, SHORT_NAME);

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

Ако (пълен_път! = "/") Връщане -1;

Четем сектора за зареждане:

Ако (read_fbs ()< 0) return -1;

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

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

Memcpy ((void *) & сектори, (void *) fbs.sectors, 2);

Четем структурата FSInfo и показваме подписа, съдържащ се в нея:

Ако (read_fs_info ()< 0) return -1;

Printf ("Подпис1 - 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:

Ако (read_fat32 ()< 0) return -1;

Разпределете памет за записи в директорията:

Dir_entry = (__u8 *) malloc (byte_per_cluster);

Ако (! Dir_entry) върне -1;

Четем главната директория:

Ако (директория за четене (корен_клъстер)< 0) return -1;

Анализираме пълния път на файла и разделяме всеки елемент на неговите компоненти:

Докато (1) (

Memset (tmp_name_buff, 0, SHORT_NAME);

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

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

Tmp_name_buff [n] = пълен_път [i];

Ако ((tmp_name_buff [n] == "/") || (tmp_name_buff [n] == "\ 0")) (

I ++;

Пауза;

Tmp_name_buff [n] = "\ 0";

Ако (split_name (tmp_name_buff, & sn)< 0) {

Printf ("невалидно име \ n");

Връщане -1;

Ако (get_dentry (& sn)< 0) {

Printf ("Няма такъв файл! \ N");

Връщане -1;

За да получите началния номер на клъстер във файловата система FAT32, трябва да използвате най-значимата дума от номера на първия клъстер на файла - полето starthi на структурата на dentry:

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

Проверка на байта на атрибута:

Ако (dentry.attr & 0x10) (// това е директория

Ако (read_directory (start_cluster)< 0) return -1;

Продължи;

Ако (dentry.attr & 0x20) (// и това е файл

Tmp_buff = (__u8 *) malloc (byte_per_cluster);

N = отворен ("клъст", O_CREAT | O_RDWR, 0600);

Ако (n< 0) {

Perror ("отворен");

Връщане -1;

Printf ("първият клъстер на файла - 0x% X ..", start_cluster);

За (i = 0; i< num; i++) {

Memset (tmp_buff, 0, byte_per_cluster);

Ако (read_cluster (start_cluster, tmp_buff)< 0) return -1;

Ако (пишете (n, tmp_buff, byte_per_cluster)< 0) {

Perror ("пишете");

Връщане -1;

Ако (следващ_клъстер == EOF_FAT32) (

Безплатно (tmp_buff);

Затвори (n);

Връщане ++ i;

Начален_клъстер = следващ_клъстер;

Върнете i;

Целта на следващите три функции е да получат съдържанието на системната област, т.е. зареждащ сектор, структура FSInfo и таблица FAT32:

1) функцията read_fbs () чете сектора за зареждане:

int read_fbs ()

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

Връщане 0;

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

int read_fs_info ()

U64 търсене = (__u64) fbs.info_sector * 512 + start_seek;

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

Връщане 0;

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

int read_fat32 ()

U64 търсене = (__u64) fbs.reserved * 512 + start_seek;

Fat32 = (void *) malloc (fat32_size);

Ако (! Fat32) върне -1;

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

Връщане 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;

Връщане 0;

Четенето на директории (включително основната) се обработва от функцията read_directory ():

int read_directory (__ u32 start_cluster)

Int i = 2;

U32 следващ_клъстер;

Параметри на функцията - начален клъстер на директории. Четем съдържанието на директорията в глобалния буфер dir_entry:

Ако (read_cluster (start_cluster, dir_entry)< 0) return -1;

Следващ_клъстер = fat32;

Ако директорията заема един клъстер - излезте, ако не - увеличете размера на паметта и продължете да четете:

За (;; i ++) (

Начален_клъстер = следващ_клъстер;

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

Ако (! Dir_entry) върне -1;

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

Следващ_клъстер = fat32;

Ако ((следващ_клъстер == EOF_FAT32) || (следващ_клъстер == 0xFFFFFF8)) върне 0;

Връщане 0;

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

int get_dentry (struct split_name * sn)

Int i = 0;

Показателят dir_entry е настроен на област от паметта, съдържаща масив от записи в директорията, в която ще търсим файл (или директория). За търсене организираме цикъл и поставяме намерения запис в глобалната структура на dentry:

За (;; i ++) (

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

Ако (! (Memcmp (dentry.name, sn-> name, sn-> name_len)) &&

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

Пауза;

Ако (! Dentry.name) върне -1;

Връщане 0;

С това приключваме прегледа на модула за четене на файл от FAT32 дял.

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

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

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

Току-що се запознахме с FAT - в него всички елементи на каталога имат фиксиран размер. Когато създава файл, драйверът на файловата система търси първата незаета позиция и я запълва с информация за файла. Ако дължината на директорията не се побира в един клъстер, тогава за нея се разпределя друг клъстер и т.н.

Да видим как стоят нещата в EXT2.

Да предположим, че имаме дял с файловата система EXT2, размерът на блока е 4096 байта. В този раздел създаваме директория. Размерът на директорията ще бъде равен на размера на блока - 4096 байта. Операционната система веднага създава два записа в директорията - записът за текущата директория и записът за родителската директория. Текущият запис в директорията ще заеме 12 байта, докато родителският запис ще бъде 4084 байта. Нека създадем файл в тази директория. След това директорията ще съдържа три записа - текущият запис в директорията е дълъг 12 байта, записът в родителската директория вече е дълъг 12 байта, а създаденият файл е, както вероятно се досещате, дълъг 4072 байта. Ако изтрием създадения файл, дължината на записа в родителската директория отново ще нарасне до 4084 байта.

По този начин, когато създава файл, драйверът на файловата система EXT2 търси в директорията запис с максимална дължина и го разделя, оставяйки място за нов вход... Е, ако все пак няма достатъчно място, за директорията се разпределя още един блок и дължината на директорията става равна на 8192 байта.

И в заключение - малка корекция към статията "Архитектура на файловата система EXT2".

Тази ревизия се отнася до функцията get_i_num () за определяне на номера на inode по име на файл. Стар варианттази функция изглеждаше така:

int get_i_num (char * име)

Int i = 0, rec_len = 0;

Структура ext2_dir_entry_2 вдлъбнатина;

За (; i< 700; i++) {

Ако (! Memcmp (dent.name, name, dent.name_len)) прекъсва;

Rec_len + = dent.rec_len;

Връщане на dent.inode;

Коригирана версия:

int get_i_num (char * име)

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

Int rec_len = 0;

Структура ext2_dir_entry_2 вдлъбнатина; // тази структура описва формата на записа в основната директория:

* Глобалният buff съдържа масив от записи в директорията. За да определите серийния номер на inode на файла, трябва да намерите

* в този масив, запис с името на този файл. За да направите това, ще организираме цикъл:

За (;;) (

/ * Копирайте записи в директорията в структурата на вдлъбнатината: * /

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

* Дължината на името на файла, равна на нула, означава, че сме изброили всички записи в директорията

* и записи с името на нашия файл не бяха намерени. Така че е време да се върнем:

Ако (! Dent.name_len) върне -1;

/ * Търсенето се извършва чрез сравняване на имена на файлове. Ако имената съвпадат, излезте от цикъла: * /

Ако (! Memcmp (dent.name, name, strlen (name))) break;

/ * Ако имената не съвпадат, преминете към следващия запис: * /

Rec_len + = dent.rec_len;

/ * Ако е успешно, върнете номера на inode на файла: * /

Връщане на dent.inode;

литература:

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

Във връзка с

Тази статия ще обсъди използването на различни файлови системи на външни носители за съхранение: флаш памети, карти с памет, външни твърди дискове и т.н. И така, днес за устройства се използват следните файлови системи: ...

* FAT32
* NTFS
* exFAT

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

Файлова система, създадена от Microsoft, за да замени умиращия FAT16. В момента най-разпространената система. Повечето карти с памет и флаш устройства се доставят във FAT32. Освен това, когато форматирате носител в потребителско устройство, като камера, той ще работи в тази файлова система. Това е основното му предимство - съвместимост. Като поставите такова устройство в домакински DVD плейър, медиен плейър или фотопринтер, можете да сте сигурни, че всички файлове са налични и могат да се четат нормално. Тук плюсовете свършват.

Основният недостатък на тази система е ограничението на размера на файла от 4 GB. Затова пишете голям файл(например резервно копие на системния диск или видео, презаписано от камера) няма да работи. Освен това Windows има ограничение за размера на дяла от 32 GB. Можете да заобиколите последното ограничение, като изтеглите HP USB Utility Дисково съхранениеИнструмент за форматиране, който ще ви позволи да форматирате всеки външен твърд диск във FAT32.

Въпреки това, ако не е необходимо да записвате и прехвърляте толкова големи файлове, а също и ако имате малък размер на носителя: 4, 8 или дори 16 GB, можете да го форматирате във FAT32 без колебание.
Между другото, компанията Transcend, която произвежда мобилни носители на данни, форматира външните си твърди дискове във FAT32.

Модерна, надеждна файлова система, която датира от Windows NT.
В стационарните компютри и лаптопи той замени FAT32. Проверете дали все още имате инсталиран FAT32 (щракнете Кликнете с десния бутонна диска в My Computer и изберете Properties), силно препоръчвам да го замените с NTFS.

Как да конвертирате FAT32 в NTFS без загуба на данни

Това може да стане по следния начин. В командния ред (Start-Run) въведете

конвертирайте e: / fs: ntfs

Вместо e: можете да замените необходимия диск. Това ще промени файловата система на NTFS няма загуба на данни.

Въпреки това, NTFS работи малко по-различно на флаш памети и външни твърди дискове. Когато копира на такова устройство, Windows включва механизма за кеширане, когато файловете се копират първо на специална памет(т.нар. кеш) и след това към крайния носител. При стационарни твърди дискове това ви позволява да получите печалба в скоростта на копиране и да изгладите закъсненията. На мобилни устройства това ще изглежда така. Първоначално скоростта на копиране ще бъде много висока и може да достигне 100 MB / s (теоретично равна на скоростта на четене на твърдия диск, от който копирате), след това, когато кеш паметта свърши, скоростта ще падне до критично ниска стойност. Освен това, преди да пристъпи към копиране на следващия файл, системата трябва да добави текущия от кеша. Следователно може да изглежда, че копието е блокирано на 99 процента, въпреки че индикаторът на твърдия диск ще показва активност. Ако сравним скоростта на копиране със и без кеш, се оказва, че е почти идентична. Тоест, когато използваме NTFS, ние почти не губим нищо, с изключение на неправилната скорост на копиране и информация за времето на неговото завършване. Въпреки че част от това „информационно съдържание“ може да разтърси нервите.

Това е скоростта на копиране, която \ "развива \"
USB 2.0 твърд диск в NTFS

NTFS \ "върши чудеса \", копиране на 512 MB флаш устройство,
реалната скорост на запис, която е няколко MB / s

От друга страна, NTFS е изключително надеждна файлова система, която може да издържи повече от едно внезапно нулиране. Тази надеждност се осигурява от водене в дневник. Това ще накара системата да има по-често достъп до определени области на устройството. За флаш памети и карти с памет този подход е критичен. Те ще се износват по-бързо.

Нова файлова система от Microsoft. Предназначен основно за флаш памети. Преувеличавайки, можем да кажем, че това е FAT32 с премахнати ограничения. Размерите на файловете и дяловете могат да достигнат космически стойности, а броят на файловете в една папка вече не е ограничен. Според мен идеален за флашки и карти с памет.

Но тази система има и недостатък. Много потребителски устройства не го поддържат, а компютрите с Windows XP също няма да виждат такъв носител. Въпреки това, Microsoft пусна корекция KB955704, за да позволи използването на exFAT в Windows XP. Windows Vista и Windows 7 са приятели с тази система без никакви допълнителни манипулации.

Но ако често използвате флаш устройство на различни компютрикато използвате Windows XP, ще трябва да носите допълнително USB флаш устройство с драйвери. Това е просто нелепо.

Но ако имате само компютри с Windows 7 или носите флаш устройство/диск само на 2-3 места, където можете да инсталирате горната актуализация, тогава exFAT е перфектен.

Добавяне
Статията е взета от отворени източници: http://winitpro.ru/index.php/2011/06/20/fajlovaya-sistema-exfat/
ExFAT файлова система

Заедно с пускането на Vista SP1, Microsoft представи нова файлова система. ExFAT (Разширена таблица за разпределение на файлове) е наследник на старата файлова система FAT32. И така, какви са основните предимства и недостатъци на файловата система exFAT. Какви са разликите между exFAT и FAT32? И кога е по-добре да използвате exFAT над NTFS?

Файловата система FAT32 е доста стара и позната файлова система, но има редица съществени недостатъци: не поддържа дялове по-големи от 2 TB и файлове по-големи от 4 GB. За решаване на описаните проблеми във FAT32 е създадена файловата система exFAT. ExFAT е разработка на Microsoftпредназначени основно за мобилни медии (флаш памети, SSD устройства, смарт карти). Веднага трябва да се отбележи, че ExFAT не се използва за форматиране на твърди дискове. Всичко най-новите версии Windows, както и Mac OS X поддържат тази файлова система. ExFAT също често се нарича FAT64, което означава възможност за работа с устройства и файлове по-голям размер.

Основните предимства на файловата система exFAT:

* Максималният размер на клъстера е увеличен до 32 MB
* Повишена максимален размерфайл в exFAT от 4GB до 264 байта (16 EB).
* Няма ограничение за броя на файловете в една директория
* Поддръжка за разрешения за файл / директория
* Поддръжка на транзакции при запис (ако се поддържа от физическо устройство)
* Ефективна употребасвободно пространство, което помага за значително намаляване на фрагментацията на диска.

Струва си да се отбележи, че при форматиране в exFAT количеството налично пространство на устройствата за съхранение е по-голямо, отколкото при използване на FAT32. Например, ако форматирате 4 GB USB флаш (номинален капацитет 4023 MB) в различни файлови системи, получавате следното:

* FAT32 - 4014 MB
* HFS + - 3997 MB
* NTFS - 3974 MB
* exFAT - 4022 MB

ExFAT е оптимизиран за работа с флаш памети, като USB памети, карти с памет и SSD устройства, размерът на клъстера от 32 KB е много подходящ за големи карти и устройства с повишено износване при извършване на операции за четене и запис. Системата exFAT също има възможност да управлява правата за достъп до файлове/директории, а времето за достъп до данни е намаляло. Един от основните недостатъци на системата exFAT е, че тази технология се покрива от лицензионната политика на Microsoft и по никакъв начин отворен кодрешения, то не може да се прилага. За да го използвате във всяка операционна система, ще трябва да заплатите лицензионни такси на Microsoft (това правило не важи за обикновени мобилни устройствакато камери, плейъри и др.).

exFAT на съвременни операционни системи Windows 7

Новата версия на Microsoft Windows 7 напълно поддържа файловата система exFAT и всички нейни функции както в 32-битови, така и в 64-битови версии. Освен това външните флаш памети, форматирани в exFAT, могат да се използват за работа с технологията ReadyBoost (и няма да има повече ограничение от 4 GB).

Windows Vista

Windows Vista поддържа само exFAT, започвайки със Service Pack 1. Освен това някои функции като контрол на достъпа също не се поддържат. За разлика от Windows 7, exFAT устройствата във Vista не се поддържат за ReadyBoost.

Уиндоус експи

ExFAT не се поддържа в Windows XP, но драйверът може да бъде изтеглен от уебсайта на Microsoft (описание в KB 9555704 - http://support.microsoft.com/kb/955704), но изисква инсталиране на Service Pack 2.

За по-стари версии на Windows няма официална поддръжка за exFAT.

Windows Server

ExFAT се поддържа напълно в Windows Server 2008, а чрез инсталиране на горния драйвер и на Windows Server 2003.

Снежен леопард

Mac OS X поддържа exFAT от версия 10.6.4 (15 юни 2010 г.), но само на Mac с четец на SDXC карти. Mac mini и iMac са съвместими с exFAT.

Няма поддръжка на exFAT в Linux системите, въпреки че има няколко решения, но повечето от тях са платени или неудобни, освен това Microsoft, със своя собствен лиценз, поставя спица в колелата на независимите разработчици.

ExFAT и FAT32

При тестване на Windows 7 той показа същата производителност като FAT32, но NTFS все още е малко по-бърз. Ще замести ли exFAT FAT32? Това вероятно ще се случи само след масивна надстройка до Windows 7 или по-нови версии на Windows. За потребителите основната полза от exFAT ще бъде преодоляването на ограниченията на файла FAT32 (увеличаване на размера на файла в exFat).

Трябва също да помним, че файловата система exFAT изисква по-нова версия на операционната система (може да се наложи надстройка на хардуера), както и факта, че exFAT може просто да не се поддържа на по-стари устройства (камери, mp3 плейъри).

exFat или NTFS

ExFAT може да се счита за конкурент на NTFS на системи с ограничена мощност на обработка и памет. Освен това файловата система NTFS на флаш карти е много неудобна и неефективна за използване (скоростта на работа намалява и продължителността на живота на флаш паметта намалява), а ExFAT ще бъде идеалната файлова система за такива устройства.

В заключение ще дам няколко общи препоръкикато изберете най-подходящата файлова система. Ако имате малко флаш устройство, форматирайте го във FAT32. Форматирайте флаш памети с exFAT, тъй като "скокове в скоростта" ще бъдат особено забележими на тях. Външните твърди дискове обикновено са големи и производителни (особено тези с USB конектори 3.0), така че е най-добре да ги форматирате с NTFS.

Статията е взета от отворени източници: http://pc-hard.ru/softarticles/1-fat32-ntfs-exfat-comparsion.html

Нека анализираме видовете файлова система за флаш устройство, коя е по-добра. Един потребител ми изпрати снимка с грешката "Файлът е твърде голям за целевата файлова система" и реши да напише статия в какви случаи трябва да се използват FAT32, NTFS и exFAT системи. Той премести файл, по-голям от 4 GB, на 8 GB стик. Факт е, че системата FAT32 не може да обработва информация над 4 GB, ако вашето флаш устройство е с обем 32 GB и файловата му система е FAT32, тогава не можете да запишете файл над 4 GB в него. Нека да разгледаме и трите файлови системи в windows, да разгледаме техните плюсове и минуси.

FAT32

Старият режим на файлова система, който обикновено се използва при закупуване на USB флаш устройство от магазин, а причината за това е съвместимост. Съвместимостта е, че FAT32 може да се използва на всеки MAC, Windows, Linux, стари компютри. Най-голямото ограничение е, че има ограничение за размера на файла от 4GB, което днес има проблеми с формати като 4k видео, Blu-ray. Накратко, ако ще работите с файлове, които са по-малки от 4 GB и флашката се използва на различни компютри с различни операционни системи, тогава файловата система FAT32 е много подходяща.

exFAT

Актуализирана файлова система, създадена от Microsoft, за да замени FAT32. Започна с Windows Vista SP1 и има максимален размер на файла от 16 екзабайта (EB), което е 1 EB = 10 18 байта. Съвместима с Mac OS и Windows, това е много добра система за обмен на големи файлове.

минуси:

  • Той няма никаква функционалност за регистриране, при която всички промени във файловете на диска се записват, преди действително да бъдат изпълнени.
  • Не се поддържа от Time Machine в Apple. Накратко, няма да можете да архивирате от Apple с помощта на софтуер Time Machine.
  • Много сложна структура, която изисква повече изчислителна мощност.

Професионалисти:

  • Презаписва един и същ сектор по-малко пъти, което е важно за флаш устройствата, удължавайки живота на клетките на паметта. Както знаете, флаш устройствата имат N-брой презаписвания, след което се провалят.
  • Ограничение за голям размер на файла от 16 екзабайта.
  • Размерът на клъстера е 32 мегабайта.
  • Подобрено разпределение на свободното пространство, което намалява дефрагментацията на диска.

NTFS

Най-новата файлова система, създадена от Microsoft и е модерна структура днесза почти всеки модерен вътрешен твърд диск, флаш устройство или ssd устройство. NTFS е нова технология за файлова система. Windows може да се инсталира само на NTFS. Това е по подразбиране за дискове с операционна система поради своята гъвкавост. Той има всички технологии на Microsoft: регистриране, без ограничение за размера на файла, поддръжка за компресиране на файлове, дълги имена, контрол на достъпа до файлове за администратори на сървъра и много други. У дома това е най-добрият вариант за използване на тази система на дискове и флаш устройства. Има една уловка, когато поставите USB флаш устройство в Mac OS, можете да копирате информация от USB флаш устройство, но няма промяна.

Изход:

За USB памети трябва да използвате exFAT, ако сте постоянно в среда на Mac OS, Windows, премествайки USB флаш устройството от една операционна система в друга. Ако използвате само Windows, тогава NTSF е страхотно решение.

vfat е реализация на MS-DOS FAT / FAT32 файлови системи в Linux. монтиране на човек (8)

Типичен набор от опции за монтиране на vfat за локал на UTF-8 (без опции, чиято стойност по подразбиране е остаряла):

uid = потребителско_име, gid = име_на група, fmask = 0113, dmask = 0002, кодова страница = 866, utf8, кратко име = winnt, тихо

За локал, който не е UTF8, и това най-вероятно е локал KOI8-R (да не забравяме сега "utf8 = no" задължително за RHEL / CentOS):

uid = потребителско_име, gid = име_на група, fmask = 0113, dmask = 0002, кодова страница = 866, iocharset = koi8-r, utf8 = не, кратко име = winnt, тихо

или като се има предвид, че "uni_xlate" деактивира "utf8", още повече, че е по-добре да видите кодираните имена на файлове / директории, с които по някакъв начин можете да се справите, отколкото неразличими редове от "?":

uid = потребителско_име, gid = име_на група, fmask = 0113, dmask = 0002, кодова страница = 866, iocharset = koi8-r, uni_xlate, кратко име = winnt, тихо

user_name и group_name - потребителски имена и имена на групи, на които се предоставя достъп за четене/запис до монтирания дял FAT / FAT32 в съответствие с зададените fmask и dmask

Общите опции за монтиране варират в зависимост от това дали монтирате чрез командния ред или чрез писане в / etc / fstab, или дали трябва да монтирате автоматично при стартиране, rw / ro режим или да позволите на потребителите да монтират / демонтират дял. Често употребявано: rw, асинхронно
От съображения за сигурност за FAT / FAT32 дялове можете изрично да посочите: nodev, nosuid, noexec
За да ускорите, можете да използвате: noatime, nodiratitime

Опциите за монтиране са изброени в man mount (8) под „Опции за монтиране за мазнини“ и „Опции за монтиране за vfat“.
Опции за монтиране на мазнини
=====================

размер на блок = 512 / размер на блок = 1024 / размер на блок = 2048
Задайте размер на блока (по подразбиране 512).
Размер на I/O блок.

uid = стойност и gid = стойност
Задайте собственика и групата на всички файлове. (По подразбиране: uid и gid на текущия процес.)

Тъй като FAT / FAT32 не поддържа собственост и достъп до файлове и директории, всички
дялът се монтира по подразбиране с uid и gid на собственика на процеса
монтаж. Можете да посочите желания потребител и група, от чието име
ще бъде монтиран дял FAT / FAT32. Те могат да бъдат като числови стойности на идентификатори
така и потребителски/групови имена, поне от командния ред има прост
задаване на име на потребител/група.

umask = стойност
Задайте umask (битовата маска на разрешенията, които не присъстват). По подразбиране е umask
на текущия процес. Стойността е дадена в осмична форма.

dmask = стойност
Задайте umask, прилаган само към директории. По подразбиране е umask на текущия процес.
Стойността е дадена в осмична форма.

fmask = стойност
Задайте umask, прилаган само към обикновени файлове. По подразбиране е umask на текущия процес.
Стойността е дадена в осмична форма.

umask, dmask, fmask - маски за разрешения за файлове / директории (umask) или отделно за
директории (dmask) и отделно за файлове (fmask). Всъщност чрез тях се установяват права
собственик (u), група (g) и други потребители (o) за всички файлове и директории на монтирането
раздел vfat. Посочено като осмично число. (Между другото, записване на осмичната стойност
не е задължително да започва от нула.)

проверка = стойност
Могат да бъдат избрани три различни нива на придирчивост:
r
Приемат се главни и малки букви и еквивалентни, дългите части на имената са съкратени
(напр. verylongname.foobar става verylong.foo), водещите и вградените интервали са
се приема във всяка част от името (име и разширение).
н
Като "спокоен", но много специални символи (*,?, Това е по подразбиране.
с
Като "нормално", но имената не може да съдържат дълги части и специални знаци, които
понякога се използват в Linux, но не се приемат от MS-DOS, се отхвърлят.
(+, =, интервали и т.н.)

Контролира проверката за съвпадение на генерираните имена на файлове/директории на vfat дяла
FAT / FAT32 правила и ограничения. По подразбиране е "n".

кодова страница = стойност
Задава кодовата страница за преобразуване в символи за кратко име във файлови системи FAT и VFAT.
По подразбиране се използва кодова страница 437.

По-добре е да посочите параметъра за монтиране. Задава кодовата страница на dos, в която
създадените кратки (във формат 8.3) DOS имена на файлове и директории се записват.
За тези, които все още са работили в DOS и са го настроили, тази цифра не бива да се забравя - за нормално
четене / запазване на руски имена - кодова страница = 866

conv = b / conv = t / conv = a
Fat файловата система може да извършва CRLFNL (MS-DOS текстов формат в UNIX текстов формат) конвертиране
в ядрото. Налични са следните режими на преобразуване:
двоичен - Не се извършва превод. Това е по подразбиране.
текст - CRLFNL превод се извършва на всички файлове.
auto - CRLFNL преводът се извършва на всички файлове, които нямат "добре познати
binary "extension. Списъкът с известни разширения може да бъде намерен в началото
на fs / fat / misc.c (от 2.0 списъкът е:
exe, com, bin, app, sys, drv, ovl, ovr, obj, lib, dll, pif, arc, zip, lha, lzh,
zoo, tar, z, arj, tz, taz, tzp, tpz, gz, tgz, deb, gif, bmp, tif, gl, jpg, pcx,
tfm, vf, gf, pk, pxl, dvi).
Програмите, които изчисляват lseeks, няма да харесат преобразуването на текст в ядрото.
Данните на няколко души са били съсипани от този превод. Внимавай!
За файлови системи, монтирани в двоичен режим, е наличен инструмент за преобразуване (fromdos / todos).

Опитите за улесняване на прехвърлянето на текстови файлове от UNIX-подобни системи към MS-DOS посредством автоматични
заменя CRLFNL в движение. По-добре е да използвате, ако е необходимо за конкретни файлове команда
помощни програми за конвертиране на dos2unix и unix2dos от едноименните пакети или универсалната икона
включени в пакета glibc-common.

cvf_format = модул
Принуждава драйвера да използва модула CVF (компресиран обемен файл) cvf_module вместо
автоматично откриване. Ако ядрото поддържа kmod, опцията cvf_format = xxx също контролира

cvf_option = опция
Опцията се предава на CVF модула.

cvf_format, cvf_option - параметри, указващи конкретен CVF модул и неговите опции
за зареждане от ядрото. не искам да разбирам какво е.

отстраняване на грешки
Включете флага за отстраняване на грешки. Ще бъде отпечатан низ с версия и списък с параметри на файловата система
(тези данни също се отпечатват, ако параметрите изглеждат непоследователни).

Съдейки по описанието, той включва изхода на ред с версията и параметрите на файловата система, когато
монтиране на FAT / FAT32 дял.

мазнини = 12 / мазнини = 16 / мазнини = 32
Посочете 12, 16 или 32 бита мазнини. Това отменя процедурата за автоматично откриване на тип FAT.
Използвайте с повишено внимание!

Вместо автоматично откриване на типа FAT, можете да посочите конкретна негова версия.

iocharset = стойност
Набор на символи за използване за преобразуване между 8-битови символи и 16-битови символи в Unicode.
По подразбиране е iso8859-1.
Дългите имена на файлове се съхраняват на диск във формат Unicode.

Този параметър трябва да бъде посочен, ако се използва не-UTF8 потребителски/системен локал.
Както е написано, дългите имена на файлове и директории се записват в секцията VFAT във формат Unicode.
За да гарантирате, че при прехвърляне към локал на потребителско приложение, който не е конфигуриран с UTF8,
Unicode символите бяха преобразувани в осембитов код, подходящ за този локал, трябва
задайте необходимата таблица за трансформиране на iocharset.
По подразбиране, ако не е посочено, iocharset = ascii, т.е. се предполагат дълги имена
файловете/директориите се състоят от знаци от набора ASCII, за които е тривиално
(едно към едно) конвертиране на Unicode ASCII кодове.
За локала KOI8-R трябва да посочите таблица за преобразуване на знаци в KOI8-R кодове от знаци
Unicode - iocharset = koi8-r (вижте /usr/share/i18n/charmaps/KOI8-R.gz).
Присвояването на iocharset има смисъл само ако системата (или за конкретен потребител,
за който се монтира дялът) използва локал, различен от UTF8.
За UTF-8 локал, пропуснете опцията iosharset и монтирайте дяла със специален
предназначени за този повод самостоятелен вариант"utf8" (виж описанието по-долу).

тихо
Включете тихия флаг. Опитите за chown или chmod файлове не връщат грешки, въпреки че се провалят.
Използвайте с повишено внимание!

Потиска съобщенията за грешки при опит за "chown" или "chmod" файлове на дял
FAT / FAT32. Като цяло, въпреки че предупреждават да използвате тази опция с повишено внимание, тя го прави
ежедневна работа с vfat дялове по-удобна, прозрачно пропускане на заявки за приложения
да изпълнява неподдържани FAT / FAT32 функции, които постоянно се появяват от време на време.
Например, когато архивирате редактиран файл в gedit или използвате rsync
с обичайната опция "-a". Просто трябва да запомните, че дялът, с който работите, е FAT / FAT32 и
имайте предвид, че файловете, поставени върху него, винаги придобиват собственик и посочения режим на достъп
при монтаж. При липса на тази опция, вие също трябва да помните за това, защото постоянно
получавате грешки по време на операцията за архивиране (например трябва да регистрирате специално опции за rsync)
или предупреждения при преместване на файлове поради невъзможност за смяна на собственика и времето им.
Трябва да се внимава, когато правите обратното - получаване на файлове от vfat дялове
с инсталация на собственик.

sys_immutable, showexec, dots, nodots, dotsOK =
Различни погрешни опити да се наложат Unix или DOS конвенции върху FAT файлова система.

Различни опити, с различна степен на успех, за хармонизиране на Unix и DOS конвенциите за
FAT файлова система. Пример и описание на използването на параметъра "showexec" можете да намерите в тази една от редките статии, която не съдържа грешна информация: http://citkit.ru/articles/147/

Опции за монтиране на vfat
======================

uni_xlate
Превеждайте необработените символи на Unicode в специални екранирани последователности. Това ви позволява да архивирате
и възстановяване на имена на файлове, които са създадени с всякакви символи в Unicode. Без тази опция,
"?" се използва, когато не е възможен превод. Ескейпиращият символ е „:“, защото е така
иначе е незаконно във файловата система vfat. Escape последователността, която се използва, където е u
символът на unicode е: ':', (u & 0x3f), ((u >> 6) & 0x3f), (u >> 12).

То също е така полезна опциякогато работите в локал, който не е UTF8. В дълги имена на файлове / директории
могат да бъдат намерени всякакви Unicode символи, включително тези, които не попадат в този набор от 256
символи, което е посочено в таблицата за преобразуване в параметъра iocharset =. Такива символи
се показва като „?“ или ако е посочено тази опцияизглеждат специални
escape последователности. Escape символът е двоеточие ':', защото е забранен
в DOS имена и със сигурност никога не се среща в тях. Потенциално с това активирано
опциите могат да се манипулират с файлове, чиито имена съдържат някой от символите на Unicode.
Имената изглеждат смешни: например ще се покаже файл с име "test".
като ": 0442: 0435: 0441: 0442". Файл с това име може да бъде създаден, копиран,
напишете, преименувайте например на ": 0442: 0435: 0441: 0441", и това ще бъде името на DOS "tess".
Но например, синхронизиране на директории с такива escape последователности в името
използването на rsync няма да работи, очевидно, защото rsync не знае нищо за подобни
преобразувания на имена.

posix
Разрешете два файла с имена, които се различават само в случай.

Позволява създаване на два файла с имена, различни само в случай.

nonumtail
Първо опитайте да направите кратко име без пореден номер, преди да опитате име ~ num.ext.

Когато създава кратко име на dos, то се опитва първо да го създаде без обичайните тилди
с число в края на името.

utf8
UTF8 е безопасното 8-битово кодиране на Unicode, което се използва от конзолата.
Може да се активира за файловата система с тази опция.
Ако 'uni_xlate' бъде зададено, UTF8 се деактивира.

Активира UTF-8 кодиране на Unicode символи, когато се предават към персонализирани приложения
работи в локали UTF-8. Очевидно това е необходимото при нормални условия.
Ако е зададена опцията "uni_xlate", опцията "utf8" е деактивирана.

Теоретично, в локал UTF-8 не можете да използвате опцията "utf8", но да зададете iocharset = utf8.
В източниците fs / fat / inode.c виждаме следното предупреждение:
1105 / * UTF-8 "не предоставя FAT семантика * /
1106 if (! Strcmp (opts-> iocharset, "utf8")) (
1107 printk (KERN_ERR "FAT: utf8 не е препоръчителен набор от символи за IO"
1108 "за файлови системи FAT файловата система ще бъде чувствителна към главни букви! \ N");
1109 }

кратко име =
Определя поведението за създаване и показване на имена на файлове, които се вписват в 8.3 знака.
Ако съществува дълго име за файл, то винаги ще бъде предпочитано показване. Има четири режима:
по-ниско - Принудително налагане на краткото име да се списва с малки букви при показване;
win95 - Принудително въвеждане на краткото име в главни букви при показване;
съхранява дълго име, когато краткото име не е с главни букви.
winnt - Показване на краткото име, както е;
съхранява дълго име, когато краткото име не е изцяло с малки или главни букви.
смесено - Показване на краткото име както е;
съхранява дълго име, когато краткото име не е с главни букви.
По подразбиране е "по-ниско".

Определя как имената на файлове и директории се създават и показват самостоятелно
са във формат 8.3. Ако съществува дълго име за файла, то ще се покаже,
от винаги има предимство. Има четири режима, както е описано. По подразбиране е "по-ниско".
Изглежда по-естествено да се използва "winnt".

След като монтирате дяла, можете да проверите опциите, с които е монтиран от "cat / proc / mounts".

Една особеност се забелязва в RedHat / CentOS: vfat дял винаги се монтира с активирана опция "utf8", дори ако не е посочена в командния ред. Това се случва и в локали, различни от UTF8, което води до факта, че имената на файлове, състоящи се от не-ascii знаци, се показват неправилно (както обикновено изглежда, когато се опитвате да изведете Unicode низ, използвайки всяка кодова таблица от 256 8-битови знака). Това е резултат от корекцията за грешки в Anaconda https://bugzilla.redhat.com/show_bug.cgi?id=181963, когато вместо да коригираме грешка в настройките на инсталатора, ние просто закърпихме ядрото, така че по подразбиране vfat дяловете бяха монтиран с активирана опция "utf8", т.е. .To. тип все едно и много отдавна вече работи само в UTF-8 локали. Но в същото време те забравиха да споменат в man-страницата как да деактивират тази опция https://bugzilla.redhat.com/show_bug.cgi?id=515149

В същия fs / fat / inode.c можете да видите недокументираните параметри, които могат да бъдат настроени за контрол на опциите, включително за деактивиране на "utf8":
905 static match_table_t vfat_tokens = (
906 (Opt_charset, "iocharset =% s"),
907 (Opt_shortname_lower, "кратко име = по-ниско"),
908 (Opt_shortname_win95, "shortname = win95"),
909 (Opt_shortname_winnt, "shortname = winnt"),
910 (Opt_shortname_mixed, "shortname = mixed"),
911 (Opt_utf8_no, "utf8 = 0"), / * 0 или не или false * /
912 (Opt_utf8_no, "utf8 = не"),
913 (Opt_utf8_no, "utf8 = false"),
914 (Opt_utf8_yes, "utf8 = 1"), / * празно или 1 или да или истина * /
915 (Opt_utf8_yes, "utf8 = да"),
916 (Opt_utf8_yes, "utf8 = вярно"),
917 (Opt_utf8_yes, "utf8"),
918 (Opt_uni_xl_no, "uni_xlate = 0"), / * 0 или не или false * /
919 (Opt_uni_xl_no, "uni_xlate = не"),
920 (Opt_uni_xl_no, "uni_xlate = false"),
921 (Opt_uni_xl_yes, "uni_xlate = 1"), / * празно или 1 или да или истина * /
922 (Opt_uni_xl_yes, "uni_xlate = да"),
923 (Opt_uni_xl_yes, "uni_xlate = true"),
924 (Opt_uni_xl_yes, "uni_xlate"),
925 (Opt_nonumtail_no, "nonumtail = 0"), / * 0 или не или false * /
926 (Opt_nonumtail_no, "nonumtail = no"),
927 (Opt_nonumtail_no, "nonumtail = false"),
928 (Opt_nonumtail_yes, "nonumtail = 1"), / * празно или 1 или да или истина * /
929 (Opt_nonumtail_yes, "nonumtail = yes"),
930 (Opt_nonumtail_yes, "nonumtail = true"),
931 (Opt_nonumtail_yes, "nonumtail"),
932 (Opt_err, NULL)
933 };

Сигурно сте чували за файлови системи като FAT32, NTFS и exFAT... Но каква е разликата между тях? Всеки вид има своя собствена собствен комплектпредимства и недостатъци. Ето защо няма единствен вариант. В тази статия ще разбием основните разлики между трите файлови системи.

Говорейки за операционната система Windows, знаем със сигурност, че тя е инсталирана само на логически дял във формат NTFS. Подвижните устройства и други USB-базирани устройства за съхранение използват типа FAT32.

Един от форматите, които могат да се използват за форматиране на флаш устройства, е exFAT, наследник на старата файлова система FAT32.

По този начин имаме три основни формата за съхранение на данни, които обикновено се използват както за Windows, така и за различни видове носители за съхранение.

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

Файловата система е набор от правила, които управляват как документите, съхранявани на устройство, се съхраняват и извличат. Това може да бъде твърд диск, флаш устройство или SD карта.

За по-добро разбиране нека вземем за пример офиса на обикновена компания. Фрагменти от инсталирани документи се съхраняват на определено място, например в чекмедже на бюрото. И когато се наложи отварянето им, файловата система осъществява достъп до файловете в опит да прочете информация.

Полезни статии


Да предположим за секунда, че такава система не работи и веднага получаваме огромно количество неидентифицирани данни, които няма как да се проучат.

Всъщност има голям брой файлови системи, например Flash Файлова система, лентова файлова система и дискова файлова система, но ще се спрем само на основните - FAT32, NTFSи exFAT.

Какво е FAT32

Файловата система FAT32 е най-старата и най-опитната в историята на компютърните технологии. Неговото пътуване започна с оригиналната 8-битова FAT система през 1977 г., която функционираше в автономен диск. Самостоятелен диск на Microsoft Basic-80... Той беше пуснат специално за Intel 8080 NCR 7200през 1977/1978 г., работещ като терминал за въвеждане на данни с 8-инчови флопи дискове.

След дискусии относно въвеждането на системата с основателя на Microsoft Бил Гейтс, кодът е написан от първия служител на компанията Марк Макдоналд.

Основната задача на файловата система FAT беше да работи с данни в операционната система Microsoft 8080 / Z80, базирана на платформата MDOS / MIDAS, написана от Марк Макдоналд.

В бъдеще FAT претърпя някои промени, постепенно преминавайки от първоначалната си форма към FAT12, FAT16 и накрая, FAT32, чието име сега е тясно свързано с външни устройства.

Основната разлика между FAT32 и неговите предшественици е да се преодолее ограниченото количество информация, налична за съхранение. 32-битоваСистемата беше пусната през август 1995 г. с пускането на Windows 95 и в своята актуализация увеличи горните граници за размери на файлове и съхранение до 4GB и 16TB.

По този начин FAT32 не е предназначен за съхранение на големи количества данни и инсталиране на тежки приложения. Именно поради тази причина файловата система се използва на твърди дискове. NTFSкоето позволява на потребителите да спрат да мислят за количеството информация, която се изтегля.

В обобщение, системата FAT32 е идеална за съхранение на данни, които не надвишават 4 GB на всеки преносим носител. Популярността му не се ограничава само до компютърната сфера. Използва се в игрови конзоли, телевизори с висока резолюцияизображения, DVD плейъри, Blu-ray плейъри и всякакви други устройства с USB порт. FAT32 се поддържа от всички версии на Windows, Linux и MacOS.

Какво е NTFS

През 1993 г. Microsoft представи нова файлова система NTFS(Нова технологична файлова система) успоредно с появата на операционната система Windows NT 3.1.

Основната характеристика на системата NTFS е липсата на ограничения за размера на качените файлове. Дори и да се опитаме да надхвърлим тази граница, щяхме да се провалим – толкова е страхотно.

Разработката започва в средата на 80-те години на миналия век по време на сътрудничество между Microsoft и IBM, чиято цел е да се създаде нова операционна система, която превъзхожда предишните по отношение на графичната производителност.

Въпреки това съюзът на двете компании не продължи дълго и без да завършат общия проект, те решиха да прекратят сътрудничеството. Впоследствие Microsoft и IBM се концентрират върху създаването на свои собствени файлови системи.

За компютърните технологии през 1989 г. се създава HPFS на IBM, който се използва за операционната система OS/2. Няколко години по-късно, през 1993 г., стартира Microsoft NTFS v1.0която стана официалната файлова система за Windows NT 3.1.

Теоретичният размер на NTFS файла е 16 EB - 1 KB, което е 18 446 744 073 709 550 502 байта. Екипът за разработка включва Том Милър, Хари Кимура, Брайън Андрю, Дейвид Гебел.

Следващата версия на файловата система беше NTFS v3.1стартира специално за Microsoft Windows XP. В бъдеще той не претърпя никакви специални промени, въпреки че към него бяха направени много различни допълнения. Например, се появи възможността за компресиране на логически дялове, възстановяване и NTFS символни връзки. В допълнение, първоначалният капацитет на файловата система беше само 256 MB от огромните 16 EB - 1 KB в по-новите версии, пуснати с пускането на Windows 8.

Някои от полезните функции, въведени в NTFS v3.1, включват разширяване на поддържаните файлови формати, квоти за използване на диск, криптиране на файлове и точки за повторна обработка. Забележителен е фактът, че по-новите версии на NTFS са напълно съвместими с предишните.

Файловата система NTFS има важна функция, когато става въпрос за възстановяването й от всякакъв вид повреда. Той съдържа специфична структура от данни, която проследява всякакви промени в системата и с която винаги можете да възстановите NTFS да работи.

Тази файлова система се поддържа от всички версии на Windows, започвайки от Windows XP. За съжаление, macOS не споделя устройството за съвместимост, популяризирано от Microsoft. Apple остави на потребителите възможността да четат данни от NTFS устройства, но те няма да могат да пишат на тях. Поддръжката за тази файлова система от Linux е ограничена само до няколко от нейните версии.

Какво е exFAT

ExFAT(Extended FAT) е нова, разширена файлова система от Microsoft, която успешно замества своя предшественик в областта, когато става въпрос за големи количества информация.

Както вероятно знаете, повечето съвременни цифрови фотоапарати използват системата exFAT, тъй като тя е значително по-лека от NTFS, но в същото време може да съхранява файлове, по-големи от 4 GB, за разлика от FAT32.

По този начин, копирайки 6 GB документ на флаш устройство с файловата система exFAT, няма да се сблъскате с негативните последици, които могат да се наблюдават при използване на предишната версия на системата.

Форматът exFAT набира популярност и се използва предимно с SDXC карти с памет с голям капацитет. Основната причина за това е малкият размер на файловата система и, както беше описано по-горе, възможността за съхранение на документи, по-големи от 4 GB.

Интересен факт е, че Microsoft притежава патент на САЩ 8321439, който ви позволява бързо да намерите файл, използвайки хеш на името. Благодарение на тази функция всеки документ може да бъде намерен многократно по-бързо.

Струва си да се отбележи, че за файловата система exFAT всички налични добавки не са пуснати публично. Доставчиците трябва да закупят ограничен лиценз от Microsoft, за да ги закупят.

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

Тъй като Microsoft е непроменен в своята упоритост, много потребители започнаха да създават свои собствени модификации на exFAT, една от които беше предпазител на мазнини... Той осигурява операции за четене и запис за Linux дистрибуциивключително FreeBSD.

Файловата система exFAT, създадена през 2006 г., която има общо ограничение за количеството информация, която прави NTFS, е по-лека, тъй като не съдържа всички видове допълнения, като втората.

ExFAT поддържа четене, писане и е съвместим с операционни системи Mac, Android и Windows. За Linux се нуждаете от поддържащ софтуер.

Сравнение на файлови системи

FAT32:

  • съвместимост: Windows, MacOS, Linux, игрови конзолии устройства с USB порт.
  • Професионалисти:кросплатформена съвместимост, лека файлова система.
  • минуси:ограничения за размера на файла (достъпни са документи до 4 GB) и размери на дяловете до 16 TB.
  • Предназначение:сменяеми устройства. Използва се за форматиране на флаш памети, но за предпочитане е exFAT.

NTFS:

  • съвместимост: Windows, MacOS (само за четене), Linux (само за четене за някои дистрибуции), Xbox One.
  • Професионалисти:няма ограничения за размера на файловете и секциите.
  • минуси:ограничена междуплатформена съвместимост.
  • Предназначение:подходящ за вътрешни твърди дискове, тъй като ви позволява да съхранявате големи количества информация, с която други файлови системи не могат да се справят.

exFAT:

  • съвместимост: Windows XP и други по-късни версии, MacOS 10.6.5 и по-нови, Linux (с помощта на FUSE), Android.
  • Професионалисти:има общи положителни ефекти от FAT32 и NTFS, които включват възможността за съхранение на файлове, по-големи от 4GB.
  • минуси: Microsoft ограничава използването на лиценза.
  • Предназначение:Премахва ограниченията за размера на файловете за сменяеми устройства за съхранение. Много за предпочитане пред своя предшественик FAT32.

Ако трябва да възстановите логически дял с неизвестна, повредена или изтрита файлова система, инструментите за възстановяване на Starus ще ви помогнат.

Инструмент Възстановяване на дял на Starus, или неговите аналози, Starus Възстановяване на мазнини, Starus NTFS Recovery, са предназначени за работа със специфични файлови системи – FAT и NTFS. Основният софтуер може да взаимодейства и с двете. Можете да изтеглите и изпробвате програми за възстановяване на файлови системи FAT32 и NTFS безплатно!