Ext3

Krzysztof Kowalczyk

Wstęp

Od dłuższego czasu system plików ext2 był silnie rozwijany. Napisano bardzo wiele dodatkowych możliwości: indeksowanie katalogów, dziennikowanie i inne. Jednak większość z nich nie trafiło do oficjalnego sterownika w jądrze. Dopiero zebranie tych rozwiązań i wydanie w postaci nowego systemu plików ext3 przez Dr. Stephen'a Tweedie pozwoliło znaleźć się im w głównej linii jądra. Dzięki temu system plików ext3 jest w pełni kompatybilny z ext2, do tego stopnia, że sterownik ext2 potrafi zamontować ext3 do odczytu. Również konwersja z ext2 do ext3 przebiega w miejsu bez potrzeby robienia kopii zapasowej danych.

Sterownik do ext3 pojawił się w jądrze 2.4.16. System plików ext3 jest domyślnym systemem plików dla obecnej dystrubucji Linux RedHat.

Journaling

Dziennikowanie w ext3 nie jest bezpośrednio zaimplementowana. Wykorzystane jest specjalne API nazywane warstwą Journaling Block Device (JBD). JBD zostało napisane by w prosty sposób dołączać dziennikowanie do dowolnego urządzenia blokowego.

W ext3 dziennik tworzony i zarządzany przez JBD trzymany jest w inode, czyli po prostu w pliku. Domyślnie jest to plik .journal w katalogu głównym. Od wersji 0.9.5 ext3 umożliwia trzymanie dziennika na dowolnym innym urządzeniu blokowym. Można znacznie zwiększyć wydajność systemu plików przenosząc dziennik na partycje na innym dysku, bądź testować działanie ext3 trzymając dziennik w ramdysku. Dzięki takiemu sposóbowi trzymania dziennika zachowujemy dużą kompatybilność z ext2.

Większość systemów plików z dziennikowaniem przechowuje w dzienniku tylko różnice pomiędzy blokami danych do zapisania i tymi, które są zapisane na dysku (listę bajtów do zmiany), co nazywamy dziennikowaniem logicznym (logical journaling). JBD robi to inaczej. W dzienniku przechowywane są całe zmienione bloki. Takie podejście nazywa się dziennikowanie fizycznym (physical journaling). Mogłoby się wydawać, że zmniejsza to wydajność systemu ze względu na dużą ilość danych przesyłanych na dysk. Jednak pozwala to połączenie w pamięci kilku operacji na bloku zmniejszając ilość operacji zapisu na dysku. Również fakt, że w pamięci znajdują się gotowe do zrzucenia bloki zmniejsza nakład obliczeniowy procesora.

Wykorzystanie JBD przez ext3 dokonuje się na tej zasadzie, że sterownik ext3 przed zapisaniem czegoś na dysk informuje o tym JBD i czeka na zezwolenie na zapis.

System plików ext3 dostarcza trzy różne poziomy dziennikowania:

  1. journal - dziennikowane są wszystkie zmiany danych jak i metadanych,
  2. ordered - dziennikowane są wszystkie zmiany metadanych, zmiany na metadanych odbywają się dopiero po zapisaniu danych na dysku,
  3. writeback - dziennikowane są tylko metadane.

Poziom journal jest najbezpieczniejszy ze względu na ryzyko utraty danych, a jednocześnie najwolniejszy. Zmniejszenie wydajności spowodowane jest tym, że aby zatwierdzić jakąkolwiek zmianę na dysku potrzeba dwóch operacji zapisu, najpierw do dziennika a dopiero później rzeczywiste dane. Jednak w wielu sytuacjach minimalizacja możliwości utraty danych jest dużo ważniejsza. Tak wysoki poziom dziennikowania dostarcza tylko ext3.

Poziom ordered jest domyślnym poziomem dziennikowania w systemie plików ext3. Operacje zapisu danych i metadanych układane są w transakcje, kiedy przyjdzie czas na zapisanie nowych metadanych, najpierw zapisywane są dane, a później metadane. Dzięki temu, że metadane są zapisywane na dysk dopiero po zakończeniu operacji zapisu danych, nie jest możliwe by metadane wskazywały na niezapisane jeszcze na dysku dane. Czekanie na zapis wszystkich danych na dysk zmniejsza nieznacznie wydajność systemu plików, jednak w porównaniu z ext2 jest to zmiana marginalna.

Writeback jest poziomem z dziennikowaniem tylko metadanych, a co za tym idzie poziomem mającym najmniejsze straty wydajności. Jednocześnie przez to, że zapis danych i metadanych przebiega asynchronicznie mogą się pojawić po awarii niespójności. Na przykład metadane mogą wskazywać na bloki, które były w trakcie zapisywania gdy system uległ awarii. Taki poziom dziennikowania (bez dziennikowania danych) jest zaimplementowany w większości pozostałych systemów plików z dziennikowaniem.

Indeksowane katalogi

W ext3 jest możliwość włączenia indeksowanego formatu katalogu. Indeksowany format katalogu pozwala na szybsze wyszukiwanie pozycji w katalogu. Jest to przydatne zwłaszcza gdy ilość plików w katalogu jest stosunkowo duża.

Struktura pliku katalogu:

Bloki 0 do 511 to bloki indeksów, kolejne bloki są tradycyjnymi blokami przechowującymi wpisy katalogów. W blokach indeksów przechowywane są wpisy postaci:
klucz : wskaźnik do bloku
Klucz jest generowany na podstawie nazwy funkcją haszującą, najbardziej znaczący bit to flaga kolizji. Wskaźnik wskazuje zależnie od wysokości drzewa indeksowania na kolejny blok indeksu (1-511) bądź na blok z wpisami katalogowymi. Pierwszy blok indeksowy zawiera dodatkowo nagłówek, w którym określony jest typ indeksowania, wersja funkcji haszującej, ilość poziomów indeksowania.

Operacja szukania wpisu w katalogu polega na obliczeniu funkcji haszującej i schodząc w dół drzewa według wskaźników dojść do bloku zawierającego poszukiwany wpis. Dalsze wyszukiwanie odbywa się tak jak w bloku katalogu bez indeksowania. Operacja zapisu przebiega podobnie, z tym że potrzebny jest mechanizm rozwiązywania kolizji (przepełnienia bloku z wpisami katalogowymi):

Gdy zdaży się, że wszystkie wpisy w bloku przepełniającym się mają ten sam klucz to ustawiana jest flaga kolizji w kluczu i zapisuje się nowe wpisy do następnego bloku.

W obecnej implementacji uwzględniony jest tylko jeden poziom indeksowania. Pozwala to na trzymanie w katalogu około 90 000 wpisów. Dołączenie kolejnego poziomu umożliwiłoby zapis 50 milionów plików.

Czas utworzenia plików
Ilość plikówIndeksowanyNormalny
10 00001s23s
50 00007s9m31s
90 000013s33m18s


Lokalne systemu plików