Do spisu treści
6.3.1 Opis systemu plików EXT2 na dysku.
Spis tresci
System plików Ext2 na dysku składa się z wielu grup bloków dyskowych,
przy czym pojedynczy blok uważamy za podstawową fizyczną jednostkę
objętościową danych.
Wielkość bloku dyskowego jest stała w ramach całego systemu plików.
Stałe ograniczające rozmiar bloku dyskowego znajdują się w pliku
nagłówkowym:
include/linux/ext2_fs.h
#define EXT2_MIN_BLOCK_SIZE 1024
#define EXT2_MAX_BLOCK_SIZE 4096
/* oczywiście bajtów */
Oczywiście nie trudno zauważyć, iż są to potęgi 2 oraz,
że dodatkowym pośrednim rozmiarem jest 211 bajtów czyli 2048.
Jak wspomnieliśmy fizycznie bloki na dysku położone są w grupach.
Struktura ta wygląda następująco.
Rys.1 Fizyczna struktura systemu plików na dysku.
Boot Sektor
|
Bloki Grupy 1
|
Bloki Grupy 2
|
. . . . . . . . . .
|
Bloki Grupy N
|
W systemie EXT2 można jednak wyróżnić logiczne grupy bloków,
które nie zupełnie pokrywają się z fizycznymi grupami.
Na logiczną grupę składają się:
Grupa bloków na poziomie logicznym
- deskryptor grupy (32 bajty)
- blok z mapą zajętości bloków danych (1 blok dyskowy)
- blok z mapą zajętości i-węzłów ( 1 blok dyskowy)
- bloki z tablicą i-węzłów
- bloki danych
Natomiast każda grupa fizyczna zawiera informacje o jednej grupie
logicznej, a ponadto pewne informacje o całym systemie plików.
Rys.2 Fizyczna grupa bloków na dysku.
Blok Identyfikacyjny
|
Bloki Deskryptorów Systemu plików |
Blok z Bitmapą Zajętości bloków danej Grupy |
Blok z Bitmapą Zajętości i-węzłów danej Grupy |
Tablica I-węzłów
|
Bloki Danych
|
Grupa fizyczna zawiera blok z mapą zajętości bloków danych,
blok z mapą zajętości tablicy i-węzłów, bloki z tablicą i-węzłów,
bloki danych - określonej grupy logicznej oraz redundantną kopię
bloku identyfikacyjnego (ang. super block, którego
strukturę ext2-super_block opisano w paragrafie dotyczącym
struktur danych) i bloki z deskryptorami wszystkich grup
logicznych systemu plików.
Przy czym kolejność występowania tych bloków jest taka jak na rys. 2.
Podczas inicjalizowania systemu, do pamięci wczytywane są bloki
z deskryptorami grup logicznych z pierwszej grupy fizycznych bloków
dyskowych, gdy nie występują sytuacje wyjątkowe system nie korzysta
z bloków z deskryptorami i z bloku identyfikacyjnego z pozostałych
grup fizycznych.
Deskryptor grupy opisuje struktura ext2_grup_desc, która zajmuje
32 bajty, co oznacza, że gdy blok dyskowy ma pojemność 1024 bajty
to jeden blok zawiera 32 deskryptory grup logicznych.
( Do wniosków takich doszliśmy po lekturze Linux Kernel Hackers
Guide oraz analizie funkcji ext2-read-super(...) i get_group_desc())
Po analizie funkcji przydzielającej nowy blok dyskowy
ext2_new_block ( z pliku fs/ext2/balloc.c ) i podobnej funkcji
dla i-węzłów ext2_new_inode ( z pliku fs/ext2/ialloc.c )
doszliśmy do wniosku, iż bitmapy zajętości to po prostu tablice bitów,
przy czym jedna bitmapa zajmuje dokładnie jeden blok.
Konsekwencją tego jest wyliczenie maksymalnego rozmiaru grupy.
Mianowicie jeśli bloki są rozmiaru 1 KB tzn. 8096 bitów,
to pojedynczą mapą możemy opisać 8096 bloków - tyle ile bitów,
więc w takiej grupie logicznej możemy 8 MB na bloki z
danymi. Jeżeli natomiast bloki dyskowe są rozmiaru 4 KB to na bloki
z danymi mamy wówczas szczesnaście razy więcej miejsca czyli 128MB.
Podzielenie systemu plików na grupy bloków ma na celu zwiększenie
bezpieczeństwa oraz optymalizację zapisu danych na dysku.
Zwiększenie bezpieczeństwa jest uzyskane poprzez utrzymywanie
redundantnych informacji o systemie plików (blok informacyjny
oraz deskryptory grup) w każdej fizycznej grupie bloków.
Optymalizacja zapisu danych jest uzyskiwana poprzez algorytmy
przydziału nowych i-węzłów i bloków dyskowych.
Podczas przydziału i-węzeła plikowi, który jest katalogiem
wyszukiwana jest grupa z największą liczbą wolnych i-węzłów.
Jeżeli nie jest to katalog to zaczyna się szukać wolnego i-węzła
od grupy w której znajduję się i-węzeł katalogu tego pliku.
Dzięki czemu zwiększa się
prawdopodobieństwo, że i-węzły plików z danego katalogu leżą w tej
samej grupie a przez to, co się zaraz okaże również i
prawdopodobieństwo położenia bloków danych plików z danego katalogu
w jednej grupie bloków.
Wyszukiwanie wolnego bloku dyskowego zaczyna się od grupy w której
znajduję się i-węzeł pliku, przez co z dużym prawdopodobieństwem
bloki danych jednego pliku położone są w obrębie jednej grupy bloków
dyskowych.
Algorytmy przydziału i-węzłów i bloków danych powodują więc
ich równomierne rozłożenie w grupach oraz w miarę możliwości
spójne położenie bloków danych plików.
Bibliografia
- Pliki źródłowe Linuxa:
- linux/fs/ext2/balloc.c
- linux/fs/ext2/ialloc.c
- linux/include/linux/ext2_fs.h
- Projekt Linux
- Linux Kernel Hackers Guide
- Maurice J. Bach "Budowa systemu operacyjnego UNIX"
Autorzy: Adam Hlebowicz, Krzysztof Ostrowski, Piotr Kawczyński i
Maciej Zarzycki