Operační paměti jsou sice rychlé a umožňují přímo přistupovat k jednotlivým bajtům uložených dat, ale jejich obsah mizí při ztrátě napájení elektrickou energií a ani jejich kapacity nedosahují potřebných velikostí, ačkoliv se situace pomalu zlepšuje.
Vzhledem k vlastnostem pamětí musí operační systémy a aplikace, jež v rámci nich běží, uchovávat svá data na jiném médiu, kde nezmizí po odpojení od zdroje elektrické energie a kam jich lze zapsat dostatečné množství.
Tato kritéria splňují dnes velmi používané magnetické pevné disky, ale též i jiná média – disky CD/DVD, magnetické pásky, flash disky či pevné disky bez pohyblivých součástí (SSD – Solid State Drive). Pevné disky se označují také jako sekundární paměť, CD/DVD a pásky jako paměť terciální.
Magnetické pevné disky jsou výrazně pomalejší než operační paměti a mají výkonnostní problémy při náhodném přístupu. Aby jejich přenosové rychlosti čtení a zápisu zůstaly v únosných mezích, neumožňují pracovat s jednotlivými bajty, ale s jejich bloky – sektory. Jeden sektor obsahuje v případě dnes používaných pevných disků 512 bajtů, ale u médií CD/DVD či flash disků může být mnohem větší.
Operační systém ani aplikace však nepracují s pevným diskem tak, že by na něj svá data zapisovaly přímo sektor po sektoru, ačkoliv tak činit mohou. Kdyby s daty pracovaly takovým způsobem, vznikal by velký prostor pro nekompatibilitu, protože každý program či každá součást operačního systému by mohly data ukládat odlišným způsobem. Navíc by se jednotlivé entity musely dohodnout tak, aby jedna nepřepisovala data druhé. Dále by neexistovala žádná možnost, jak určitý obsah ochránit před neautorizovaným přístupem.
Z tohoto důvodu aplikace a větší část operačního systému s diskem pracují prostřednictvím speciální vrstvy – souborového systému, která provádí následující:
-
Pamatuje si, které oblasti disku jsou volné a které již obsahují platná data.
-
Poskytuje jednotný způsob ukládání, čtení a identifikace dat. Obvykle pro tyto účely definuje alespoň dvě entity. Soubory slouží k uchovávání dat. Adresáře žádná data obsahovat nemohou a jejich účelem je hlavně zpřehlednit strukturu obsahu uloženého na médiu. Mohou obsahovat soubory a další adresáře. Tímto na médiu vzniká stromová struktura, kde soubory se nachází v listech. Protože každý objekt má jméno, lze jej jednoznačně identifikovat posloupností objektů, které se nacházejí mezi kořenem stromu a jím samotným. Například jeden soubor se jménem atapi.sys se nachází v adresáři drivers, jenž leží ve složce system32, která je položkou adresáře Windows, jenž je jedním z potomků kořene. Tento soubor lze tedy jednoznačně identifikovat v rámci celého stromu postupným uvedením jmen všech objektů od kořene až k němu:
C:\Windows\system32\drivers\atapi.sys
Tento řetězec se nazývá cesta nebo také plná cesta k souboru. Jako oddělovače mezi jmény jednotlivých objektů se na Windows používají zpětná lomítka („\“).
| Prefix „C:\“ označuje nejen kořenový uzel (kořenový adresář) souborového systému, ale také instanci souborového systému, které se cesta týká. Windows umožňují prostor disku rozdělit do několika větších oblastí – diskových oddílů, přičemž každá je spravována svým souborovým systémem nezávisle na ostatních. Windows každý z oddílů jedinečně identifikují písmenem (v příkladu se jedná o C). Aplikace mohou jednotlivé oddíly chápat jako oddělené pevné disky. |
-
Umožňuje zabezpečit data (reprezentovaná soubory) před přístupem subjektů (uživatelů), kteří k nim nemají oprávnění. Dále některé souborové systémy podporují kompresi dat za účelem šetření volného místa nebo jejich šifrování, aby je nemohl přečíst ani ten,kdo má k médiu fyzický přístup. Tyto mechanismy jsou potřebné hlavně ve firemním prostředí a nejsou implementovány ve všech souborových systémech.
Souborové systémy podporované Windows obvykle s diskem či jiným médiem nepracují na úrovni sektorů, ale definují si vlastní jednotku, která se označuje cluster. Do češtiny se tento termín někdy překládá jako alokační jednotka. Velikost jednoho clusteru je pevná pro danou instanci souborového systému a zpravidla se rovná několika sektorům (velikost alokační jednotky a sektoru se ale také může rovnat). Například souborový systém NTFS používá clustery velikosti 8 sektorů, což pro pevné disky, které tento systém používají, dává velikost 4 KB.
FAT
Souborový systém FAT se dnes uplatňuje zejména na flash discích, paměťových kartách a jiných vyjímatelných médiích. Jeho vnitřní struktura je v porovnání s jinými souborovými systémy relativně jednoduchá. Kvůli ní však trpí určitými omezeními, která jej předurčují pouze na použití na zařízeních nebo diskových oddílech s menší kapacitou.
Dále je také nutné poznamenat, že zkratka FAT označuje celou třídu, a ne pouze jeden souborový systém. Obvykle se do této třídy řadí systémy FAT12, FAT16 a FAT32. Důvodem tohoto zařazení je velká podobnost všech tří souborových systémů.

Formátovat systémové či větší diskové oddíly se tímto souborovým systémem nevyplatí, protože neumožňuje řídit přístup k jednotlivým souborům pomocí oprávnění. Není nad ním implementován žádný bezpečnostní model. Dále nedokáže detekovat případné poškození některých sektorů a jejich obsah překopírovat na jiné, nepoškozené místo. Většinu interních datových struktur přemístit prostě nelze.
Další nevýhoda tohoto systému spočívá v pomalejším zjišťování, zda se v určitém adresáři nachází položka zadaného jména. Obsah adresáře totiž reprezentuje polem záznamů, které není uspořádáno žádným způsobem (například seřazené podle jmen jeho položek). Z tohoto důvodu se při testu existence musí prohledat až všechny záznamy tohoto pole. V případě souborového systému NTFS, kde adresář uchovává seznam svých položek jako strom (konkrétně se jedná o tzv. B* strom), je nutné prohledat pouze malý zlomek celé datové struktury.
Oddíl formátovaný souborovým systémem FAT se skládá z několika oblastí. Jejich rozložení je na obrázku.
Na počátku oddílu se nachází několik rezervovaných sektorů, z nich nejdůležitější úlohu hraje první z nich, tzv. boot sektor, který krom části zaváděcího kódu obsahuje i základní informace o strukturách souborového systému.
Boot sektor se skládá ze dvou částí. První z nich, popsaná tabulkou 1, je společná pro všechny druhy souborového systému FAT (FAT12, FAT16 i FAT32). Druhá, jejíž strukturu vidíte v tabulkách 2 a 3, je specifická pro konkrétní typ.
| Offset | Délka (byte) | Název | Popis |
|---|---|---|---|
0x000 |
3 |
BS_jmpBoot |
Počátek kódu zavaděče. Jedná se o instrukci skoku na startovací kód, který se v boot sektoru nachází ihned za informacemi o interních strukturách souborového systému. |
0x003 |
8 |
BS_OEMName |
Toto pole by mělo obsahovat řetězec ASCII „MSWIN4.1“, Windows však jeho obsah nikdy nekontrolují a ani nepoužívají. |
0x00B |
2 |
BPB_BytesPerSec |
Počet bajtů v jednom sektoru. Obvykle 512. |
0x00D |
1 |
BPB_SecPerClus |
Počet sektorů v jedné alokační jednotce (v clusteru). |
0x00E |
2 |
BPB_RsvdSecCnt |
Počet rezervovaných sektorů včetně boot sektoru. Jedná se o velikost první oblasti (žlutá) z obrázku v sektorech. FAT12 a FAT16 obvykle obsahují pouze jeden rezervovaný sektor (boot sektor), FAT32 obvykle tuto oblast prodlužují na 32 sektorů. |
0x010 |
1 |
BPB_NumFATs |
Počet tabulek FAT. |
0x011 |
2 |
BPB_RootEntCnt |
Maximální počet položek kořenového adresáře. Používá se pouze na systémech FAT12 a FAT16 a nepřímo určuje velikost třetí oblasti (modrá) na obrázku. |
0x013 |
2 |
BPB_TotSec16 |
Pro FAT12 a FAT16 obsahuje celkový počet sektorů diskového oddílu, vejde-li se toto číslo do dvou bajtů (65535 sektorů). U větších diskových oddílů se pro tyto účely používá položka BPB_TotSec32. Systém FAT32 používá pouze TotSec32 a TotSec16 nastavuje vždy na nulu. |
0x015 |
1 |
BPB_Media |
Určuje typ média, na kterém se oddíl nachází. Pro pevné disky je vyhrazena hodnota 0xF8. |
0x016 |
2 |
BPB_FATSz16 |
Obsahuje počet sektorů zabraných jednou tabulkou FAT na souborových systémech FAT12 a FAT16. FAT32 pro určení velikosti jedné tabulky používá hodnotu pole BPB_FATSz32. |
0x018 |
2 |
BPB_SecPerTrk |
Udává počet sektorů na stopu. |
0x01A |
2 |
BPB_NumHeads |
Počet hlav diskového zařízení. |
0x01C |
4 |
BPB_HiddSec |
Udává počet sektorů, které na diskovém zařízení předcházejí daný oddíl. |
0x020 |
4 |
BPB_TotSec32 |
Celkový počet sektorů diskového oddílu. Používá se převážně u systémů FAT32. |
| Offset od počátku boot sektoru | Délka (byte) | Název | Popis |
|---|---|---|---|
0x024 |
4 |
BS_DrvNum |
Číslo diskového zařízení. Například 0x80. Má význam pouze pro přerušení BIOSu 0x13, které umožňuje pracovat s disky v reálném režimu procesoru. |
0x025 |
1 |
BS_Reserved1 |
Na disketách obsahuje hodnotu 0x00, u pevných disků se používá většinou 0x80. |
0x026 |
1 |
BS_BootSig |
Hodnota 0x29 znamená, že následující tři položky se v boot sektoru nacházejí. |
0x027 |
4 |
BS_VolID |
„Sériové číslo“ disku. Používá se spolu s obsahem položky BS_VolLab pro jednoznačnou identifikaci vyjímatelných médií. Při formátování se odvozuje z aktuálního data a času. |
0x02B |
11 |
BS_VolLab |
Název diskového oddílu. Pro nepojmenované oddíly by mělo toto pole obsahovat řetězec „NO NAME “. |
0x036 |
8 |
BS_FileSysType |
Obsahuje jednu z následujících hodnot: „FAT12“, „FAT“, nebo „FAT16 “ Jedná se však pouze o informativní řetězec a nepoužívá se pro určení typu souborového systému, kterým je oddíl formátován. |
| Offset od počátku boot sektoru | Délka (byte) | Název | Popis |
|---|---|---|---|
0x024 |
4 |
BPB_FATSz32 |
Velikost jedné tabulky FAT v sektorech. |
0x028 |
2 |
BPB_ExtFlags |
Bity 0-3: Index aktivní tabulky FAT (0 = první tabulka). Hodnota je platná pouze pokud není aktivován mechanismus zrcadlení. Bit 7: nulová hodnota značí, že obsah tabulky FAT je v reálném čase zrcadlen do všech ostatních tabulek, které se nachází v druhé oblasti oddílu z obrázku 1. Hodnota 1 značí, že je aktivní pouze jedna tabulka FAT, její index obsahují bity 0-3. |
0x02A |
2 |
BPB_FSVer |
Horní bajt: majoritní číslo verze systému FAT32. Dolní bajt: minoritní číslo verze systému FAT32. |
0x02C |
4 |
BPB_RootClus |
Číslo počátečního clusteru s daty kořenového adresáře. Obvykle toto pole nese hodnotu 2, která značí první cluster datové oblasti. Clustery datové oblasti se číslují právě od hodnoty 2. |
0x030 |
2 |
BPB_FSInfo |
Číslo rezervovaného sektoru s dalšími informacemi o souborovém systému FAT32 použitém na daném oddílu. |
0x032 |
2 |
BPB_BkBootSec |
Číslo rezervovaného sektoru, který obsahuje kopii boot sektoru. |
0x034 |
12 |
BPB_Reserved |
Rezervováno pro budoucí využití. |
0x040 |
1 |
BS_DrvNum |
Číslo diskového zařízení. Například 0x80. Má význam pouze pro přerušení BIOSu 0x13, které umožňuje pracovat s disky v reálném režimu procesoru. |
0x041 |
1 |
BS_Reserved |
Na disketách obsahuje hodnotu 0x00, u pevných disků se používá většinou 0x80. |
0x042 |
1 |
BS_BootSig |
Hodnota 0x29 znamená, že následující tři položky se v boot sektoru nacházejí. |
0x043 |
4 |
BS_VolID |
„Sériové číslo“ disku. Používá se spolu s obsahem položky BS_VolLab pro jednoznačnou identifikaci vyjímatelných médií. Při formátování se odvozuje z aktuálního data a času. |
0x047 |
11 |
BS_VolLab |
Název diskového oddílu. Pro nepojmenované oddíly by mělo toto pole obsahovat řetězec „NO NAME “. |
0x052 |
8 |
BS_FileSysType |
Obsahuje řetězec „FAT32“. Jedná se však pouze o informativní hodnotu, stejně jako v případě stejnojmenné položky v tabulce 2. |
Další oblast (zelená na obrázku 1) je vyhrazena pro uložení tabulek FAT (File Allocation Table), podle kterých získal souborový systém své jméno. Každou z tabulek můžete chápat jako pole hodnot, které určují stav jednotlivých alokačních jednotek (clusterů) datové oblasti. První dvě položky mají speciální význam. Třetí záznam, který se tedy nachází pod indexem 2, obsahuje informace o stavu prvního clusteru datové oblasti. Z tohoto důvodu se i první alokační jednotka datové oblasti označuje jako alokační jednotka číslo 2. Mapování záznamů tabulky FAT na datovou oblast ilustruje obrázek 2.
| Tabulek FAT může být v druhé oblasti uloženo více. Na souborových systémech FAT12 a FAT16 se používá vždy ta první, jejíž obsah se kopíruje na případné další tabulky. U souborového systému FAT32 o používané (aktivní tabulce FAT) rozhoduje pole BPB_ExtFlags. |
Velikostí položky tabulky FAT se od sebe odlišují jednotlivé typy souborového systému. FAT12, který využívá pouze 12bitové záznamy, dokáže tabulkou FAT adresovat přibližně 4096 (\(2^{12}\)) alokačních jednotek a používal se na formátování disket. Typ FAT16 (též často označovaný prostě jako FAT) používá záznamy délky 16 bitů, čímž rozšiřuje počet adresovatelných clusterů na přibližně 65536 (\(2^{16}\)) a používá se u paměťových karet a flash disků do velikosti několika GB. FAT32 používá záznamy délky 32 bitů, a umožňuje tedy adresovat teoreticky až téměř \(2^{32}\) clusterů.
| Souborové systémy FAT do alokačních jednotek (clusterů) rozdělují pouze datovou oblast diskového oddílu. Maximální velikost clusteru je dána počtem bajtů na sektor a omezením maximálního počtu sektorů na cluster na 128 a je omezena na 32, nebo 64 KB. Naproti tomu souborový systém NTFS rozděluje na alokační jednotky celý diskový oddíl. |
Stav každé alokační jednotky datové oblasti vyjadřuje hodnota v příslušném záznamu aktivní tabulky FAT. Možné hodnoty a jejich význam naleznete v tabulce 4.
| FAT12 | FAT16 | FAT32 | Popis |
|---|---|---|---|
0x000 |
0x0000 |
0x00000000 |
Volná alokační jednotka. |
0x001 |
0x0001 |
0x00000001 |
Alokační jednotka je rezervována. |
0x002 – 0xFEF |
0x0002 až 0xFFEF |
0x00000002 až 0x0FFFFFEF |
Cluster obsahuje data souboru či adresáře. Hodnota záznamu v tabulce FAT udává číslo následujícího clusteru s daty daného objektu. |
0xFF0 – 0xFF6 |
0xFFF0 až 0xFFF6 |
0x0FFFFFF0 až 0x0FFFFFF6 |
Tato hodnota je rezervována. |
0xFF7 |
0xFFF7 |
0x0FFFFFF7 |
Vadná alokační jednotka. |
0xFF8 – 0xFFF |
0xFFF8 až 0xFFFF |
0x0FFFFFF8 až 0x0FFFFFFF |
Cluster obsahuje data souboru nebo adresáře. Na tento cluster již žádná další data objektu nenavazují. |
Tabulku FAT lze také chápat jako pole spojových seznamů, každý z nich spojuje clustery s daty jednoho souboru či adresáře. Každá obsazená alokační jednotka má ve svém záznamu v tabulce FAT odkaz na následníka, pokud existuje.
Nevýhoda tohoto způsobu zaznamenávání uložení dat jednotlivých souborů a složek spočívá v tom, že ovladač souborového systému nemůže rychle najít data, která se nacházejí uprostřed nějakého souboru. Musí projít celý seznam, dokud na hledanou oblast nenarazí. Třetí oblast na obrázku 1 slouží k uložení souborů a složek, které se nacházejí v kořenovém adresáři. Maximální počet těchto položek, a tedy i velikost oblasti, udává položka BPB_RootEntCnt v boot sektoru. Každý soubor nebo adresář je reprezentován minimálně jedním 32bajtovým záznamem, jehož struktura bude popsána níže.
Na souborovém systému FAT32 není velikost kořenového adresáře nijak omezena. Nachází se spolu s daty ostatních souborů a složek v datové oblasti (poslední oblast na obrázku 1). Oblast kořenového adresáře v tomto případě vůbec neexistuje.
Adresáře
Na souborových systémech FAT lze adresář považovat za speciální typ souboru. Ovladač souborového systému předpokládá, že data takového souboru reprezentují seznam položek, jenž daná složka obsahuje. Obsah takového souboru je interpretován jako pole 32bajtových záznamů. Ve zjednodušené variantě souborového systému, která nedovoluje jména souborů delší než 12 znaků (8 znaků na jméno a 3 znaky na příponu), každý takový záznam odpovídá jednomu souboru či podadresáři. Pole záznamů není žádným způsobem seřazeno, což znemožňuje implementovat rychlejší algoritmy například na testování existence objektu. Ovladač vždy musí prozkoumat každý záznam. Strukturu jednoho záznamu ukazuje tabulka 5.
| Offset | Délka (byte) | Název | Popis |
|---|---|---|---|
0x00 |
11 |
DIR_Name |
(Krátký) název položky. Prvních osm znaků tvoří hlavní část jména, zbylé tři příponu, kterou ovladač souborového systému od zbytku jména odděluje tečkou. Pokud je délka jména kratší než 11 znaků, zbývající místo je vyplněno mezerami (znak s kódem 0x20). |
0x0B |
1 |
DIR_Attr |
Atributy souboru nebo adresáře. Jedná se o bitovou masku, která určuje některé vlastnosti položky. Více se dočtete později. |
0x0C |
1 |
DIR_NTRes |
Rezervováno. |
0x0D |
1 |
DIR_CrtTimeTenth |
Milisekundová část času vytvoření uvedená v setinách sekundy (platný rozsah je 0-199 včetně). |
0x0E |
2 |
DIR_CrtTime |
Čas vytvoření souboru s přesností na dvě sekundy. Další zpřesnění udává předchozí položka. |
0x10 |
2 |
DIR_CrtDate |
Datum vytvoření souboru či adresáře. |
0x12 |
2 |
DIR_LastAccDate |
Datum posledního přístupu. |
0x14 |
2 |
DIR_FsClusHi |
Horních 16 bitů indexu položky v tabulce FAT odpovídající prvnímu clusteru s daty souboru či adresáře. |
0x16 |
2 |
DIR_WrtTime |
Čas posledního zápisu. |
0x18 |
2 |
DIR_WrtDate |
Datum posledního zápisu. |
0x1A |
2 |
DIR_FsClusLo |
Dolních 16 bitů indexu položky v tabulce FAT odpovídající prvnímu clusteru s daty souboru či adresáře. |
0x1C |
4 |
DIR_FileSize |
Velikost souboru v bajtech. Adresáře mají tuto položku nastavenou na nulu. |
Krom své délky jsou jména souborů a složek (DIR_Name) omezena také co se týče přípustných znaků. Nemohou obsahovat libovolný z následujících znaků:
" * +. /: ; < = >? [ \ ] |
Dále nejsou povoleny žádné znaky, jejichž kód ASCII je menší než 0x20. Výjimku z tohoto pravidla tvoří znak s kódem 0x05, který zastupuje znak s kódem 0xE5, jenž, pokud jím jméno položky začíná, má speciální význam. Do jména též nejsou ukládána malá písmena abecedy, ovladač souborového systému je automaticky konvertuje na velká.
První znak může nabývat několika speciálních hodnot: * 0xE5 – příslušný záznam neobsahuje platné informace o žádné položce. Nastavení této hodnoty znamená smazání daného souboru či složky ze seznamu položek adresáře. Z tohoto důvodu se může při obnovování ztracených dat z diskového oddílu formátovaného některým ze souborových systémů FAT stát, že obnovovací utilita nedokáže zrekonstruovat první znak jejich jmen.
-
0x00 – oznamuje ovladači souborového systému, že od tohoto záznamu až do konce clusterů vyhrazených pro data adresáře se nenachází žádný platný záznam. Ovladač tedy oblast za tímto záznamem nemusí prohledávat.
-
0x05 – zastupuje znak s kódem 0xE5, který se běžně vyskytuje ve znakových sadách používaných v Japonsku.
Položka DIR_Attr obsahuje bitovou masku, která určuje tzv. atributy souboru (adresáře). Může nabývat jedné či několika z následujících příznaků:
-
ATTR_READ_ONLY (0x01) – soubor je určen jen pro čtení. Každý pokus o zápis selže.
-
ATTR_HIDDEN (0x02) – tuto položku by souborový manažer neměl při normálním výpisu obsahu adresáře zobrazit. Tímto atributem jsou zpravidla označeny důležité soubory systému.
-
ATTR_SYSTEM (0x04) – daný soubor či adresář obsahuje data operačního systému.
-
ATTR_VOLUME_ID (0x08) – každý diskový oddíl by měl v kořenovém adresáři obsahovat právě jeden soubor s tímto atributem. Jméno tohoto souboru určuje jméno příslušného diskového oddílu.
-
ATTR_DIRECTORY (0x10) – záznam reprezentuje adresář.
-
ATTR_ARCHIVE (0x20) – ovladač souborového systému tento atribut nastaví při vytvoření, modifikaci či přejmenování souboru či složky. Příznak slouží jako indikace pro zálohovací programy.
Každý adresář obsahuje minimálně dva platné záznamy. První záznam se jmenuje „.“ a odkazuje na svého rodiče (je tedy synonymem pro aktuální adresář). Druhý záznam se jmenuje „..“ a odkazuje do adresářového stromu o úroveň výš než první záznam. Díky těmto položkám je ovladač souborového systému přirozeně schopen zpracovat cesty, které obsahují reference na aktuální (.) či nadřazenou složku (..). Ovladač souborového systému tyto položky emuluje.
Dlouhá jména
Výše popsaná struktura adresáře omezuje maximální délku jména položek na celkem 12 znaků. Microsoft se toto omezení rozhodl zrušit již u souborového systému FAT16, a to takovým způsobem, aby byla zachována zpětná kompatibilita s již existujícími ovladači a utilitami pro správu disků. Položka adresáře se nyní neskládá pouze z jednoho 32bajtového záznamu, který popisuje její vlastnosti, ale i z dalších druhů záznamů, které obsahují její jméno.
Tyto nové záznamy mají též délku 32 bajtů a jejich struktura je podobná struktuře obyčejných záznamů, jež se někdy označují jako záznamy s krátkým jménem. Strukturu nového záznamu ukazuje tabulka 6.
| Offset | Délka | Název | Popis |
|---|---|---|---|
0x00 |
1 |
LDIR_Ord |
Pořadové číslo záznamu. Jedná-li se o poslední záznam (s nejvyšším číslem), tato hodnota je logickým součtem zkombinována s číslem 0x40. |
0x01 |
10 |
LDIR_Name1 |
Pět znaků jména ve formátu Unicode. |
0x0B |
1 |
LDIR_Attr |
Na tomto místě se u záznamu dlouhého jména nachází atributy a záznam dlouhého jména lze právě podle této hodnoty rozpoznat. Záznamy dlouhého jména se vyznačují vždy atributy se čtyřmi dolními příznaky nastavenými na 1. |
0x0C |
1 |
LDIR_Type |
Typ záznamu. Tento prvek musí být vždy nastaven na nulu a jeho využití bylo plánováno v budoucích verzích souborového systému. |
0x0D |
1 |
LDIR_CheckSum |
Kontrolní součet dlouhého jména. |
0x0E |
12 |
LDIR_Name2 |
6 znaků jména položky ve formátu Unicode. |
0x1A |
2 |
LDIR_FstClusLO |
Tato hodnota musí být vždy nastavena na nulu. Důvodem je zpětná kompatibilita s programy, které s dlouhými jmény neumějí pracovat. |
0x1C |
4 |
LDIR_Name3 |
Dva znaky jména položky ve formátu Unicode. |
Každý záznam dlouhého jména obsahuje nejvýše třináct znaků názvu položky. Každý soubor nebo adresář může být popsán až dvaceti těmito záznamy a jedním záznamem krátkého jména, což omezuje maximální délku názvu na 260 znaků. Interní limit je nastaven na 255 znaků.
Dlouhé jméno položky je vždy zakončeno jedním nulovým znakem ve formátu Unicode. Případné další nepoužité znaky v záznamu jsou vyplněny bajty s hodnotou 0xFF.
Každý soubor nebo adresář je popsán souvislým blokem záznamů dlouhého jména ihned následovaným jedním záznamem krátkého jména. Záznamy dlouhého jména jsou v tomto bloku uloženy v opačném pořadí, než by každý očekával. Struktura obsahující poslední znaky dlouhého jména se nachází v bloku jako první, kdežto záznam s pořadovým číslem 1, jenž obsahuje prvních 13 znaků jména, leží až těsně před záznamem krátkého jména. Situaci ilustruje obrázek 3.
Kromě větší maximální délky přinesla dlouhá jména souborů i adresářů možnost používat znaky, které jsou v krátkých názvech zakázány. Konkrétně se jedná o:
+. ; = [ ]
V dlouhých názvech se také častěji používají mezery, které patří i mezi povolené znaky do krátkých jmen. Nelze je použít pouze na počátku a konci dlouhého názvu (jsou ovladačem souborového systému ignorovány).
NOTE:Protože i soubory a adresáře s dlouhým jménem jsou reprezentovány jedním záznamem krátkého jména, disponují vlastně dvěma názvy. Ovladač souborového systému implementuje algoritmus, který pro dané dlouhé jméno vytváří jedinečný krátký název, který pak umisťuje do záznamu krátkého jména. Mezi dlouhými a krátkými jmény tedy existuje mapování 1:1. Více o tomto algoritmu najdete v dokumentu [13].
NTFS
FAT byl navržen pro použití na úložných zařízeních menších kapacit a dříve se využíval i k formátování systémových oddílů v domácím prostředí, kde ve většině případů pevné disky neobsahují citlivá data a není potřeba omezovat oprávnění jednotlivých uživatelů k souborům a složkám. Hlavní síla těchto souborových systémů spočívá v jednoduchosti a efektivitě na menších diskových oddílech. Nepodporují však mnoho pokročilejších funkcí a vlastností.
NTFS (New Technology File System) byl od počátku navrhován jako souborový systém pro obecné použití, který lze nasadit i do náročných podmínek. Disponuje vlastnostmi a mechanismy, které umožňují definovat oprávnění různých subjektů (uživatelů, skupin) k jednotlivým souborům a adresářům, chránit citlivá data šifrováním či přesouvat obsah z poškozených clusterů na bezpečná místa. Další užitečnou vlastností je žurnálování a s tím související podpora transakcí.
| Vnitřní strukturu NTFS filesystému Microsoft nepublikoval, avšak vyvojářům Linuxového jádra se podařilo většinu věcí metodou reverzního inženýrství odhalit. Proto je v Linuxu možné číst i zapisovat diskové oblasti s filesystémem NTFS. |
Tento oddíl se nejprve zaměří na bližší popis těchto vlastností. V druhé polovině se věnuje popisu toho, jak souborový systém reprezentuje soubory a adresáře na disku.
| Samotný ovladač NTFS (ntfs.sys) neimplementuje všechny vlastnosti, které tento souborový systém nabízí. V některých případech spoléhá na ovladače-filtry, které se v řetězci zařízení nacházejí nad ním, nebo pod ním. |
Bezpečnostní model
NTFS umožňuje definovat pro každý soubor či adresář oprávnění, kterými k němu mohou disponovat uživatelé či skupiny uživatelů. Bezpečnostní model implementovaný v souborovém systému používá stejná primitiva jako zbytek operačního systému. Každý otevřený soubor je správcem objektů reprezentován jako entita typu File, a tak mu lze (stejně jako každému jinému objektu exekutivy) přiřadit popisovač zabezpečení (security descriptor), jenž specifikuje, kteří uživatelé a skupiny s ním mohou provádět jaké operace.
| Souborové systémy FAT (krom jejich modifikací, které se objevily později) neumožňují definovat oprávnění k souborům a adresářům, takže s nimi může pracovat libovolný uživatel. |
Na rozdíl od většiny ostatních druhů objektů exekutivy a stejně jako v případě klíče registru (reprezentovaného správcem objektů entitou typu Key ) popisovače zabezpečení souborů a adresářů jsou uloženy v interních datových strukturách souborového systému, odkud je jádro v případě potřeby načte do paměti.
Hard linky
I souborový systém NTFS reprezentuje každý soubor a adresář jedním nebo více speciálními záznamy. Podrobnější informace o jejich struktuře se dočtete později v tomto oddílu. Jak se píše v předchozím oddílu, tento koncept platí i pro souborové systémy FAT. NTFS navíc umožňuje, aby na skupinu záznamů obsahující informace o jednom souboru vedlo z adresářového stromu více odkazů. Jinak řečeno, adresářový strom může obsahovat více souborů, které jsou interně reprezentovány pouze jednou skupinou záznamů.
Soubory v adresářové struktuře lze v jistém smyslu chápat jako odkazy na jejich záznamy v interních datových strukturách souborového systému. Každý takový soubor lze pak označit za hard link. Tento termín se však většinou používá až v případě násobných odkazů na skupinu záznamů s informacemi o jednom souboru.
Tento druh odkazů se označuje jako hard (tvrdé), protože se nejedná o žádné jmenné aliasy. Dokud existuje alespoň jeden odkaz na záznam o určitém souboru, tento záznam není ze souborového systému odstraněn.
Windows API umožňují vytvořit hard link pomocí funkce CreateHardLink. Jelikož se v podstatě jedná o vytvoření speciálního druhu souboru-odkazu, neexistuje žádná speciální rutina určená pro jejich odstranění a k tomuto účelu se používá funkce určená pro mazání obyčejných souborů – DeleteFile.
Každý záznam (či skupina záznamů) o určitém souboru si pamatuje, kolik odkazů na něho vede z adresářového stromu. Volání CreateHardLink tento čítač zvýší o jedničku. Rutina DeleteFile jej o jedničku snižuje. Klesne-li počet odkazů na nulu, záznam (či skupina záznamů) je odstraněn z datových struktur souborového systému.
Vícenásobné odkazování na objekty souborového systému pomocí hard linků má dvě velká omezení. Není možné se odkazovat na adresáře a nelze vytvářet linky na soubory nacházející se na jiných diskových oddílech či dokonce na jiných počítačích. Druhé omezení plyne právě z toho, jak jsou hard linky implementovány – jako odkazy na záznamy v interních strukturách souborového systému.
Soft linky (symlinky, symbolické odkazy)
Soft linky provádějí podobnou činnost jako hard linky – způsobují přesměrování operací v adresářovém stromě. Netrpí však jejich nevýhodami, které zmiňuje předchozí odstavec. Lze je směrovat jak na adresáře, tak na soubory, a neplatí pro ně omezení působnosti na jeden souborový systém.
Soft linky fungují obdobně jako symbolické odkazy v rámci jmenného prostoru správce objektů. Jedná se pouze o jmenné aliasy cílových souborů či adresářů. Kdykoliv ovladač souborového systému při zpracovávání cesty narazí na soft link, nahradí celou cestu, nebo její část daty uloženými v soft linku (záleží na tom, zda symbolický odkaz na svůj cíl odkazuje absolutní, nebo relativní cestou) a výslednou cestu začne zpracovávat od začátku.
Protože se jedná pouze o jmenné aliasy, soft linky nejsou fyzicky svázány s cílovým objektem. Ten o jejich existenci vůbec nic neví. Nedochází k počítání referencí jako u hard linků. Když je cílový objekt odstraněn, soft linky, které na něho vedou, nadále existují a adresa jejich cíle se stává neplatnou.
NTFS reprezentuje soft link speciálním typem souboru nebo prázdného adresáře, typ odkazu a cílového objektu se musí shodovat. Informace o cílovém objektu jsou uloženy ve speciálních metadatech, která jsou uložena společně s dalšími informacemi o objektu a označují se jako reparse point. Jejich přítomnost lze poznat přečtením atributů objektu, které obsahují příznak FILE_ATTRIBUTE_REPARSE_POINT.
Na rozdíl od hard linků, rozhraní Windows API nedisponuje žádnými speciálními funkcemi pro manipulaci se symbolickými odkazy v rámci souborového systému. Pokud aplikace (nebo ovladač) potřebuje s těmito objekty pracovat, musí komunikovat pomocí rutiny DeviceIoControl přímo s ovladačem souborového systému (ntfs.sys). Podporované komunikační kódy pro práci se soft linky ukazuje tabulka 7
| Kód zprávy | Popis |
|---|---|
FSCTL_SET_REPARSE_POINT |
Nastaví nová metadata reparse point. |
FSCTL_GET_REPARSE_POINT |
Získá obsah metadat reparse point. |
FSCTL_DELETE_REPARSE_POINT |
Odstraní z objektu reparse point. |
Názvy komunikačních kódů nasvědčují tomu, že neslouží primárně k tvorbě soft linků, ale přímo k manipulaci s metadaty reparse point. Tato metadata totiž slouží nejen k implementaci jmenných aliasů, ale mohou být využita k libovolnému rozšíření možností souborového systému pomocí ovladačů-filtrů. Součást metadat tvoří identifikátor jejich typu (tag), jenž určuje, k jakému účelu reparse point slouží.
Pokud chce tedy aplikace rozhodnout, zda určitý soubor či adresář je ve skutečnosti soft linkem, musí nejen zjistit, zda jeho atributy obsahují příznak FILE_ATTRIBUTE_REPARSE_POINT, ale prozkoumat i identifikátor typu metadat.
Alternativní datové proudy
Obvyklá představa stromové struktury systému souborů na disku je taková, že tento strom se skládá ze dvou typů objektů – adresářů a souborů. Adresáře nejsou určeny k ukládání dat, ale mohou obsahovat další adresáře a soubory, které slouží právě k uchovávání dat.
NTFS tento koncept rozšiřuje o něco dále. Soubor může obsahovat nejen jeden, primární, proud dat – ten, ke kterému aplikace získá přístup, když soubor otevře, ale libovolné množství datových proudů dalších, označovaných jako alternativní.
Alternativní datové proudy (Alternate Data Stream – ADS) se od proudu primárních dat odlišují tím, že mají jména.
Pokud chce aplikace (či jiná entita) manipulovat s jejich obsahem, musí při získávání handle k souboru (nebo adresáři; pojmenované proudy lze přidávat i přímo na adresáře, čímž ruší koncept adresářů neobsahujících žádná obecná data),
za jeho jméno uvést znak „:“ následovaný jménem proudu. Například jméno
C:\Temp\test.txt:test
označuje alternativní datový proud test na souboru test.txt v adresáři C:\Temp .
Tento název je ekvivalentní zápisu
C:\Temp\test.txt:test:$DATA
Řetězec za posledním znakem dvojtečky „:“ určuje typ datového proudu. $DATA je název vyhrazený pro alternativní proudy obsahující obecná data. Jak se dozvíte v části věnované podrobnějšímu popisu interních struktur souborového systému, existuje více typů datových proudů.
Primární datový proud nemá žádné jméno a v duchu konvence určení alternativních datových proudů jej lze na výše uvedeném souboru test.txt identifikovat pomocí řetězce
C:\Temp\test.txt::$DATA
|
Protože názvy alternativních datových proudů nejsou v mnoha známých souborových manažerech (Průzkumník, Total Commander) viditelné, začaly je využívat viry a rootkity k ukrytí svých dat a kódu.
Použitím filtrujícího ovladače či manipulacemi v paměti jádra lze celý ADS skrýt mnohem snadněji než normální soubor.
Tohoto faktu využíval například známý rootkit Rustock B, jehož spustitelný kód se ukrýval na umístění: C:\Windows:lz32.sys |
Řídké soubory (sparse files)
Databázové servery či utility pro práci s obrazy disků mohou vytvářet velké soubory, z nichž prakticky k uložení užitečných dat využijí pouze velmi malou část. Pokud pro svoji činnost používají obyčejné soubory, může docházet k zbytečnému plýtvání volným místem. Datové oblasti obyčejného souboru, které aplikace pouvažují za volné, také zabírají volné místo na diskovém oddílu.
Řídké soubory (sparse file) jsou určeny právě pro výše zmiňované aplikace. Program takovému souboru může definovat oblasti, které neobsahují užitečná data. Souborový systém takovým oblastem nepřidělí žádné volné místo a navenek se tváří, jako by byly vyplněny samými nulovými bajty.
Navenek se řídké soubory chovají plně transparentně a pokud je aplikace neumí rozeznat, tváří se pro ni jako obyčejné soubory. Odlišit je lze pomocí nastaveného příznaku FILE_ATTRIBUTE_SPARSE_FILE v atributech. Jednotlivé souborové operace se chovají následovně:
-
Čtení bloku mimo alokované oblasti (pod alokovanými oblastmi rozumějte oblasti s užitečnými daty) naplní buffer volajícího nulovými bajty. Přitom nemusí dojít k žádné interakci s pevným diskem (či jiným médiem), pokud se informace a rozložení alokovaných oblastí nacházejí v operační paměti.
-
Zápis mimo alokované oblasti vede na alokaci nové oblasti. Právě zapsaná data se tedy počítají jako užitečná.
-
Čtení a zápis do alokované oblasti probíhá stejně jako v případě obyčejných souborů.
Ani pro práci s řídkými soubory neexistují speciální funkce Windows API a je nutné použít rutinu DeviceIoControl pro přímou komunikaci s ovladačem souborového systému. Dostupné jsou následující zprávy:
-
FSCTL_SET_SPARSE – přetvoří obyčejný soubor na řídký a naopak. Přeměnu z řídkého na obyčejný soubor je možné provést, až když entita neobsahuje žádnou nealokovanou oblast.
-
FSCTL_SET_ZERO_DATA – umožňuje v datech souboru definovat volné (nealokované) oblasti. Tyto oblasti pak nebudou na diskovém oddílu zabírat žádné volné místo.
-
FSCTL_QUERY_ALLOCATED_RANGES – vrátí seznam alokovaných oblastí.
Defragmentace
Magnetické pevné disky, které se v době psaní této knihy stále ještě hojně používají, disponují dobrými rychlostmi čtení a zápisu sekvenčních dat. Problémy jim však působí náhodný přístup. Tato vlastnost je dána jejich fyzickou architekturou, kterou vidíte schematicky znázorněnou na obrázku 4.

Pevný disk tvoří několik nad sebou rotujících kotoučů – ploten. Jedna soustředná kružnice na jedné plotně se nazývá stopa a skládá se z množství co do kapacity stejně velkých bloků – sektorů. V dnešní době drtivá většina pevných disků pracuje se sektory, které pojmou 512 bajtů dat. Jiné druhy médií však mohou mít nastavenou velikost sektoru na odlišné hodnoty. Například u optických médií můžete narazit na 2 KB (2048 bajtů).
Systém stop nacházejících se v plotnách nad sebou se označuje jako cylindr. Mezi plotnami se nachází hlavy, které zajišťují operace čtení a zápisu dat.

Znalost fyzické struktury disku má význam pouze pro BIOS a pro nízkoúrovňové ovladače. Dnešní disky však již podporují tzv. způsob přístupu LBA (Logical Block Addressing). Chce-li operační systém na určité místo například zapsat 10 sektorů, nemusí zadávat počáteční sektor určením cylindru, hlavy a sektoru ve stopě (CHS – cylinder-head-sector address), ale pouze zadáním jeho čísla. Samotný disk totiž navenek předstírá, že funguje jako pole sektorů a uvnitř si jednotlivé bloky mapuje na CHS adresy.
Ukázku mapování logického prostoru na jednotlivé sektory fyzické struktury vidíte na obrázku 5.
Firmware pevného disku po sobě jdoucí sektory mapuje na adresy CHS tak, aby jejich sekvenčním čtením nebo zápisem docházelo k sekvenčnímu čtení nebo zápisu i na fyzické struktuře. Všimněte si také, že sektory se v případě adresy CHS číslují od jedničky.
Pro firmware tedy operace přečtení či zápisu sektoru znamená následující:
-
Nastavit hlavy nad stopy cylindru, do kterého sektor patří. Tato operace se označuje jako seek a doba na její vykonání jako přístupová doba (seek time). Z časového hlediska je tento krok nejnáročnější.
-
Počkat, než se příslušný sektor dostane pod hlavu. Tato doba se označuje jako rotační zpoždění (rotation delay).
-
Provést operaci s daným sektorem, tedy přečíst nebo zapsat data.
Operace nad sekvenčním blokem sektorů v sobě zahrnují teoreticky pouze jeden krok seek pro nastavení hlavy nad stopu počátečního sektoru. Při práci s následujícími sektory se již hlavy nachází na správném místě. Dochází tedy k ušetření přístupové doby, která se u magnetických pevných disků pohybuje v řádu jednotek milisekund. Z tohoto důvodu probíhají operace nad sekvenčními daty rychle. Náhodný přístup znamená v extrémním případě provádění operace seek při čtení nebo zápisu každého ze sektorů.
Vzhledem k výše popsaným vlastnostem magnetických pevných disků se vyplatí, aby i data jednotlivých souborů se nacházela pokud možno v jediné souvislé posloupnosti clusterů. Při povídání o NTFS je nutné mluvit o clusterech, a ne o sektorech, protože cluster je nejmenší jednotka s jakou tento souborový systém pracuje.
Velikost souboru se ale může často měnit a může nastat situace, kdy již jeho data v jediném souvislém bloku clusterů, který se někdy též označuje jako fragment, udržet nelze. Souborový systém v tomto případě data rozdělí do více fragmentů a jejich polohu zapíše do záznamu, kterým je soubor reprezentován.
Existuje řada nástrojů, jež se snaží data souboru poskládat tak, aby opět tvořila jediný fragment. Tento proces se nazývá defragmentace a používá se za účelem zvýšení rychlosti souborových operací.
Aby autoři těchto programů nemuseli do detailu znát interní struktury souborového systému, které jsou v případě NTFS obchodním tajemstvím, poskytuje ovladač prostřednictvím speciálních zpráv několik funkcí, jež dovolují defragmentaci provádět i bez těchto znalostí. Konkrétně se jedná o tyto zprávy:
-
FSCTL_GET_VOLUME_BITMAP – zjistí, které clustery diskového oddílu jsou prázdné
-
FSCTL_GET_RETRIEVAL_POINTERS – vrátí umístění fragmentů dat zadaného souboru.
-
FSCTL_MOVE_FILE – přesune fragmenty dat zadaného souboru na nové místo.
-
FSCTL_GET_RETRIEVAL_POINTERS_BASE – vrací vzdálenost datové oblasti diskového oddílu v sektorech od jeho počátku. V případě NTFS datová oblast začíná současně s prvním sektorem diskového oddílu (a tento příkaz tedy vrátí nulu), u souborových systémů FAT jí předchází několik speciálních oblastí, které nejsou ani děleny na clustery. Přesná adresa fragmentu dat souboru vzhledem k počátku diskového oddílu je rovna součtu adresy počátku datové oblasti a údaji získanými příkazem FSCTL_GET_RETRIEVAL_POINTERS.
Tento příkaz je dostupný až od Windows 7. -
FSCTL_LOOKUP_STREAM_FROM_CLUSTER – zjistí, kterým souborům či adresářům patří určité clustery diskového oddílu. Tento příkaz je dostupný až od Windows 7 a jeho provedení může být časově a paměťově velmi náročné. Lze jej použít pouze na souborových systémech NTFS.
Tyto příkazy velmi zjednodušují samotný algoritmus defragmentace. Umožňují totiž zjistit, na jakých clusterech se data souboru nachází, a také nalézt volné místo, kam tyto fragmenty přesunout. Více informací základní algoritmus ani znát nepotřebuje.
Výše popsané rozhraní pro defragmentaci funguje i na souborových systémech FAT.
| Defragmentace pro SSD (Solid State Disk) je zbytečná, v nich se nic netočí a žádné hlavičky se nevystavují. |
Komprese a šifrování
Mezi další užitečné funkce podporované NTFS patří komprese a šifrování dat souborů. První má za úkol ochránit citlivá data před neautorizovaným přístupem, druhá vlastnost slouží k šetření volného místa.
Komprimované soubory mají ve svých atributech nastaven příznak FILE_ATTRIBUTE_COMPRESSED. Tento atribut může být nastaven i na adresáře; v takovém případě nedochází automaticky ke kompresi všech souborů a složek, které daný adresář obsahuje, ale nové položky budou automaticky vytvářené jako komprimované.
Aplikace mohou zjistit stav komprese souboru také zasláním zprávy FSCTL_GET_COMPRESSION. Z odpovědi ovladače souborového systému se dozví i použitý kompresní algoritmus. Ke zkomprimování souboru slouží zpráva FSCTL_SET_COMPRESSION. Její efekt na adresáře je popsán výše.
Pokud se o to aplikace přímo nezajímají, vůbec nepoznají, že pracují z komprimovanými soubory. Celý proces je plně transparentní a ovladač souborového systému komprimuje a dekomprimuje data souboru podle potřeby.
Proces šifrování a dešifrování také probíhá vůči aplikacím transparentně, pokud uživatel, pod kterým běží, disponuje příslušnými šifrovacími klíči. Na rozdíl od výše popisovaných vlastností pro nastavení šifrování na soubory Windows API exportuje funkce EncryptFile a DecryptFile . Šifrované soubory se vyznačují příznakem FILE_ATTRIBUTE_ENCRYPTED ve svých atributech.
Stejně jako v případě komprese, rutiny pro šifrování a dešifrování lze aplikovat i na adresáře a výsledek je podobný. Nedojde k zašifrování obsahu celé složky, pouze nově vytvářené soubory budou automaticky šifrovány. Dále není možné šifrovat komprimované soubory. Funkce EncryptFile v takovém případě neselže; příslušný soubor je nejdříve dekomprimován a následně zašifrován.
| Pracuje-li aplikace se zašifrovaným souborem, ovladač souborového systému nikdy nepřepisuje jeho obsah dešifrovanými daty. To by znamenalo bezpečnostní riziko, protože by útočník mohl citlivá data ukrást v momentě, kdy by s nimi aplikace pracovala. Z tohoto důvodu ovladač NTFS při otevření souboru dešifruje data a uloží je do dočasného souboru v adresáři System Volume Information a přesměrovává na něj všechny operace čtení a zápisu. Jakmile aplikace soubor zavře, obsah dočasného souboru se zašifruje a zapíše se na místo dat původního zašifrovaného souboru. |
| Šifrované soubory trochu komplikují život zálohovacím programům, které je použitím standardních funkcí Windows API nemohou kopírovat bez dešifrování. Z hlediska bezpečnosti je každý zbytečný výskyt dešifrovaných dat nežádoucí. Windows API však exportuje několik funkcí, které umožňují pracovat přímo s šifrovaným obsahem souborů. Jejich přehled najdete v tabulce 8. |
| Název rutiny | Popis |
|---|---|
OpenEncryptedFileRaw |
Otevře soubor (nebo adresář) pro operace s šifrovanými daty. |
CloseEncryptedFileRaw |
Zavře soubor nebo adresář. |
ReadEncryptedFileRaw |
Přečte obsah šifrovaného souboru bez dešifrování. |
WriteEncryptedFileRaw |
Zapíše šifrovaný obsah do souboru. |
Žurnálování a transakce
Na rozdíl od systémů FAT, NTFS obsahuje zabudovanou ochranu proti poškození důležitých datových struktur souborového systému například v důsledku výpadku proudu či náhlého restartu počítače. Tato ochrana je implementována prostřednictvím žurnálování – když je potřeba provést nějakou operaci (vytvoření souboru, zápis do souboru), souborový systém potřebné údaje k jejímu provedení nejprve zapíše na speciální místo nazývané log a až potom ji provede. Pokud během vlastního vykonávání operace dojde například k restartu systému, souborový systém má v logu napsáno, co přesně musí udělat, aby danou operaci dokončil. Nemůže se tedy stát, aby aplikace přistupovaly k souborovému systému, kde nějaká operace s jeho datovými strukturami proběhla jen „napůl“.
V případě NTFS probíhá operace nad jeho metadaty v následujících čtyřech krocích:
-
Ovladač souborového systému zapíše informace o úmyslu provést danou operaci do souboru $LogFile v kořenovém adresáři diskového oddílu. Zápis provádí do kopie souboru $LogFile ve vyrovnávací paměti, nikoliv přímo na pevný disk. Pokud v tomto okamžiku dojde k náhlému selhání, struktura NTFS na disku je v konzistentním stavu (ovladač zapisoval pouze do vyrovnávací paměti).
-
Ovladač provede danou operaci. Opět pouze v rámci vyrovnávací paměti, k zápisu na disk stále nedochází. Pokud dojde k náhlému selhání při vykonávání tohoto kroku, struktura NTFS na disku se nachází v konzistentním stavu, protože nikdo na disk nic ještě nezapsal.
-
Jádro zapíše obsah vyrovnávací paměti odpovídající změně obsahu souboru $LogFile na disk. Zápis probíhá v rámci jediného požadavku na ovladač diskového oddílu. Pokud po tomto kroku dojde k náhlému selhání, struktura NTFS na disku je stále v konzistentním stavu. V souboru $LogFile se navíc nacházejí všechny potřebné údaje pro provedení dané operace. NTFS ji tedy může po restartu počítače promítnout na disk.
-
Jádro zapíše obsah vyrovnávací paměti odpovídající změnám datových struktur souborového systému, které daná operace způsobila, na disk. Pokud dojde k selhání během tohoto kroku, soubor $LogFile stále obsahuje dostatek údajů k tomu, aby souborový systém mohl operaci po restartu dokončit.
NTFS pomocí tohoto mechanismu chrání pouze svá vlastní metadata, nikoliv další soubory a složky, které si během své aktivity vytváří různé aplikace. Aplikace si vše musí zajistit samy. Souborový systém jim poskytuje následující možnosti:
-
Transakce – od Windows Vista NTFS podporuje řazení jednotlivých operací se soubory a složkami do transakcí. Tím dovoluje svůj mechanismus na ochranu před náhlým se lháním používat i pro ochranu ostatních objektů souborového systému. Implementace se od výše popsané metody odlišuje, výsledek je ale stejný.
-
Vynucení zápisu vyrovnávacích pamětí – aplikace může kdykoliv donutit ovladač souborového systému zapsat obsah vyrovnávací paměti odpovídající danému souboru na disk. K tomuto účelu slouží funkce FlushFileBuffers z knihovny kernel32.dll. NTFS v tomto případě ve skutečnosti nezapíše obsah vyrovnávací paměti do zadaného souboru, ale přidá informaci o dané operaci do souboru $LogFile: „Zápis“ vyrovnávací paměti tedy stojí méně I/O požadavků na disk a soubor je chráněn proti náhlému selhání.
-
Zakázat použití vyrovnávací paměti pro daný soubor – aplikace může při vytváření nebo otevírání souboru určit, jak má systém s jeho daty pracovat. Pokud aplikace ve funkci CreateFile specifikuje příznak FILE_FLAG_NO_BUFFERING, čtení a zápisy dat souboru obchází vyrovnávací paměti a dochází k přímé komunikaci s ovladačem diskového oddílu. Pokud aplikace specifikuje příznak FILE_FLAG_WRITE_THROUGH, čtení a zápisy probíhají přes vyrovnávací paměť. Při zápisu do vyrovnávací paměti však dochází také k zápisu dat na disk. Stejně jako v případě rutiny FlushFileBuffers, i zde se NTFS ve skutečnosti snaží zapsat údaje o operaci pouze do $LogFile a vlastní provedení nechat až na později.
Žurnál USN (USN Change Journal)
Další zajímavou vlastností NTFS související se zaznamenáváním změn souborového systému je tzv. žurnál USN (USN Change Journal). Souborový systém si informaci o každé provedené změně nad souborem či adresářem ukládá stranou do speciálního souboru. O každé změně si pamatuje pouze: její pořadové číslo, jméno cílového objektu, index cílového objektu a jeho rodiče v rámci Master File Table a datum a typ operace. Tyto informace sice nejsou dostatečné například pro odstranění účinků operace, ale umožňují zjistit, s jakými soubory a adresáři operační systém (potažmo uživatel) v poslední době pracoval.
Pořadové číslo operace (Update Sequence Number – USN) nese o něco méně informací než datum provedení. Nedozvíte se z něho, kdy daná operace proběhla, ale můžete s jeho využitím zjistit, jak po sobě jednotlivé operace následovaly. Každý soubor má ve svém záznamu uloženo USN poslední operace, která jej nějakým způsobem změnila; pomocí tohoto čísla ji lze vyhledat v USN žurnálu.
Žurnál USN může být užitečný například pro zálohovací aplikace, které jeho zkoumáním mohou snadno zjistit, jaké soubory a adresáře se od poslední zálohy změnily. Nemusí tak ve většině případů procházet celý strom souborového systému.
Souborový systém ale nedovoluje růst žurnálu USN do nekonečna. A pokud místo pro žurnál dojde, záznamy o nových operacích budou přepisovat záznamy starší. To znamená, že žurnál USN nemusí obsahovat informace o všech změnách, které se v souborovém systému udály od jeho vzniku.
Každou změnu lze v rámci žurnálu USN jedinečně identifikovat pomocí jejího USN a 64bitového identifikátoru žurnálu. V případě znovuvytvoření, smazání žurnálu či přepisování starých záznamů dojde ke změně jeho identifikátoru. Tím jsou informace o starších změnách ztraceny.
Ovladač souborového systému umožňuje s žurnálem USN pracovat pomocí několika speciálních zpráv, které je možné zasílat pomocí funkce Windows API DeviceIoControl:
-
FSCTL_CREATE_USN_JOURNAL – vytvoří na zadaném diskovém oddílu žurnál USN. Ve vstupním bufferu této zprávy volající uvádí maximální velikost nového žurnálu. Pokud na daném oddílu již žurnál existuje, dojde pouze ke změně jeho maximální velikosti a případnému zmenšení, pokud by svojí aktuální velikostí tuto hodnotu přesahoval.
-
FSCTL_DELETE_USN_JOURNAL – odstraní žurnál USN ze zadaného diskového oddílu. Ovladač souborového systému nejprve nastaví všem souborům a adresářům USN na nulu a následně smaže metadata samotného žurnálu. Tato operace může trvat relativně dlouho a je imunní proti restartům počítače či náhlým selháním.
-
FSCTL_ENUM_USN_JOURNAL – vrátí seznam změn, které se podle žurnálu USN udály mezi dvěma zadanými USN. Seznam změn je řazen vzestupně podle indexu souborů a adresářů, kterých se změny týkají, v tabulce MFT.
-
FSCTL_QUERY_USN_JOURNAL – zjistí informace o žurnálu diskového oddílu. Jedná se například o identifikátor, USN nejstarší zaznamenané změny či USN, které bude přiřazeno první budoucí změně.
-
FSCTL_READ_USN_JOURNAL – vrací informace o změnách, uložené v žurnálu USN. Seznam změn je řazen vzestupně podle USN.
Interní struktura
Základní struktura oddílu formátovaného NTFS je jednodušší než v případě souborových systémů FAT. Celý prostor je rozdělen na alokační jednotky (clustery), které představují nejmenší bloky dat, se kterými souborový systém umí pracovat. Strukturu oddílu znázorňuje obrázek 6.
První sektor plní úlohu boot sektoru a mimo jiné obsahuje informace o poloze nejdůležitější interní datové struktury NTFS – Master File Table (MFT). Detailnější popis formátu boot sektoru najdete v tabulce 9.
| Offset | Délka (byte) | Popis |
|---|---|---|
0x000 |
3 |
Instrukce skoku na kód zavaděče. |
0x003 |
8 |
Řetězec „NTFS“. |
0x00B |
2 |
Počet bajtů na jeden sektor. Většinou 512. |
0x00D |
1 |
Počet sektorů na jednu alokační jednotku (cluster). Obvykle 8. |
0x00E |
7 |
Neznámý účel. |
0x015 |
1 |
Odpovídá poli BPB_Media z boot sektoru souborových systémů FAT. |
0x016 |
2 |
Neznámý účel. |
0x018 |
2 |
Počet sektorů na stopu |
0x01A |
2 |
Počet hlav. |
0x01C |
8 |
Neznámý účel. |
0x024 |
4 |
Neznámý účel. Obvykle toto pole nabývá hodnoty 0x80 0x00 0x80 0x00. |
0x028 |
8 |
Počet sektorů na diskovém oddílu. |
0x030 |
8 |
Číslo počátečního clusteru MFT. |
0x038 |
8 |
Číslo prvního clusteru záložní kopie prvních několika záznamů MFT. |
0x040 |
4 |
Počet clusterů na jeden záznam tabulky MFT. |
0x044 |
4 |
Počet clusterů na jeden záznam indexu (používá se pro ukládání seznamu položek adresářů). Pokud je tato hodnota záporná, udává velikost záznamu indexu v mocninách dvojky. Například hodnota –11 odpovídá velikosti \(2^{11}\) bajtů, tedy 2 KB. |
0x048 |
8 |
Sériové číslo disku. |
0x050 |
430 |
Kód zavaděče. |
MFT je tvořena polem záznamů pevné velikosti, která je obvykle nastavena na 1 KB. Každý obsazený záznam obsahuje informace o některém souboru nebo adresáři. Záznamy lze rozdělit na dva druhy:
-
Bázový záznam (base record) – obsahuje ty nejdůležitější informace o souboru nebo adresáři. Každý objekt souborového systému je reprezentován právě jedním takovým záznamem.
-
Vedlejší záznam – uchovává informace, které se nevešly do záznamu bázového. Jeden soubor nebo adresář může být reprezentován více vedlejšími záznamy. Jejich seznam je uložen v bázovém záznamu.
Jeden záznam MFT se skládá z hlavičky a série atributů. Jeho strukturu znázorňuje obrázek 7.
Každý atribut reprezentuje data určitého typu, například informace o datu a čase, jméně či seznamu clusterů, kde se nachází data souboru. Každý atribut má několik základních vlastnosti:
-
Délka – udává počet bajtů, které celý atribut zabírá v záznamu. Jednotlivé atributy jsou uloženy těsně za sebou.
-
Typ – určuje, jak má ovladač souborového systému reprezentovat data uložená v atributu. Jeden záznam může obsahovat více atributů stejného typu.
-
Rezidentnost – určuje, kde se nachází data atributu. Atributy s krátkým obsahem jsou celé uloženy přímo v záznamu MFT, a proto se nazývají rezidentní. Nerezidentní atributy ukládají do záznamu pouze seznam clusterů, ve kterých se nachází jejich data (tzv. seznam běhů – run list).
-
Jméno – každý atribut může mít jméno, které jej společně s jeho typem jednoznačně identifikuje v rámci daného souboru či adresáře. Výše se můžete dočíst, že soubor může obsahovat více proudů dat, přičemž je lze rozlišit právě jménem. Každý takový proud dat je reprezentován jedním atributem.
-
Pořadové číslo – jedinečně identifikuje atribut v rámci záznamu MFT a umožňuje zjistit pořadí, ve kterém jednotlivé atributy vznikaly.
Pomocí posloupnosti různých typů atributů je souborový systém NTFS schopen zaznamenat a implementovat všechny potřebné funkce. Podrobněji o popisu některých typů atributů pojednávají následující odstavce.
Základní informace
Základní údaje o souboru zahrnují časy vytvoření, poslední změny, posledního přístupu a poslední změny záznamu MFT. Dále sem patří atributy, jejichž výčet najdete v tabulce 10. Tyto informace jsou uloženy v těle atributu typu 0x10 označovaného také jako $STANDARD_INFORMATION. Tento atribut nemá žádné jméno a je vždy rezidentní.
Formát těla atributu ukazuje výpis 1. Položka FileAttributes obsahuje atributy souboru (nebo adresáře). Jedná se o pole příznaků.
Položky OwnerId, SecurityId a QuotaCharged slouží jako odkazy do metadat NTFS a identifikují uživatele, který objekt vlastní, popisovač zabezpečení a počet bajtů, kterým přispívá k zaplnění jeho kvóty. Bližší informace se dozvíte níže v textu věnujícímu se popisu metadat NTFS.
typedef struct _STANDARD_INFORMATION {
ULONG64 CreationTime;
ULONG64 ChangeTime;
ULONG64 LastWriteTime;
ULONG64 LastAccessTime;
ULONG32 FileAttributes;
ULONG32 ClassId;
ULONG32 OwnerId;
ULONG32 SecurityId;
ULONG64 QuotaCharged;
ULONG64 UpdateSequenceNumber;
} STANDARD_INFORMATION, *PSTANDARD_INFORMATION;
| Příznak | Konstanta | Význam |
|---|---|---|
0x0001 |
FILE_ATTRIBUTE_READONLY |
Stejný jako v případě systémů FAT. |
0x0002 |
FILE_ATTRIBUTE_HIDDEN |
Stejný jako v případě systémů FAT. |
0x0004 |
FILE_ATTRIBUTE_SYSTEM |
Stejný jako v případě systémů FAT. |
0x0020 |
FILE_ATTRIBUTE_ARCHIVE |
Stejný jako v případě systémů FAT. |
0x0040 |
FILE_ATTRIBUTE_DEVICE |
Rezervováno pro interní potřeby souborového systému. |
0x0080 |
FILE_ATTRIBUTE_NORMAL |
Položka popisuje obyčejný soubor bez speciálních vlastností. Tento příznak je platný pouze pokud ostatní příznaky nejsou nastaveny. |
0x0100 |
FILE_ATTRIBUTE_TEMPORARY |
Záznam MFT popisuje dočasný soubor, který aplikace pravděpodobně smaže, až jej nebude potřebovat. Ovladač souborového systému se snaží data takových souborů uchovávat ve vyrovnávací paměti a nezapisovat zbytečně na pevný disk. |
0x0200 |
FILE_ATTRIBUTE_SPARSE_FILE |
Jedná se o řídký soubor. |
0x0400 |
FILE_ATTRIBUTE_REPARSE_POINT |
Položka obsahuje metadata reparse point. |
0x0800 |
FILE_ATTRIBUTE_COMPRESSED |
Datové proudy souboru jsou komprimovány. |
0x2000 |
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED |
Soubor nebo obsah adresáře není indexován pro rychlejší vyhledávání. |
0x4000 |
FILE_ATTRIBUTE_ENCRYPTED |
Datové proudy souboru jsou šifrovány. |
Jména a hard linky
Jméno položky je obsaženo v těle atributu typu 0x30, který se označuje také jako $FILE_NAME. Tento atribut sám nemá název a jeho obsah, jehož strukturu vidíte na výpisu 2, je vždy umístěn v rámci záznamu MFT.
Položka Name obsahuje jednotlivé znaky jména položky. Délka jména v bajtech je uložena v poli NameLength. NTFS ukládá jména pouze v kódování Unicode. Položka NameType je přítomna z důvodu zpětné kompatibility s krátkými 8 + 3 jmény souborů a složek ze souborových systémů FAT. Pokud je nastavena na 1, pole Name je vyplněno dlouhým jménem. Hodnota 2 implikuje krátké jméno. Záznam MFT může obsahovat více atributů $FILE_NAME, a tak každý soubor či adresář může disponovat jak krátkým, tak dlouhým jménem.
Pomocí atributu $FILE_NAME jsou implementovány i hard linky. Důležitou roli v jejich implementaci hraje prvek DirectoryFileReferenceNumber, který obsahuje číslo bázového záznamu reprezentujícího adresář, ve kterém se objekt nachází. Záznam MFT může obsahovat více atributů $FILE_NAME, přičemž každý z nich může odkazovat na jiný rodičovský adresář. Jeden záznam MFT tedy může reprezentovat více objektů v adresářové stromové struktuře. Jednotlivé atributy $FILE_NAME pak určují, pod jakým jménem se má položka v daném adresáři zobrazit.
Zbývající položky těla atributu $FILE_NAME mohou také obsahovat užitečné informace. NTFS do nich ukládá velikost primárního datového proudu a základní informace (viz atribut $STANDARD_INFORMATION) ve chvíli přejmenování.
typedef struct _FILENAME_ATTRIBUTE {
ULONGLONG DirectoryFileReferenceNumber;
ULONGLONG CreationTime;
ULONGLONG ChangeTime;
ULONGLONG LastWriteTime;
ULONGLONG LastAccessTime;
ULONGLONG AllocatedSize;
ULONGLONG DataSize;
ULONG FileAttributes;
ULONG AlignmentOrReserved;
UCHAR NameLength;
UCHAR NameType;
WCHAR Name[1];
} FILENAME_ATTRIBUTE, *PFILENAME_ATTRIBUTE;
| Vícenásobná přítomnost atributu $FILE_NAME s různě nastavenými prvky DirectoryFileReferenceNumber automaticky neznamená vznik hard linků. Názvy a odkazy jednotlivých linků musí být uvedeny i ve stromové adresářové struktuře, kterou reprezentují atributy $INDEX_ROOT, $INDEX_ALLOCATION a $BITMAP popsaných níže. |
Formát uložení nerezidentních atributů, komprese a řídké soubory
Pokud tělo atributu překročí určitou velikost, nevejde se do záznamů MFT a ovladač souborového systému pro něj alokuje potřebný prostor mimo. Namísto těla zapíše do záznamu MFT jejich umístění v podobně seznamu běhů (run list).
Seznam běhů se nachází (stejně jako tělo rezidentního atributu) ihned za hlavičkou atributu a skládá se z nestejně velkých položek, které se označují jako běhy. Každý běh popisuje umístění jednoho fragmentu těla atributu (souvislé oblasti alokovaných clusterů). Ovladač souborového systému se snaží celé tělo umístit do jediného fragmentu.
Jak ukazuje obrázek 8, každý běh se skládá ze tří částí – hlavičky, délky a offsetu. Hlavička je tvořena jedním bajtem, jehož dolní čtyři bity udávají velikost délky a horní čtyři bity velikost offsetu v bajtech. Délka udává velikost fragmentu v clusterech a offset adresu počátečního clusteru. Offset je relativní k adrese počátečního clusteru předchozího běhu. V případně prvního běhu se jedná o adresu počátečního clusteru vzhledem k počátku diskového oddílu.
Ovladač souborového systému interpretuje hodnotu uloženou v části offsetu jako celé číslo se znaménkem, což umožňuje umístit na diskovém oddílu určitý fragment těla před fragment předchozí. Záporný offset má nastavený nejvyšší bit (též zvaný znaménkový) na 1.
Každý seznam běhů je ukončen bajtem hlavičky o hodnotě 0x00, tedy během, který nemá definovánu žádnou délku a ani žádný offset.
Nulové hodnoty se v hlavičce mohou ještě vyskytovat v případě běhů komprimovaných a řídkých souborů. Datové atributy těchto souborů mohou obsahovat fragmenty, jež buď neobsahují žádná užitečná data, nebo se uvolnily po provedení komprese těla atributu. V obou případech není nutné alokovat žádné clustery, a tak hlavička běhů popisujících takové fragmenty obsahuje nulovou velikost položky offsetu. Samotná položka offsetu potom chybí.
| Fragment dat, pro která nejsou alokované žádné alokační jednotky, se může nacházet i uprostřed řídkého nebo komprimovaného souboru. To znamená, že běh, který tento fragment popisuje, se nenachází v seznamu běhů poslední. Hodnota offsetu následujícího běhu nemůže být relativní k offsetu svého předchůdce, protože ten žádný offset definován nemá. Z tohoto důvodu je správnější říci, že hodnoty offsetů jednotlivých běhů jsou relativní vždy k nejbližšímu předchozímu běhu v seznamu s definovaným offsetem. V případě, že takový běh neexistuje, hodnota offsetu je relativní vzhledem k počátku diskového oddílu. |
Seznam vedlejších záznamů MFT
Pokud některému z rezidentních atributů narostou data natolik, že se nevejde do záznamu MFT, ovladač souborového systému pro ně alokuje clustery mimo Master File Table, data do nich přesune a v záznamu MFT je nahradí seznamem běhů.
U velkých a fragmentovaných souborů (či adresářů s velkým množstvím položek) může seznam běhů narůst do takových rozměrů, že se do záznamu MFT nevejde. Ovladač souborového systému na tento problém reaguje tak, že v Master File Table alokuje nový záznam, který se stane novým vedlejším záznamem daného souboru či adresáře. Do tohoto záznamu překopíruje celý problémový atribut, nebo jeho část.
Nerezidentní atributy je možné rozdělit na více částí a každou z nich uložit do jiného záznamu MFT. Každá taková část má stejnou strukturu jako atribut, ze kterého vznikla, pouze ve své hlavičce nese informaci, že popisuje umístění dat až od určitého clusteru. Rezidentní atributy rozdělit na více částí nelze.
K vytváření nových vedlejších záznamů může ovladač souborového systému přistoupit také v případě, že záznam MFT obsahuje příliš velký počet atributů, které musí být rezidentní. Tento případ může nastat například u souboru s vysokým počtem hard linků. Každý hard link znamená v cílovém záznamu jeden atribut $FILE_NAME, který musí zůstat rezidentní.
Při vytvoření prvního vedlejšího záznamu daného souboru či adresáře ovladač souborového systému přidá do bázového záznamu speciální atribut, jehož úkolem je držet informace o tom, v jakém záznamu MFT (bázovém či některém z vedlejších) se jednotlivé atributy nacházejí. Tento atribut má číselnou hodnotu typu 0x20 a označuje se jako $ATTRIBUTE_LIST. Jeho tělo je tvořeno posloupností různě dlouhých položek, každá obsahuje informace o umístění jednoho atributu nebo jedné jeho části. Strukturu jedné položky vidíte na výpisu 3.
typedef struct _ATTRIBUTE_LIST_ENTRY {
ATTRIBUTE_TYPE AttributeType;
USHORT Length;
UCHAR NameLength;
UCHAR NameOffset;
ULONGLONG LowVcn;
ULONGLONG FileReferenceNumber;
USHORT AttributeNumber;
} ATTRIBUTE_LIST_ENTRY, *PATTRIBUTE_LIST_ENTRY;
Cílový atribut je identifikován svým typem (prvek AttributeType) a pořadovým číslem (AttributeNumber). V případě, že položka popisuje umístění části nerezidentního atributu, v poli LowVcn se nachází číslo počátečního clusteru popisovaného úseku dat.
U pojmenovaných atributů si položka pamatuje i jejich jméno. NameLength udává délku jména ve znacích Unicode a NameOffset jeho adresu relativní k počátku struktury ATTRIBUTE_LIST_ENTRY. Položky reprezentující nepojmenované atributy mají hodnotu prvku NameLength nastavenou na nulu.
Délka každé položky seznamu atributů je uložena v poli Length a zahrnuje v sobě jak samotný záznam ATTRIBUTE_LIST_ENTRY, tak prostor spotřebovaný na uložení jména. Jednotlivé záznamy následují těsně za sebou.
Adresáře
Záznamy adresářů v Master File Table vypadají jako záznamy obyčejných souborů, navíc ale obsahují až tři atributy za účelem uložení seznamu položek. Neobsahují žádný primární datový atribut, ale mohou svá data ukládat do pojmenovaných alternativních proudů.
Seznam položek adresáře je ukládán ve formě B* stromu, datové struktury vzdáleně podobné stromům z první kapitoly, která umožňuje rychle vyhledávat podle klíče (zde je jím jméno položky) a dobře funguje i na pomalejších zařízeních, mezi které magnetické pevné disky rozhodně patří. Kořen tohoto stromu je obsažen v atributu typu 0x90, který se označuje jako $INDEX_ROOT a je vždy celý uložen v rámci záznamu MFT. Pokud tedy adresář obsahuje jen malé množství položek, veškeré jeho informace jsou uloženy pouze v Master File Table a při jeho čtení není nutné načítat obsah dalších clusterů.
Pokud se do kořenového stromu uzlu informace o všech položkách adresáře nevejdou, ovladač ntfs.sys vytvoří do záznamu MFT další dva atributy. Atribut typu 0xA0 ($INDEX_ ALLOCATION) není nikdy rezidentní (jeho data se vždy nacházejí mimo MFT) a obsahuje všechny uzly stromu krom kořenového.
Třetím atributem je bitová mapa (typ 0xB0, $BITMAP). Její data se mohou nacházet buď uvnitř záznamu MFT, nebo i mimo něj. Udává, které clustery atributu $INDEX_ALLOCATION jsou aktuálně využity pro uložení obsahu jednotlivých uzlů stromu a které jsou aktuálně volné. Díky přítomnosti tohoto atributu nemusí ovladač souborového systému při každé operaci přidávání či mazání uzlu stromu měnit seznam běhů atributu $INDEX_ALLOCATION, pouze změní obsah některých bitů v $BITMAP, čímž ušetří čas.
Speciální soubory
Jak ukazuje obrázek 6, NTFS nevyhrazuje příliš mnoho diskového prostoru pro speciální datové struktury, jako tomu bylo v případě souborových systémů FAT (viz obrázek 1). Na obrázku vidíte pouze dvě speciální oblasti: boot sektor a Master File Table. Do zbylého prostoru mohou soubory a adresáře ukládat svá data. Na první pohled se zdá, že NTFS si nikde nepamatuje například seznam volných a obsazených clusterů.
První pohled ale klame hned dvakrát. NTFS si pamatuje seznam volných a obsazených clusterů a další metadata, nevyhrazuje však pro ně speciální oblasti. Ukládá je do souborů a adresářů, umístěních v prvních záznamech Master File Table a nacházejících se v kořenovém adresáři stromové struktury. Ovladač ntfs.sys však jejich přítomnost před souborovými manažery a jinými aplikacemi skrývá. Druhý bod, ve kterém první pohled na NTFS klame, je speciálnost MFT a boot sektoru. Obě tyto struktury jsou reprezentovány soubory na počátku MFT samotné. Jediná specialita boot sektoru spočívá v tom, že jej (na rozdíl od dat ostatních souborů) nelze přesunout do jiné oblasti.
Samotná Master File Table je reprezentována záznamem, který se v ní nachází hned jako první. Fakt, že MFT je v podstatě obyčejný soubor, například znamená, že se může skládat z více fragmentů. Fragmentaci se ovladač souborového systému snaží zamezit tím, že za tabulkou vytváří speciální prostor zvaný zóna MFT (MFT Zone), který se pro ukládání dat obyčejných souborů začne využívat až tehdy, když v jiných oblastech diskového oddílu dojde volné místo. Zóna MFT je rezervována primárně pro rozšiřování Master File Table.
Přehled souborů obsahujících různá metadata najdete v tabulce 11. Kromě názvu a krátkého popisu tabulka obsahuje u každého souboru i index, který určuje pořadové číslo záznamu reprezentujícího daný soubor. Například samotná Master File Table je obsažena v souboru s názvem $MFT, který je uložen v záznamu s indexem 0, tedy vůbec prvním záznamu v tabulce.
| Index | Název | Popis |
|---|---|---|
0 |
$MFT |
V datovém atributu obsahuje celou Master File Table. Na rozdíl od obyčejných souborů disponuje atributem typu $BITMAP, který obsahuje informace o tom, které záznamy MFT jsou volné či obsazené. |
1 |
$MFTMirr |
Obsahuje kopie prvních několika záznamů Master File Table. Pokud je počátek MFT poškozen, ovladač souborového systému použije data z tohoto souboru. Z toho důvodu se odkaz na $MFTMirr nachází i v boot sektoru. |
2 |
$LogFile |
Tento soubor obsahuje informace, které pomáhají při obnově ztracených souborů a také se uplatňují při transakcích. |
3 |
$Volume |
Obsahuje informace o sériovém čísle disku, název diskového oddílu a verzi NTFS, kterou je formátován. |
4 |
$AttrDef |
V tomto souboru se nachází informace o jednotlivých typech atributů. U každého typu může být definována maximální a minimální velikost těla a zda musí být vždy rezidentní či se jeho data mohou nacházet i mimo MFT. |
5 |
. |
Tento záznam reprezentuje kořen stromové adresářové struktury. |
6 |
$Bitmap |
Obsahuje bitovou mapu. Každý její bit určuje, zda je jemu odpovídající cluster volný (hodnota 0) či obsazený (hodnota 1). |
7 |
$Boot |
Reprezentuje boot sektor. Jedná se o jediný soubor, jehož data nelze přemístit (například z důvodu vadného bloku). |
8 |
$BadClus |
V alternativním datovém proudu $Bad uchovává seznam vadných clusterů. Tento datový proud je upraven tak, že jako svá data obsahuje všechny vadné clustery. Chová se jako řídký soubor. |
9 |
$Secure |
NTFS umožňuje definovat každému souboru či adresáři oprávnění pomocí atributu typu 0x50 ($SECURITY_DESCRIPTOR). Protože by však pro velké množství objektů byly tyto atributy úplně stejné, jsou používané popisovače zabezpečení uloženy ve formě B* stromu v tomto souboru a jednotlivé objekty se na ně odkazují prostřednictvím číselného indexu (položka SecurityId v těle atributu $STANDARD_INFORMATION). |
10 |
$UpCase |
Datový atribut obsahuje tabulku převádějící malá písmena na velká. Jedná se o pole znaků Unicode, do kterého se jako index používá kód Unicode převáděných znaků. |
11 |
$Extend |
Adresář, který obsahuje soubory, jejichž metadata slouží k zajištění pokročilejších funkcí souborového systému. Mimo jiné obsahuje soubory $ObjId, $Quota, $Reparse a $UsnJrnl. |
12—15 |
(žádné jméno) |
Tyto záznamy jsou označeny jako obsazené, ale ve skutečnosti se v nich nenachází žádná data. Pravděpodobně budou využity jako vedlejší záznamy pro soubor $MFT. |
16—23 |
(žádné jméno) |
Volné záznamy. Jejich využití je pravděpodobně stejné jako v předchozím případě. |
různý |
$Objld |
Každý soubor nebo adresář lze v rámci interních struktur NTFS jednoznačně určit pořadovým číslem jeho bázového záznamu MFT. Další možnost spočívá ve vytvoření jedinečného identifikátoru GUID, který bude cílovému objektu přiřazen a uložen do jeho záznamu ve formě atributu typu 0x40 ($OBJECT_ID). Soubor $ObjId obsahuje seznam všech takto identifikovaných objektů ve formě B* stromu. |
různý |
$Quota |
NTFS umožňuje pro každého uživatele nastavit limit, který celková velikost jím vlastněných souborů na diskovém oddílu nesmí přesáhnout. Vlastník souboru je u každého záznamu MFT zapsán v členu OwnerId atributu $STANDARD_INFORMATION a položka QuotaCharged tohoto atributu určuje, kolik bajtů objekt z kvóty zaplní. Soubor $Quota obsahuje jednak B* strom umožňující k číslu OwnerId vyhledat identifikátor SID, který pro rozlišení uživatelů a jiných entit bezpečnostního modelu používají ostatní části operačního systému, druhak informace o maximální kvótě a jejím aktuálním využití. |
různý |
$Reparse |
Tento soubor ve formě B* stromu obsahuje odkazy na všechny objekty, které jsou asociovány s nějakými metadaty reparse point. Jedná se o ty záznamy, které obsahují atribut typu 0xC0 známý také pod jménem $REPARSE_POINT. |
různý |
$UsnJrnl |
Do tohoto souboru jsou zaznamenávány změny prováděné na jednotlivých souborech a adresářích diskového oddílu. |
| Nové verze operačního systému přidávají do MFT další soubory se speciálním účelem. Tabulka 11 obsahuje seznam souborů metadat na Windows XP. |
| Tato kapitola si neklade za cíl detailně popsat každý aspekt souborového systému NTFS a jeho vnitřní strukturu, ale pouze přiblížit jednotlivé vlastnosti tohoto souborového systému a také způsob, jakým jsou přibližně implementovány. Některé vlastnosti však popsány nebyly, mezi ty zajímavé patří například podpora transakcí ve Windows Vista a Windows 7. |