FAT
System plików FAT został zaprojektowany przez firmę Microsoft. Pierwsza wersja tego systemu została zaprojektowana dla dysków o niewielkiej pojemności (głównym jej przeznaczeniem były dyskietki). Była to bardzo uboga wersja, nie obsługująca nawet podkatalogów. Później zaczęły powstawać kolejne, coraz lepsze wersje systemu plików FAT.
Obecnie rozróżnia się trzy rodzaje systemów plików FAT. Są to:
FAT12
FAT16
FAT32
Nazwy pochodzą od liczby bitów, używanych w każdym z systemów do adresowania.
Opis poszczególnych struktur w systemie plików FAT:
Klaster (ang. cluster)
Klaster jest grupą sektorów na partycji FAT. W klastry pogrupowane są tylko sektory z danymi. Rozmiar klastra wyspecyfikowany jest w strukturze Boot Record i może wynosić od jednego do 128 sektorów.
Boot Record
Wszystkie trzy odmiany FATa posiadają strukturę Boot Record, zamieszczoną w zarezerwowanych sektorach. Struktura Boot Record znajduje się na samym początku każdej partycji FAT, z tym, że dla FAT12 i FAT16 zajmuje ona jeden sektor, a dla FAT32 trzy sektory. Struktura ta zawiera pole opisujące rozmiar sektora dla danej partycji (zwykle 512 b).
Tablica Alokacji Plików (ang. File Allocation Table)
Tablica alokująca pliki znajduje się na pierwszych 63 sektorach dysku, po Boot Sektorze.
Tablica alokująca pliki jest zwykłą tablicą, zawierającą 12, 16 lub 32 bitowe elementy. Zazwyczaj na jednej partycji znajdują się dwie identyczne kopie.
W strukturze Boot Record jest pole specyfikujące ilość kopii tablicy FAT. W systemach FAT12 i FAT16 używana jest pierwsza kopia tablicy FAT, ale wszystkie zmiany są synchroniczne nanoszone na pozostałe kopie. FAT32 został rozszerzony o możliwość specyfikacji w polu "Flags", która kopia jest podstawowa.
O strukturze plików FAT można po prostu myśleć jako o liście, gdzie każdy łańcuch specyfikuje, które obszary dysku zajęte są przez dany plik czy katalog.
Katalog główny (Root Folder / Root Directory)
Katalog główny jest wyspecyfikowany jako normalny katalog, który nie posiada wpisów jedno- i dwu- kropkowych. W systemach FAT12 i FAT16 katalog główny znajduje się tuż za tablicami alokacji plików. Na partycjach FAT32 katalog główny jest utworzony ze zwykłego łańcucha klastrów, które adres początkowy znajduje się w strukturze Boot Record.
Rys. 1 Organizacja partycji FAT16
System plików FAT rezerwuje 1 sektor dla FAT12 i FAT16, a dla FAT32 zwykle 32 sektory. Zarezerwowane sektory zawierają Boot Record i jego kopię zapasową.
W Boot Record znajduje się struktura BPB (BIOS Parameter Block):
BPB dla partycji FAT12 lub FAT16
BPB_FAT12 |
STRUC |
(offset) |
bpbBytesPerSector |
DW ? |
0x0B |
bpbSectorsPerCluster |
DB ? |
0x0D |
bpbReservedSectors |
DW ? |
0x0E |
bpbNumberOfFATs |
DB ? |
0x10 |
bpbRootEntries |
DW ? |
0x11 |
bpbTotalSectors |
DW ? |
0x13 |
bpbMedia |
DB ? |
0x15 |
bpbSectorsPerFAT |
DW ? |
0x16 |
bpbSectorsPerTrack |
DW ? |
0x18 |
bpbHeadsPerCylinder |
DW ? |
0x1A |
bpbHiddenSectors |
DD ? |
0x1C |
bpbTotalSectorsBig |
DD ? |
0x20 |
BPB_FAT12 |
ENDS |
|
BPB dla partycji FAT32
BPB_FAT32 |
STRUC |
(offset) |
bpbBytesPerSector |
DW ? |
0x0B |
bpbSectorsPerCluster |
DB ? |
0x0D |
bpbReservedSectors |
DW ? |
0x0E |
bpbNumberOfFATs |
DB ? |
0x10 |
bpbRootEntries |
DW ? |
0x11 |
bpbTotalSectors |
DW ? |
0x13 |
bpbMedia |
DB ? |
0x15 |
bpbSectorsPerFAT |
DW ? |
0x16 |
bpbSectorsPerTrack |
DW ? |
0x18 |
bpbHeadsPerCylinder |
DW ? |
0x1A |
bpbHiddenSectors |
DD ? |
0x1C |
bpbTotalSectorsBig |
DD ? |
0x20 |
bpb32SectorsPerFAT |
DD ? |
0x24 |
bpb32Flags |
DW ? |
0x28 |
bpb32Version |
DW ? |
0x2A |
bpb32RootCluster |
DD ? |
0x2C |
bpb32InfoSector |
DW ? |
0x30 |
bpb32BootBackupStart |
DW ? |
0x32 |
bpb32Reserved |
DB 12 DUP (?) |
0x34 |
BPB_FAT32 |
ENDS |
|
Boot Sector dla partycji FAT12 lub FAT16
BS_FAT12 |
STRUC |
(offset) |
bsJmp |
DB 3 DUP (?) |
0x00 |
bsOemName |
DB 8 DUP (?) |
0x03 |
bsFAT12 |
BPB_FAT12 Structure |
0x0B |
bsDriveNumber |
DB ? |
0x24 |
bsUnused |
DB ? |
0x25 |
bsExtBootSignature |
DB ? |
0x26 |
bsSerialNumber |
DD ? |
0x27 |
bsVolumeLabel |
DB "NO NAME " |
0x2B |
bsFileSystem |
DB "FAT12 " |
0x36 |
bsBootCode |
DB 450 DUP (?) |
0x3E |
BS_FAT12 |
ENDS |
|
Boot Sector dla partycji FAT32
BS_FAT32 |
STRUC |
(offset) |
bsJmp |
DB 3 DUP (?) |
0x00 |
bsOemName |
DB 8 DUP (?) |
0x03 |
bsFAT32 |
BPB_FAT32 Structure |
0x0B |
bs32DriveNumber |
DB ? |
0x40 |
bs32Unused |
DB ? |
0x41 |
bs32ExtBootSignature |
DB ? |
0x42 |
bs32SerialNumber |
DD ? |
0x43 |
bs32VolumeLabel |
DB "NO NAME " |
0x47 |
bs32FileSystem |
DB "FAT32 " |
0x52 |
bs32BootCode |
DB 422 DUP (?) |
0x5A |
BS_FAT32 |
ENDS |
|
|
FAT12 |
FAT16 |
FAT32 |
liczba klastrów na partycji |
n-4084 |
4085-65524 |
65525-n |
Katalogi
Trochę o implementacji katalogów.
W systemach FAT12 i FAT16 wszystkie katalogi poza katalogiem głównym są w zasadzie plikami. Plik to ciąg bajtów, umieszczony w jednym bądź wielu klastrach. Rozmiar pliku przechowywany jest w strukturze katalogu.
Katalogi nie posiadają rozmiarów, traktowane są jako wielokrotność rozmiaru klastra. Katalogi są powiększane, gdy dodajemy do nich wpis, a katalog był już pełen.
Katalog główny występuje na ustalonym miejscu w partycji. W systemach FAT12 i FAT16 katalog główny nie może być powiększony, gdyż jego rozmiar został z góry określony przy formatowaniu partycji. Katalog główny w tych systemach ma ustaloną maksymalną liczbę wpisów na 512. W systemie FAT32 zostało to poprawione i nie ma ograniczeń na wpisy w katalogu głównym.
Katalog jest podzielony na małe struktury nazywane wpisami. Każde wpis ma rozmiar 32 bajtów i jest informacją o katalogu bądź pliku, zawartym w naszym katalogu. Wpis zawiera pola:
Nazwa w formacie 8.3 (11 bajtów)
Atrybut (1 bajt)
Czas utworzenia (3 bajty)
Data utworzenia (2 bajty)
Data ostatniego otwarcia (2 bajty)
Czas ostatniej modyfikacji (2 bajty)
Data ostatniej modyfikacji (2 bajty)
Numer początkowego klastra w tablicy alokacji plików (2 bajty)
Rozmiar pliku (4 bajty)
Suma bajtów = 29. Pozostałe 3 bajty są zarezerwowane, nie mają obecnie znaczenia.
Każdy klaster posiada własny wpis w tablicy FAT. Poniższa tabelka przedstawia wszystkie możliwe wartości dla takiego wpisu:
|
FAT12 |
FAT16 |
FAT32 |
Wolny |
000 |
0000 |
00000000 |
Zarezerwowany |
001 |
0001 |
00000001 |
Używany przez plik |
002-FF6 |
0002-FFF6 |
00000002-0FFFFFF6 |
Uszkodzony |
FF7 |
FFF7 |
0FFFFFF7 |
Ostatni klaster w pliku |
FF8-FFF |
FFF8-FFFF |
0FFFFFF8-0FFFFFFF |
Każdy katalog i plik w katalogu głównym liczony jest jako jeden wpis (może ich być więc w sumie maksymalnie 512, a jeśli mają nazwy dłuższe niż 8.3 to jeszcze mniej).
W tablicy alokacji plików plik dostaje pierwszą dostępną lokację na partycji. Numer początkowego klastra to adres pierwszego klastra, używanego przez plik. Każdy klaster zawiera wskaźnik do następnego klastra danego pliku albo wskaźnik końca pliku (np. 0xFFFF dla FAT16).
Rys.2 Pliki na partycji FAT16
NTFS
System plików NTFS został, podobnie jak FAT, stworzony przez firmę Microsoft. Zaprojektowany został specjalnie dla nowego systemu operacyjnego tej firmy Windows NT (New Technology). stworzenie tego systemu było konieczne, gdyż zaczęły pojawiać się dyski twarde o pojemności przewyższającej możliwości adresowania systemu FAT. Ponadto FAT nie nadawał się do wykorzystań sieciowyc, katalogi i pliki nie miały uprawnień dla różnych użytkowników. NTFS posiada już te wszystkie cechy, wraz z nowymi, wciąż rozwijanymi w różnych systemach np. journallingiem.
Architektura systemu NTFS
W systemie plików NTFS, każda struktura jest plikiem, wliczając w to struktury do zarządzania partycją i statystyk. Informacje kontrolne o partycji przechowywane są w zestawie specjalnych plików, które są tworzone wraz z partycją. Zawierają one informacje o plikach na partycji, rozmiarze partycji, rozmieszczeniu klastrów itp. Jedynym wyjątkiem od zasady "wszystko jest plikiem" jest Boot Sektor, który poprzedza na partycji pliki specjalne. Odpowiedzialny jest za najbardziej podstawowe funkcje, np. ładowanie systemu operacyjnego.
Każdy plik na partycji NTFS stanowi zbiór atrybutów. Dotyczy to nawet zawartości pliku, która traktowana jest jako jeden z atrybutów. Inne atrybuty to nazwa pliku i jego rozmiar. Dzięki takiemu rozwiązaniu system operacyjny traktuje pliki jako obiekty o różnych charakterystykach, pozwala to na łatwe zarządzanie plikami i dodawanie atrybutów w przyszłości.
NTFS przechowuje pliki (także pliki specjalne) używając systemu klastrów - każdy plik podzielony jest na klastry, z których każdy zawiera binarną ilość sektorów 512 bajtowych. Wygląda to podobnie do systemu FAT, ale różni się implementacją klastrów.
NTFS Boot Sektor
Boot Sektor znajduje się na początku każdej partycji NTFS. Jego funkcjonalność jest analogiczna, jak Boot Sektora w systemie FAT.
NTFS Boot Sektor pomimo, że w nazwie ma słowo "sektor", w rzeczywistości może zajmować na partycji do 16 sektorów.
NTFS Boot Sektor zaczyna się w pierwszym sektorze partycji i składa z dwóch struktur.
BIOS Parameter Block: Zawiera podstawowe informacje o partycji: nazwę, rozmiar itp.
Volume Boot Code: Kod małego programu, który instruuje system plików jak załadować system operacyjny.
Volume Boot Code na partycji FAT to ulubiony cel dla wirusów, gdyż zmiana tego kodu może pozwolić wirusowi na automatyczne ładowanie przy każdym starcie systemu.
Partycje i ich rozmiary w systemie NTFS
Dużą wadą systemów FAT jest ich stosunkowo niewielka przestrzeń adresowa. Maksymalny rozmiar partycji NTFS to 2^64 bajtów, czyli 18,446,744,073,709,551,616 bajtów.
Dla porównania FAT32 może maksymalnie zaadresować 2 Terabajty pamięci, ale olbrzymich tablicach FAT i stratach pamięci.
Klastry
Jedno z podobieństw między systemami FAT i NTFS polega na zarządzaniu nie pojedynczymi sektorami, ale ich grupami - klastrami. Jednak zarządzają nimi w zupełnie inny sposób. Podobnie jak FAT, NTFS wybiera rozmiar klastrów w zależności od rozmiaru partycji. Jednak sposób wyboru wielkości klastra różni się od tego z FAT. Poniższa tabela pokazuje liczbę klastrów i ich rozmiar w zależności od wielkości partycji:
Liczba sektorów w klastrze |
Rozmiar klastra (kiB) |
|
<= 0.5 |
1 |
0.5 |
> 0.5 to 1.0 |
2 |
1 |
> 1.0 to 2.0 |
4 |
2 |
> 2.0 to 4.0 |
8 |
4 |
> 4.0 to 8.0 |
16 |
8 |
> 8.0 to 16.0 |
32 |
16 |
> 16.0 to 32.0 |
64 |
32 |
> 32.0 |
128 |
64 |
Rozmiar klastrów ma istotny wpływ na działanie systemu. Im większe klastry tym więcej pamięci jest marnowane.
Pliki systemowe
Pliki systemowe znajdują się na początku partycji NTFS. Jednym z plików systemowych jest Master File Table (MFT). MFT zawiera rekord, opisujący każdy plik i katalog na partycji, a jeśli plik jest dość mały, to znajduje się też tam jego zawartość.
Pliki systemowe też znajdują się w rekordzie MFT, co opisuje poniższa tabelka:
Nazwa pliku systemowego |
Nazwa pliku |
Rekord MFT # |
Opis |
Master File Table (MFT) |
$MFT |
0 |
MFT też jest plikiem w MFT znajduje się opis jego działania. |
Master File Table 2 (MFT2) / Master File Table Mirror |
$MFTMirr |
1 |
"Lustrzane" odbicie MFT, zawiera 16 pierwszych rekordów MFT, opisujących pliki systemowe. Plik przechowywany w środku partycji (Windows NT 3.5 i wcześniejsze) albo na jej końcu (Windows NT 4.0 i późniejsze). |
Log File |
$LogFile |
2 |
Zapis wszystkich transakcji na plikach. Zapewnia odtwarzalność danych. |
Volume Descriptor |
$Volume |
3 |
Zawiera podstawowe informacje o partycji, jak nazwa, wersja systemu NTFS, czas utworzenia, itp. |
Attribute Definition Table |
$AttrDef |
4 |
Zawiera opis różnych typów atrybutów plików na partycji NTFS. |
Root Directory / Folder |
"." (single period) |
5 |
Wskaźnik na Root Directory katalog partycji. |
Cluster Allocation Bitmap |
$Bitmap |
6 |
Zawiera mapę, które klastry są zajęte, a które wolne. |
Volume Boot Code |
$Boot |
7 |
Zawiera kopie struktury Boot Sektor. |
Bad Cluster File |
$BadClus |
8 |
Lista wszystkich klastrów na partycji, oznaczonych jako uszkodzone. |
Quota Table |
$Quota |
9 |
Zawiera informacje o quocie na partycji (tylko dla NTFS 5.0 i późniejszych). |
Upper Case Table |
$UpCase |
10 |
Zawiera informacje o konwersji nazw plików do formatu UNICODE (16 bitów). |
Przechowywanie informacji o plikach systemowych pozwala na łatwą rozbudowę systemu. Ponadto pliki systemowe nie muszą znajdować się w określonym miejscu na partycji, więc w razie uszkodzenia jakiejś części twardego dysku mogą być przeniesione w inne miejsce.
Master File Table (MFT)
MFT jest najważniejszym plikiem systemowym na partycji NTFS. Przechowywane są tutaj dane o każdym pliku i katalogu na partycji. Działa jako "punkt startowy" i "spis treści" zarządzania partycją.
Kiedy na partycji tworzymy katalog lub plik, zostaje dla niego utworzony rekord w MFT. Dla takiego rekordu minimalnym rozmiarem jest 1,024 bajty, a maksymalnym 4,096 bajtów. System używa rekordu do przechowywania informacji o pliku/katalogu w postaci atrybutów. W systemie NTFS nie ma rozróżnienia między zawartością pliku, a jego atrybutami. Ma to ciekawy skutek dla małych plików: jeśli rozmiar pamięci potrzebny na wszystkie atrybuty pliku, wliczając w to jego zawartość, jest mniejszy niż rozmiar rekordu, zawartość pliku będzie przechowywana wewnątrz MFT. Dlatego takie pliki nie wymagają już przechowywania poza MFT, a w dodatku skraca się czas wczytywania pliku.
Inne ciekawe wykorzystanie atrybutów plików w systemie NTFS to kompresja plików. Zajmuje się tym aplikacja systemu Windows NT. Plik przechowywany jest na partycji w postaci skompresowanej. Gdy użytkownik chce go odczytać następuje automatyczna dekompresja tego pliku bez wiedzy użytkownika.
Pliki rzadkie przechowywane są na partycji NTFS oszczędnie (tylko znaczące dane). Pozwala to oszczędniej wykorzystywać miejsce na partycji.
Rys. 3 Rekord MFT dla małego pliku lub katalogu
Jeśli wszystkie atrybuty pliku nie mieszczą się w MFT, są przechowywane poza nią, jako atrybuty zewnętrzne. Dla bardzo dużych plików nawet wskaźniki na zawartość pliku mogą być atrybutami zewnętrznymi! Duże katalogi są zorganizowane w B-drzewa. Ich rekordy zawierają wskaźniki do zewnętrznych klastrów, zawierających atrybuty katalogu, które nie zmieściły się w MFT.
Takie zarządzanie plikami powoduje duży rozrost MFT. Przy zakładaniu partycji NTFS 12,5 % rozmiaru dysku rezerwowane jest dla MFT. Normalne pliki i katalogi nie będą używać tej przestrzeni, chyba że zabraknie miejsca na reszcie dysku..