System plików EXT2
Ext2, czyli Second Extended File System jest podstawowym i
najszerzej używanym systemem plików dla Linuxa. Jest bardzo
efektywny w typowych zastosowaniach, a równocześnie stosunkowo prosty.
Jest uważany za jeden z najlepszych "standardowych" systemów plików.
Ext2 powstał jako rozwinięcie systemu plików Ext, który z kolei
zastąpił używany we wczesnych wersjach Linuxa system Minix. Minix
narzucał dość poważne ograniczenia na nazwy plików (do 14 znaków) jak
i na rozmiar samej partycji (maksymalnie 64MB). Ext usunął te
ograniczenia, ale nie był wystarczająco wydajny (powodował dużą
fragmentację plików), a także nie zapamiętywał daty dostępu do pliku
ani daty zmiany metadanych pliku.
Główne cechy systemu Ext2
- Zapewnia wszystkie elementy systemu plików Unix (dowiązania
symboliczne, pliki specjalne, prawa dostępu...)
- Wysoka wydajność dzięki przeciwdziałaniu fragmentacji
(poprzez przydzielanie bliskich bloków oraz prealokację).
- Wydajny mechanizm dowiązań symbolicznych (opisany niżej)
- Stabilny i dobrze przetestowany (sam system plików, jak również
program naprawiający e2fsck)
- Dobrze zdefiniowany sposób dodawania rozszerzeń
- Niezależny od tworzącego systemu operacyjnego (wszystkie pola
wielobajtowe zapisane w standardzie little-endian)
- Maksymalny rozmiar partycji to 4TB, a pojedynczego pliku 2GB.
Maksymalna długość nazwy pliku: 255 znaków.
- Obsługa "dziurawych" plików (nieużywane bloki nie zostają
przydzielone).
Wady:
- Mało efektywna obsługa katalogów (choć użycie pamięci podręcznej
znacznie ją poprawia)
- Niska wydajność dla bardzo małych plików (rzędu kilkuset bajtów) - duże
straty na alokację i stosunkowo wolny dostęp
- Długotrwałe sprawdzanie systemu plików po niepoprawnym zamknięciu
systemu
Struktura systemu plików
Partycja systemu plików Ext2 podzielona jest na bloki o
rozmiarze 1024, 2048 lub 4096 bajtów (na niektórych architekturach do
8192 b).
Kolejne bloki połączone są w grupy, których rozmiar zależy od
wybranego rozmiaru bloku. Podział na grupy zwiększa lokalność danych
związanych z jednym plikiem, a co za tym idzie, przyspiesza dostęp do
nich. Grupy zostają ustalone statycznie podczas tworzenia systemu
plików.
Grupa:
Superblok |
Deskryptory grup |
Mapa bitowa bloków |
Mapa bitowa i-węzłów |
Tablica i-węzłów |
Bloki danych |
W oryginalnej wersji Ext2, w każdej grupie znajdował się
superblok, opisujący cały system plików, oraz deskryptory
grup, opisujące sumaryczne informacje o wszystkich grupach.
Miało to na celu przyspieszenie dostępu do tych informacji, a także
zabezpieczenie istotnych danych przed awarią dysku. W nowszej wersji
wprowadzono możliwość pominięcia kopii w niektórych grupach, aby
zmniejszyć ilość marnowanego miejsca. Kopie superbloku i deskryptorów
grup znajdują się wtedy w blokach o numerach 0, 1, oraz będących
potęgą 3, 5 lub 7.
Poza superblokiem i deskryptorami grup, identycznymi na całym dysku,
w skład grupy wchodzą:
- Mapa bitowa bloków: zajmuje pojedynczy blok, w którym każdy bit
odpowiada jednemu blokowi grupy. Bit ustawiony oznacza, że odpowiedni
blok jest zajęty
- Mapa bitowa i-węzłów: opisuje zajętość i-węzłów w tej grupie
- Tablica i-węzłów: bloki, w ramach których przydzielane są
metryczki plików (i-węzły). Liczba i-węzłów w ramach grupy
ustalana jest statycznie podczas tworzenia systemu plików
Superblok
Zawiera informacje o całym systemie plików, takie jak:
- Rozmiar bloku
- Liczby wszystkich oraz wolnych bloków i i-węzłów
- Stan systemu plików (czy został poprawnie zamknięty)
- Licznik zamontowań i data ostatniego sprawdzenia - pozwalają
wymusić sprawdzenie integralności danych co pewien czas
- Wersja systemu plików - zbiór 3 różnych kategorii rozszerzeń, w
zależności od stopnia wprowadznych przez nie niezgodności. Są to:
- COMPAT - zmiany należące do tej kategorii są zupełnie
przejrzyste dla starszych wersji
- RO_COMPAT - zmiany te nie powodują błędów przy odczycie,
ale zapis w takim systemie przez wersję nie obsługującą rozszerzenia
spowodowałby uszkodzenie danych. Stara wersja może używać takiej
partycji w trybie tylko do odczytu
- INCOMPAT - wprowadzone zmiany są na tyle poważne, że próba
użycia systemu plików przez starszą wersję może skończyć się błędem.
Normalnie używana jest podstawowa wersja superbloku z 1024-go bajtu
urządzenia. W przypadku jego uszkodzenia można użyć jednej z kopii.
Deskryptory grup
Jest to tablica rekordów, po jednym dla każdej grupy, opisujących
sumaryczne dane (m.in. liczbę wolnych i-węzłów i bloków).
Informacje te są używane podczas przydzielania bloków.
I-węzły
I-węzeł opisuje wszystkie atrybuty obiektu zapisanego w systemie
plików, poza jego nazwą. Są to:
- Dowiązania do bloków danych (12 bezpośrednich i po jednym
pojedynczo, podwójnie i potrójnie pośrednim)
- Prawa dostępu
- Właściciel (użytkownik i grupa)
- Typ obiektu i różne flagi
- Rozmiar obiektu i liczba używanych przez niego bloków
- Data dostępu, modyfikacji, zmiany metadanych i skasowania obiektu
- Liczba dowiązań (wpisów katalogu odwołujących się do tego i-węzła)
- Dodatkowe informacje (wersja, Access Control List,
Extended Attributes)
Istnieje kilka pól o podwójnym znaczeniu, zależnym od typu pliku,
a także pól zarezerwowanych do przyszłych zastosowań:
- Górna połowa 64-bitowego pola długości dla plików staje się
dowiązaniem do ACL katalogów (na razie żadne z tych
rozszerzeń nie jest zaimplementowane)
- Miejsca na rozszerzone, 32-bitowe pola właściciela i grupy
Specjalnie obsługiwane są dowiązania symboliczne. Jeśli nazwa
wskazywanego pliku nie jest dłuższa niż 60 znaków, to zamiast w
oddzielnym bloku zapisywana jest w samym i-węźle, na pozycjach
normalnie używanych jako wskaźniki do bloków (w sumie jest ich 15,
każdy po 4 bajty). Podobnie
zaimplementowane są pliki urządzeń - wtedy przechowywany jest numer
oznaczanego przez i-węzeł urządzenia. Używanie tej techniki daje
bardzo duży zysk, zarówno pod względem czasu dostępu, jak i zużywanego
miejsca. Planowane jest jej rozszerzenie na krótkie pliki.
Katalogi
Są zorganizowane jako standardowe pliki rekordów zmiennej długości.
Zapisane są więc w tej samej przestrzeni, co bloki zwykłych plików.
Każdy rekord zawiera pole określające jego długość, co pozwala
"przeskakiwać" nad dziurami powstałymi po usunięciu krótkich wpisów.
Poza tym rekordy zawierają nazwę pliku oraz numer jego i-węzła.
W nowszych wersjach systemu Ext2 także typ obiektu (plik, katalog,
plik specjalny, dowiązanie symboliczne) zapisywany jest w katalogu.
Pozwala to ograniczyć liczbę wczytywanych i-węzłów w operacjach
przeszukiwania katalogu. Niestety, użycie tej techniki wymaga wsparcia
programów trybu użytkownika, którego dotąd nie ma.
Obecnie używana implementacja katalogów nie jest zbyt efektywna, gdyż
opiera się właściwie na listach jednokierunkowych.
Ogranicza to używalną wielkość pojedynczego katalogu do 10-15
tysięcy wpisów. Już od pewnego czasu trwają prace nad zamianą
obecnie używanych list jednokierunkowych na tablice haszujące.
Pozwoliłoby to sprawnie używać katalogów o nawet 100 tys. do miliona
wpisów.
Dodatkowe funkcje
- Konfigurowalny (podczas tworzenia systemu) rozmiar bloku. Mniejsze
bloki powodują mniej strat na alokację, ale zwiększają narzut
związany z zarządzaniem nimi.
- Pewna część bloków oraz i-węzłów zostaje zarezerwowana dla
administratora. Poza względami bezpieczeństwa, pozwala to zmniejszyć
fragmentację
- Możliwość wymuszenia synchronicznego zapisu metadanych (struktur
opisujących pliki), jednak kosztem znacznego spadku wydajności
- Możliwość wybrania semantyki System V lub BSD podczas montowania
systemu. Różnią się one grupą do jakiej należą nowo tworzone pliki
(w BSD należą one do takiej grupy, jak nadkatalog, a w System V
dodatkowo sprawdzana jest flaga setgid)
- Bezpieczne usuwanie pliku - pliki z ustawioną odpowiednią flagą
zostają zamazane podczas kasowania tak, aby ich zawartości nie dało
się odczytać narzędziami do edycji dysków
- Pliki niezmienialne (immutable) - nie mogą zostać przez
nikogo zapisane ani usunięte
- Pliki tylko do dopisywania (append-only) - można zapisywać
jedynie na ich koniec