Historia
Pod koniec lat osiemdziesiątych powstał Windows NT. Wraz z jego rozwojem okazało się,
że wykorzystywane przez niego systemy plików takie jak FAT czy HPFS miały zbyt duże
ograniczenia. Microsoft był zmuszony na początku lat dziewięćdziesiątych opracować nowy
system plików dla Windows NT, aby móc z nim wejść na rynek zastosowań biznesowych
i wymagający bezpieczeństwa oraz integralności przechowywanych danych, a także
zaawansowanych funkcji organizacji i dostępu do danych. W tym celu wykorzystano
doświadczenia z pracy nad HPFS i OS/2. Nowy system plików był stosowany wewnątrz
firmy podczas normalnej pracy, dzięki czemu jego twórcy mogli go od razu dobrze
przetestować. Tak powstał NTFS.
Wprowadzono w nim m.in. obsługę dużych partycji, macierzy dyskowych, uprawnień
do plików, zwiększono odporność na błędy, zmieniono sposób zapisu nazw plików
z 8-bitowego na 16-bitowy Unicode. Pierwsza wersja (1.0) ujrzała światło dzienne wraz
z Windows NT 3.1. Systemy Windows NT 3.51 i 4.0 obsługują NTFS 1.2 (niektóre źródła
podają numer 1.1, wersja ta jest też znana jako NTFS 4.0 od numeru wersji Windows). Wraz
z Windows 2000 pojawił się NTFS 5.0 (nazywany też 3.0), dodano m.in. możliwość
szyfrowania plików, przydziały przestrzeni dyskowej (quota) oraz ewentualność montowania
woluminów do katalogów. Windows XP i 2003 używają NTFS 5.1 (3.1), więc różnice
w stosunku do 5.0 są niewielkie.
Przesunięto też niektóre struktury danych na szybsze miejsca na dysku, co jak podaje
Resource Kit, zwiększa wydajność o 5 – 8 procent. Dodano nowe i ulepszono istniejące
narzędzia dyskowe, m.in. do konwersji z FAT. Zmiany, choć niewielkie, sprawiają jednak
kłopoty starszym narzędziom dyskowym. Ponadto Windows XP przy pierwszym montowaniu
woluminu sformatowanego jako NTFS 5.0 automatycznie konwertuje go do 5.1, co może
spowodować problemy z odczytem dysku pod Win2k. Obsługę NTFS 5.1 w Windows 2000
wprowadzono w SP1, a w NT 4 w SP4.
Wolumin NTFS składa się z czterech obszarów:
• bootsectora (sektora startowego), który zawiera podstawowe informacje
o woluminie oraz posiada kod uruchamiający Windows NT,
• głównej tablicy plików (Master File Table, MFT), składającej się z plików
systemowych przechowujących, m.in. dane o położeniu plików i katalogów,
ich atrybuty, plik dziennika, informacje o uszkodzonych sektorach itp,
• danych plików i katalogów,
• kopii zapasowej MFT.
Bootsector
To pierwszy sektor partycji tworzony podczas formatowania woluminu. Na początku znajduje
się trzybajtowa instrukcja skoku, będąca rozkazem w języku maszynowym procesora x86.
Jest ona potrzebna, gdyż po niej znajdują się dane i procesor musi przejść do części
bootsectora zawierającej kod startowy uruchamiający system operacyjny. Te dane to OEM
ID, BPB i rozszerzone BPB (Extended BPB). OEM ID jest ciągiem znaków identyfikujących
nazwę i wersję systemu operacyjnego. Systemy Windows NT wpisują tam ciąg „NTFS”
(w systemie plików FAT też znajdował się OEM ID), Windows 95 wpisywał w tym miejscu
„MSWIN4.0”, natomiast Windows 95 OSR 2 i późniejsze z linii 9x umieszczały
„MSWIN4.0”. Po OEMID znajduje się BPB (BIOS parameter block, blok parametrów BIOS-
u), zawierajacy m.in. informacje o geometrii dysku, pozwalające kodowi wykonywalnemu
zawartemu w bootsectorze na odnalezienie pliku ntldr i uruchomienie Windows.
ExtendedBPB pozwala na odnalezienie MFT. Jeśli zdarzy się uszkodzenie klastrów w obrębie
MFT, można je przenieść w inne miejsce dysku. Trzeba tylko zmienić zapis w Extended BPB.
W przypadku uszkodzenia rozszerzonego BPB, główna tablica plików nie może zostać
odnaleziona i Windows uznaje partycję za niesformatowaną.
MFT
Główna tablica plików zawiera wszelkie informacje o sobie i wszystkich innych plikach
na dysku, jest bardzo dobrą bazą danych zawierającą co najmniej jeden rekord dla każdego
pliku lub katalogu. Kolumnami w tej bazie są atrybuty plików. Rekordy posiadają też
nagłówki zawierające sumę kontrolną, wskaźnik do pierwszego atrybutu w rekordzie,
wskaźnik do pierwszego wolnego bajtu oraz numer bazowego rekordu MFT dla pliku,
którego dotyczy wpis. Jeśli dane opisujące plik nie mieszczą się w jednym rekordzie,
to posiada on ich kilka. Sytuacja taka może wystąpić np. przy dużym sfragmentowaniu pliku,
wtedy pierwszy jego rekord to rekord bazowy, zawierający informacje o pozostałych. Małe
pliki lub katalogi mogą być umieszczane w rekordach w całości, a nie tylko same
ich atrybuty. Maksymalny rozmiar pliku/katalogu takiego pliku zależy naturalnie od rozmiaru
rekordu. Rekord może mieć różną wielkość zależnie od wielkości klastra oraz wersji NTFS-a,
który zwykle oscyluje wokół 1 kilobajta. Główna tablica plików jest w rzeczywistości plikiem
o nazwie $Mft, posiadającym częściową kopię zapasową w pliku o nazwie $MftMirr. Dane
na temat tego jak duża część MFT znajduje się w kopii zapasowej, są dość rozbieżne.
W Technecie, w opisach Windows 2000 i 2003 widnieje informacja o czterech sektorach,
a w przypadku Windows XP – w zależności odwielkości, cztery rekordy lub pierwszy klaster.
W opisach NTFS4 spotkać można również wartość 16 lub 3 rekordów. Plik $MftMirr
położony jest na końcu woluminu (w Windows NT 3.51 i temu podobnych systemach
znajdował się pośrodku przestrzeni woluminu), natomiast $Mft i $MftMirr to tzw. metapliki.
Na dysku znajduje się więcej takich plików, a wszystkie z nich mają nazwy zaczynające się
od znaku $, nie można ich także normalnie zobaczyć. W starszych Windows NT były
widoczne za pomocą polecenia dir /ah wydanego w katalogu głównym. Dla metaplików
zarezerwowane jest 16 pierwszych rekordów w MFT (ok. 1 megabajta). Spis metaplików i ich
funkcje można znaleźć w tabeli 3.
Ponieważ fragmentacja MFT mogłaby spowodować znaczny spadek wydajności systemu,
NTFS rezerwuje domyślnie 12,5% miejsc na dysku na MFT. Ten obszar nazywany jest strefą
MFT (MFT zone). Nie powoduje to jednak niewykorzystania miejsca na dysku, jeśli dostępne
miejsce się skończy, pliki są zapisywane w strefie MFT. Jeżeli na woluminie zostanie
utworzonych bardzo dużo małych plików, może zajść sytuacja odwrotna – rekordy tych
plików nie zmieszczą się w strefie MFT i zostanie ona wtedy powiększona. Systemowe
funkcje zwracające ilość wolnego miejsca uwzględniają też wolne miejsce w MFT zone,
użytkownik nie jest więc świadom jej rozmiaru i wszystko odbywa się dla niego w sposób
właściwy.
Atrybuty plików
Każdy zaalokowany sektor na woluminie NTFS należy do pliku. Wszystkie pliki i katalogi są
traktowane jako zestawy atrybutów, do których należą m.in. nazwa, informacje
o zabezpieczeniach, a także same dane przechowywane w pliku. Każdy atrybut jest
identyfikowany przez kod, a opcjonalnie także przez nazwę. Atrybuty, które są zapisane
w rekordzie pliku w MFT, są nazywane atrybutami rezydującymi, a te, które się nie mieszczą,
zapisywane są poza MFT, w przestrzeni dyskowej i noszą nazwę nierezydujących.
W atrybutach rezydujących zostaje utworzona lista atrybutów (która także jest atrybutem)
zawierająca wskazania na położenie atrybutów nierezydujących w celu odnalezienia
wszystkich atrybutów pliku. Nazwa pliku oraz znaczniki czasu są zawsze rezydujące.
Rekordy katalogów zawierają informacje indeksujące i podobnie jak w przypadku plików,
atrybuty katalogów mogą się nie zmieścić w jednym rekordzie.
Duże katalogi są wtedy organizowane w postaci posortowanego drzewa zrównoważonego
(balanced tree, B-tree) i posiadają rekordy ze wskaźnikami do zewnętrznych klastrów
(buforów indeksowych, index buffers), zawierających wpisy w folderze, które nie mieszczą
się w MFT. Przeszukiwanie drzewa zrównoważonego jest dużo szybsze niż listy, szczególnie
przy dużej ilości elementów. W przypadku drzewa obszar poszukiwań za każdym razem
zmniejsza się kilkukrotnie, zależnie od ilości elementów w węźle. W systemie plików FAT,
gdzie stosowana była lista, wpisy w katalogu przeszukiwane były po kolei, dopóki nie został
odnaleziony poszukiwany plik/katalog. Co prawda w nowszych systemach korzystających
z FAT, takich jak Windows 98, wprowadzono podobne optymalizowanie przeszukiwania,
jednak nadal stosowane było liniowe ułożenie wpisów.
Kompresja
Kompresja jest natywnie obsługiwana przez NTFS i Windows NT, dzięki czemu nie trzeba
korzystać z żadnych zewnętrznych programów. Posługiwanie się skompresowanymi plikami
wygląda tak samo jak praca ze zwykłymi plikami, jedyną odczuwalną różnicą może być
wolniejszy dostęp. Skompresowanie pliku czy katalogu jest bardzo proste i wymaga
zaznaczenia atrybutu kompresji w okienku właściwości pliku/katalogu. Pliki skompresowane
nie mogą być zaszyfrowane, ponadto kompresja nie jest dostępna w Windows XP Home
Edition.
Kompresji podlegają bloki składające się z 16 klastrów, które są kompresowane oddzielnie
i dzięki temu np. część pliku może zostać skompresowana, a część nie. Podczas kompresji
dane z 16 klastrów są zapisywane w mniejszej ilości miejsca. Pozostałe klastry stają się tzw.
klastrami wirtualnymi i znajdują się za „prawdziwymi”. Podczas dekompresji wirtualne
klastry zostają zapełnione danymi na podstawie danych zapisanych w pozostałych klastrach
i w ten sposób odtwarzana jest pierwotna postać pliku. Wszystko odbywa się w sposób
automatyczny i przezroczysty dla aplikacji. Kompresję można włączyć lub wyłączyć poprzez
ustawienie lub wyłączenie odpowiedniego atrybutu pliku. Włączanie następuje poprzez
przesłanie
parametru
FSCTL_SET_COMPRESSION
do
funkcji
DeviceIoControl,
a plik/katalog otrzymuje flagę FILE_ATTRIBUTE_COMPRESSED. Ponieważ dekompresja
następuje w pamięci, spadek wydajności nie jest zbyt duży. Kompresja nie może zostać
zastosowana na woluminach, które zostały sformatowane z wielkością klastra ponad 4 kB.
Z tego też względu wprowadzono wraz z systemem Windows 2000 ograniczenie domyślnej
wielkości klastra podczas formatowania właśnie do 4 kB.
Uprawnienia do dostępu do danych
W NTFS-ie wprowadzono to, czego bardzo brakowało w systemie plików FAT, a było
od dawna dostępne w systemach uniksowych – uprawnienia do plików i katalogów. Nie są
to jednak proste zestawy uprawnień do odczytu, zapisu i wykonania dla użytkownika, grupy
użytkowników i pozostałych użytkowników. W NTFS 4.0 było 6 uprawnień, w NTFS 5.1 jest
ich już 13, co pozwala na bardzo dokładne określanie, kto może wykonać jakie akcje na pliku.
Nie trzeba ustawiać każdego prawa oddzielnie, ponieważ istnieją predefiniowane zestawy
uprawnień. Dzięki dziedziczeniu wprowadzonemu w NTFS 5.0 można wygodnie zmieniać
prawa wielu plików i katalogów jednocześnie, ale z zachowaniem wyjątków. Uprawnienia
można nadawać dowolnym użytkownikom i grupom, a właścicielem pliku może być
użytkownik lub grupa.
Nazwy plików
Nazwy plików, podobnie jak w FAT32 mogą mieć długość 255 znaków. Znaki występujące
w ścieżce nie są jednak zapisywane jako 8-bitowe znaki ASCII, ale zakodowane
w standardzie Unicode do postaci 16-bitowej, więc dzięki temu użytkownicy mogą bez
przeszkód używać swoich znaków narodowych.
Szyfrowanie
Także obsługa szyfrowania została wbudowana w NTFS. Dzięki niej osoba mająca fizyczny
dostęp do dysku, a nie posiadająca odpowiedniego klucza prywatnego nie może odczytać
z niego danych. Szyfrowaniu podlegają pojedyncze pliki, a zaznaczenie szyfrowania dla
katalogu oznacza, że szyfrowane będą nowe pliki tworzone w tym katalogu. Plików
z atrybutami systemowy i tylko do odczytu nie można szyfrować.
Przydziały (Quota)
NTFS w Windows NT nie dawał możliwości kontrolowania ilości miejsca na dysku zajętej
przez użytkowników. Można to było osiągnąć stosując oprogramowanie firm trzecich, jednak
już wtedy w strukturze NTFS-a było przewidziane miejsce na quotę, którą wprowadzono
w Windows 2000 wraz z NTFS 5. W Win2k danemu użytkownikowi przydziela się miejsce
na danym woluminie. Nie ustala się więc np. maksymalnej wielkości katalogu tylko
maksymalną sumę rozmiarów plików na danym woluminie. Przy zapisie na dysk sprawdzane
jest miejsce wykorzystywane przez użytkownika. Jeśli limit zostaje przekroczony, to zależnie
od ustawień, użytkownik może stracić możliwość dalszego zapisu na dysk i/lub może zostać
zapisane zdarzenie w dzienniku zdarzeń. Oprócz górnego limitu objętości plików
administrator może też określić próg, którego przekroczenie powoduje wygenerowanie
ostrzeżenia o zbliżaniu się do granicy objętości plików. W przypadku plików
skompresowanych liczony jest ich rozmiar po rozpakowaniu, a w pomocy Windows XP
znajduje się informacja, że w przypadku folderów skompresowanych brana pod uwagę jest
ich wielkość na dysku. Nie chodzi jednak tu o foldery z włączonym atrybutem kompresji,
a o pliki ZIP, których obsługa została wbudowana w XP i są one nazywane folderami
skompresowanymi.
Ochrona przed uszkodzeniem systemu plików
Jednym z wymogów stawianych systemom plików jest odporność na uszkodzenia. System
FAT nie posiadał takiej odporności, a zawieszenie się systemu czy błąd aplikacji
niejednokrotnie powodowały powstawanie błędów na dysku. W NTFS-ie wprowadzono m.in.
mechanizm transakcji znany z systemów bazodanowych. Każda operacja na dysku jest
traktowana jako transakcja składająca się z kilku czynności. Jeśli powiodą się wszystkie
składniki transakcji jest ona uznawana za wykonaną poprawnie, natomiast w przeciwnym
wypadku składniki transakcji są wycofywane i transakcja kończy się błędem. Podczas
odzyskiwania danych wykonywane są ponownie wszystkie transakcje oznaczone jako udane.
Następnie wyszukiwane są nieukończone transakcje, a podoperacje które wchodzą w ich
skład są wycofywane – gwarantuje to, że na dysku nie znajdą się nieukończone transakcje.
Nie uchroni to oczywiście przed utratą danych spowodowaną np. powstaniem uszkodzonych
sektorów po zapisie do nich danych. NTFS posiada funkcję zwaną przemieszczaniem
klastrów (Cluster Remapping), polegającą na automatycznym zaalokowaniu nowego,
w momencie gdy podczas odczytu lub zapisu zostanie napotkany uszkodzony sektor.