Wstęp

System ext2 został zaprojektowany w czasach gdy dyski twarde miały dużo mniejszą pojemność niż obecnie. Wzrost pojemności dysków, a wraz z nim wzrost objętości plików, katalogów i partycji wykazały wiele niedoskonałości tego systemu plików. Niedoskonałości te są dwojakiego rodzaju:

Wolne bloki

System ext2 przechowuje informacje o wolnych blokach w bitmapie bloków - 1 bloku dyskowego zawierającego mapę bitową opisującą, które bloki w grupie są wolne, a które zajęte. Takie rozwiązanie powoduje powstanie dwóch problemów:

Oto jak trzy opisywane systemu realizują alokację wolnych bloków:

XFS wprowadza pojęcie ekstentu (ang. extent) - ciągłego obszaru wolnych bloków na dysku, do opisania którego wystarczy podać numer bloku, od którego ekstent się zaczyna oraz jego długość. Przy dużej ilości wolnego miejsca na dysku pozwala to znacznie zmniejszyć ilość informacji które trzeba przechowywać (a przy tym ilość informacji, którą trzeba przejrzeć). Niestety przy wysokim stopniu fragmentacji wolnego miejsca nie pozwala to znacząco przyspieszyć operacji znajdowania wolnych bloków; dlatego też ekstenty w systemie XFS przechowywane są w dwóch B+-drzewach: jednego indeksowanego położeniem ekstentu, drugiego zaś jego wielkością. Pozwala to łatwo znaleźć wolny obszar dysku albo o określonej wielkości, albo w określonym miejscu na dysku.

JFS tworzy tzw. Mapę Alokacji Bloków, Każda strona takiej mapy ma długość 4 kB z czego 1 kB przeznaczony jest na bitmapę opisującą stan 8192 bloków dyskowych, a pozostały obszar strony przeznaczony jest ma kopię bitmapy i struktury pomocnicze.

  1. Dla każdych 32 bitów bitmapy obliczany jest najdłuższy spójny ciąg zer o długości będącej potęgą dwójki.
    Otrzymujemy w ten sposób ciąg 256 liczb długości nie większych niż 5.
  2. Następnie ciąg ten jest przekształcany tak, że w każdym polu zapisuje się długość nujdłuższego spójnego wolnego obszaru rozpoczynajacego się w danym polu, uwzględniając jego „binarnego bliźniaka".

    -1 oznacza, że informacje o wolnych blokach w danym bloku zostały ujęte w jego „bliźniaku".
  3. Otrzymany w wyniku ciąg 256 liczb nie większych niż 13 jest wpisywany do liści drzewa, w którego węzłach wewnętrznych zapisana jest największa liczba ciągłych bloków w jego liściach.
  4. Drzewa te stanowią liście kolejnego drzewa, dzięki któremu można łatwo sprawdzić stan zajętość każdego bloku na dysku.

W systemie ReiserFS używana jest bitmapa wolnych bloków w sposób analogiczny do tego, który zastosowany jest w ext2.

Dynamiczna alokacja i-węzłów

Jednym z głównych mankamentów systemu ext2 jest użycie stałej liczby i-węzłów, co powoduje, że już w momencie zakładania systemu plików trzeba z góry określić jaka będzie przewidywana liczba plików w nim przechowywanych. Gdyby zaś się okazało, że wyczerpaliśmy wszystkie i-węzły z systemu, musimy zrobić backup całej partycji, a następnie przeformatować ją z większą liczbą i-węzłów. Powodem, dla którego system ext2 nakazuje nam z góry określić używaną liczbę i-węzłów jest fakt, iż używa on bitmap i-węzłów podobnie jak bitmap bloków do określenia, które bloki na dysku są wolne, a które zajęte.

XFS przechowuje wszystkie zajęte i-węzły w postaci B+-drzewa indeksowanego numerami węzłów. Oprócz tego przechowywana jest lista wszystkich wolnych i-węzłów w systemie.

JFS informację o wolnych i zajętych i-węzłach pzedstawia w postaci mapy bitowej z dołączoną strukturą B+-drzewa pozwalającą szybko zlokalizować węzeł na podstawie jego numeru i umożliwiającą zmianę rozmiaru bitmapy. Wolne i-węzły są ponadto, podobnie jak w XFS-ie, przechowywane są na liście

ReiserFS stosuje zupełnie odmienne podejście do przechowywania informacji o plikach. Cały system plików ReiserFS przechowywany jest w jednym B+-drzewie. Drzewo to składa się z trzech rodzajów węzłów: Węzły wewnętrzne są typowymi węzłami wewnętrznymi B-drzewa. Składają się one ze wskaźników do poddrzew, oddzielonych kluczami. Klucz poprzedzający wskaźnik do poddrzewa jest kopią klucza pierwszego węzła sformatowanego, w tym poddrzewie. Liśćmi drzewa są węzły niesformatowane, poziom wyżej znajdują się węzły sformatowane, ponad którymi leżą węzły wewnętrzne.

Węzły sformatowane składają się z elementów (ang. items). Elementy mogą być czterech typów: pośrednie, bezpośrednie, katalogowe lub statystyczne. Element każdego rodzaju zawiera klucz unikatowy dla danego elementu. Jest on wykorzystywany, do sortowania i odnajdywania elementów. Plik składa się ze zbioru elementów bezpośrednich oraz co najwyżej dwóch elementów pośrednich. Obecność dwóch elementów pośrednich oznacza iż ogon pliku został rozdzielony do dwóch węzłów. W momencie, gdy rozmiar pliku przekroczy maksymalny rozmiar pliku, który się może zmieścić w węźle sformatowanym, ale jest mniejszy od rozmiaru węzła niesformatowanego (4kB), zostaje przeniesiony do węzła niesformatowanego, a wskaźnik do niego wraz z jego rozmiarem zostanie zapisany w elemencie bezpośrednim.

Katalogi są zbiorem elementów katalogowych. Elementy te są z kolei zbiorem pozycji w katalogu. Każda taka pozycja składa się z nazwy pliku i jego klucza.
Pierwszy element pliku lub katalogu zawiera informacje o tym pliku.
Wynika z tego, że ReiserFS również stosuje technikę dynamicznej alokacji i-węzłów, tyle że role i-węzłów przejęły w tym systemie elementy statystyczne.

Obsługa katalogów zawierających wiele plików

W systemie ext2 katalogi są przechowywane na dysku jako zwykłe pliki implementujące listę plików i katalogów wchodzących w skład danego katalogu. Aby znaleźć dowolną pozycję w katalogu trzeba, więc średnio przejrzeć połowę zawartości tego pliku. W przypadku katalogów zawierających tysiące plików i podkatalogów sposób ten jest berdzo mało wydajny.

Tak XFS, jak JFS i ReiserFS, wykorzystują strukturę B+-drzewa do opisu katalogu, osiągając znacznie krótsze czasy wyszukiwania pozycji wewnątrz katalogu.

Obsługa małych plików i katalogów

W ext2 każdy plik i katalog niezależnie od jego wielkości zajmuje jeden blok dyskowy. Powoduje to fragmentację wewnętrzną i w związku z tym nieefektywne wykorzystanie miejsca na dysku

XFS i JFS pozwalają przechowywać małe pliki i katalogi wewnątrz i-węzłów opisujących te pliki. Zmniejsza to liczbę potrzebnych dostępów do dysku potrzebnych do odczytania pliku oraz zmniejsza stopień fragmentacji wewnętrznej dysku.

ReiserFS pozwala w jeszcze większym stopniu ograniczyć fragmentację wewnętrzną. Umożliwia on bowiem przechowywanie w jednym bloku ogonów różnych plików. Dzięki temu rozwiązaniu ReiserFS doskonale nadaje się do zastosowań, w których występuje wiele plików o bardzo małych rozmiarach (znacznie poniżej rozmiaru bloku dyskowego). Opcja łączenia w jednym bloku ogonów wielu plików powoduje dość znaczny spadek wydajności systemu, dlatego można ją wyłączyć montując ReiserFS-a z opcją -notail.

Księgowanie

System Linux w bardzo szerokim zakresie korzysta z buforowania operacji dyskowych; osiąga on dzięki temu doskonałą wydajność. Powoduje to jednak, że w przypadku awarii systemu zmiany nie zapisane na dysk, a będące wyłącznie w buforze zostaną utracone. Może to powodować nie tylko stratę informacji, lecz również, jeśli awaria wystąpiła w trakcie modyfikacji metadanych systemu plików (takich jak np. modyfikacja struktury katalogu), utratę spójności logicznej danych na dysku. Do przywracania spójności systemowi służy polecenie fsck, które musi przejrzeć wszystkie metadane znajdujące się na partycji w poszukiwaniu takich, które mogły utracić spójność. W przypadku dużych serwerów zawierających kilkaset gigabajtów lub terabajty danych operacja taka może zająć niedopuszczalnie dużo czasu.
To było główną przyczyną, dla której systemy plików zaopatrzono w wywodzącą się z systemów bazodanowych technologię księgowania. Opiera się ona na rejestrowaniu zmian zachodzących w systemie w pliku dziennika. W przypadku awarii wystarczy przejrzeć taki plik i odtworzyć wszystkie dokonane zmiany.

XFS oferuje asynchroniczny model księgowania metadanych. Oznacza to, że modyfikacje metadanych nie są od razu zapisywane do dziennika, lecz są przez pewien czas przechowywane w buforze dziennika w pamięci. Zapewnione jest przy tym, że żadne dane nie zostaną zapisane na dysk zanim nie zostanie zapisana do dziennika na dysku informacja o tych zmianach. Dzięki asynchronicznemu dziennikowi, informacje o kilku zmianach danych mogą być zapisane do dziennika w jednej operacji dyskowej. Zwiększa to wydajność księgowania, ale powoduje, że po awarii systemu może nie być możliwe odtworzenie wszystkich wykonanych zmian metadanych.

Domyślnym modelem księgowania zastosowanym w systemie JFS jest model synchroniczny, w którym każda zmiana metadanych jest od razu notowana w dzienniku. Dzięki temu można być pewnym tego, że jeśli operacja modyfikacji metadanych taka, jak np. unlink() zwróci nam pozytywny wynik, to informacja o tej modyfikacji zostanie zachowana w systemie nawet jeśli zaraz po wykonaniu tej operacji będzie miała miejsce awaria systemu. Ponieważ synchroniczne księgowanie jest znacznie mniej wydajne od księgowania asynchronicznego, obecnie JFS oferuje również usługę asynchronicznego księgowania.

ReiserFS podobnie jak XFS oferuje asynchroniczny model księgowania.

Podsumowanie

System plików XFS został zaprojektowany przez firmę Silicon Graphics Inc. z przeznaczeniem do użycia go w systemie operacyjnym IRIX (wersja UNIX-a firmy SGI). Na tymże systemie udostępnia on dodatkowe usługi niedostępne pod Linuksem. Najciekawszym z nich jest udostępnienie procesowi możliwości zarezerwowania dla siebie pasma dostępu do podanego pliku, o podanej szerokości (w bajtach na sekundę). Znajduje to zastosowanie na przykład przy obróbce plików multimedialnych, gdzie proces musi mieć stały szybki dostęp do plików, aby umożliwić edycję ich na bieżąco.
Z powodu różnic architektonicznych między IRIX-em a Linuksem, przy przenoszeniu XFS-a na Linuksa, wprowadzono dodatkową warstwę logiczną pomiędzy XFS-em a wirtualnym systemem plików Linuksa, tłumaczącą odwołania do VFS-a IRIX-a na odwołania do VFS-a Linuksa.

JFS został stworzony przez firmę IBM początkowo z przeznaczeniem dla systemu operacyjnego AIX, następnie został przeniesiony na OS/2, a wkrótce potem na Linuksa.

ReiserFS początkowo był autorskim projektem Hansa Reisera. jednak obecnie rozwój tego systemu sponsorują komercyjne firmy takie jak np. SuSE jak i agencja departamentu obrony USA do spraw zaawansowanych projektów badawczych (DARPA).
ReiserFS jest używany jako domyślny system plików w dystrybucji SuSE Linux.

Z przeprowadzonych testów wydajnościowych wynika, że wymienione tu systemy oferują podobną wydajność, porównywalną z wydajnością ext2, podczas obsługi plików o średniej wielkości, ReiserFS wypada lepiej w przypadku małych plików, natomiast traci w przypadku plików dużych.
Zauważmy jednak, że wszystkie te systemy są ciągle aktywnie rozwijane i ich wydajności będą ulegały zmianie (ReiserFS i XFS zapowiadają nowe rozwiązania współpracujące z jądrami serii 2.6). Wiele z usług oferowanych przez opisywane tu systemy plików (katalogi w postaci B-drzew, małe pliki i katalogi zapisywane wewnątrz i-węzłów) jest postulowanych do wprowadzenia również w systemie ext2.