Oprogramowanie
Artykuł
Robert Multan, Poniedziałek, 11 kwietnia 2011, 22:10

System plików

Korzystanie z systemów z rodziny Linux niechybnie wiąże się z poznaniem nowych systemów plików. NTFS i FAT, znane z Windowsów, a nawet MS-DOS, chociaż są obsługiwane przez jądro, nie mogą być wykorzystywane na partycji systemowej z Linuksem. Każdy OS ma specyficzne dla siebie systemy plików. W przypadku produktów Microsoftu są to: FAT16, FAT32, NTFS; FreeBSD – FFS i UFS; Haiku OS – BFS; Mac OS X – HFS+. W nowoczesnych systemach linuksowych jest to najczęściej ReiserFS, ext3 lub ext4, któremu przyjrzymy się bliżej.

Generalnie system plików jest wykorzystywany przez system operacyjny do organizowania, zapisywania i odczytywania plików z danego urządzenia. Dobry system plików powinien być optymalny pod względem wykorzystania dostępnej powierzchni i szybkości dostępu do danych, a w razie ewentualnej awarii powinien zapewnić mechanizmy pozwalające zminimalizować uszkodzenia danych. Dzięki różnym systemom użytkownik nie musi przejmować się umiejscowieniem plików na powierzchni nośnika, bo zapewniają one pewną logiczną strukturę, którą najczęściej jest znane wszystkim drzewo katalogów. Dzięki niemu nikt nie musi zapamiętywać, jaki adres bloku czy sektora ma jego ulubiony film przyrodniczy.

Wyraźną różnicą w stosunku do systemów z rodziny Microsoft Windows jest charakterystyczna struktura katalogów. Zamiast oddzielnych liter dla każdej partycji czy każdego urządzenia w Linuksie mamy do czynienia ze strukturą pojedynczego drzewa, którego korzeń (ang. root) jest oznaczony znakiem /. W tym miejscu instalowany jest system operacyjny, wszystkie inne katalogi są podrzędne względem korzenia. Pozostałe partycje i urządzenia można „zamontować” (podobnie jak w nowszych wydaniach systemu Windows) praktycznie w dowolnym miejscu struktury katalogów, jednak zwyczajowo punkty montowania umieszcza się w katalogu /mnt bądź /media.

Charakterystyczną cechą wszystkich systemów uniksowych (a więc w szczególności tych wyposażonych w jądro Linux) są prawa dostępu. Każdy obiekt znajdujący się w strukturze katalogów ma właściciela, przynależną grupę oraz nadane uprawnienia, reprezentowane najczęściej przez trzy cyfry z zakresu 0 do 7. Wartości te oznaczają prawa dostępu dla właściciela pliku, przypisanej mu grupy oraz pozostałych użytkowników. Każda cyfra to suma nadanych obiektowi praw dostępu. I tak prawo odczytu ma wartość 4, zapisu – 2, wykonania – 1. Jeżeli więc dany plik ma uprawnienia reprezentowane przez ciąg 750, oznacza to:

  • pełne prawa dostępu dla właściciela obiektu: odczyt, zapis, wykonanie (4 + 2 + 1 = 7),
  • dla przypisanej grupy prawa do odczytu i wykonania (4 + 1 = 5),
  • dla pozostałych użytkowników – brak uprawnień dostępu.

W przeciwieństwie do systemów Windows o tym, czy dany plik jest wykonywalny, nie decyduje jego rozszerzenie, a nadany mu atrybut. W przypadku katalogu bit wykonywalności oznacza możliwość wejścia do niego i przeglądania jego zawartości.

Kliknij, żeby powiększyć

Ważną cechą wszystkich linuksowych systemów plików są i-węzły (ang. inodes). Są to specjalne struktury danych, w których przechowywane są informacje o prawach dostępu danego pliku, identyfikator jego właściciela i przynależnej grupy, typ (zwykły plik, dowiązanie symboliczne, urządzenie itp.) oraz wiele innych. Każdy znajdujący się na dysku plik i katalog ma swój własny, unikatowy numer identyfikacyjny (można go uzyskać, korzystając z polecenia ls -i). Wszystkie i-węzły są przechowywane w wydzielonym obszarze partycji o stałym rozmiarze, wynoszącym z reguły 1% powierzchni.

Przyjrzymy się teraz ext4 – ulepszonej wersji powszechnie stosowanego ext3. Czwarta wersja tego systemu została zaprojektowana tak, by być wstecznie kompatybilną z poprzednikiem, dzięki czemu partycje sformatowane w ext4 można montować w systemie z jądrem z obsługą ext3 kosztem utraty części funkcjonalności (na przykład „ekstentów”). W stosunku do ext3 wydłużone zostały (z 32 do 48 bitów) adresy bloków, co zwiększa teoretyczny limit rozmiaru pojedynczej partycji z 16 terabajtów (232 * 4 kB) do 1 eksabajta (248 * 4 kB) przy blokach o rozmiarze 4 kB.

W tradycyjnym systemie plików dane – w postaci ciągów zer i jedynek – są organizowane na powierzchni dysku twardego w bloki o stałym rozmiarze, na przykład 4 kB, z których każdy ma własny adres. Każdy znajdujący się na nośniku plik ma przyporządkowaną listę bloków, które zajmuje, wraz z ich adresami. Ta metoda (zwana mechanizmem bezpośredniego adresowania bloków) dość dobrze sprawdza się w przypadku przechowywania dużej liczby niewielkich plików, jednak przy większych rozmiarach pojedynczych zbiorów okazuje się nieoptymalna, bo pojedynczy zbiór wymaga przechowywania długiej listy odpowiadających mu bloków. W ext4 ta metoda została zastąpiona przez tak zwane ekstenty, czyli obszary bloków danych. Pojedynczy ekstent może w przypadku ext4 mapować do 128 MB ciągłej przestrzeni w pojedynczym 4-kilobajtowym bloku, dzięki czemu znacznie poprawia się prędkość odczytu dużych plików oraz zmniejsza fragmentacja danych. Informacje o ekstentach są przechowywane w strukturze i-węzłów, z których każdy może zawierać do 4 ekstentów. Gdy plik jest reprezentowany przy użyciu większej ich liczby, używa się H-Drzew.

Nowoczesne systemy plików (takie, jak: ext3, ext4, ReiserFS, HFS+) również zostały wyposażone w mechanizm znacznie poprawiający spójność danych w razie awarii, zwany księgowaniem (ang. journaling). Zmiany w systemie plików, takie jak ich tworzenie, kopiowanie i usuwanie, z reguły wymagają kilku oddzielnych operacji wykonywanych „transparentnie” dla użytkownika. Przykładowo usunięcie pliku wymaga dwóch kroków:

  • usunięcia wpisu ze struktury plików,
  • oznaczenia odpowiadającego mu i-węzła i zajmowanej przez niego przestrzeni na mapie wolnych bloków jako pustych.

Jeżeli pomiędzy pierwszym a drugim krokiem wystąpi awaria (przerwa w dostawie zasilania czy błąd krytyczny), usunięty ze struktury plików obiekt wciąż będzie miał swój i-węzeł.

W przypadku systemu plików bez księgowania wykrywanie tego typu niespójności wymaga sprawdzenia kolejno wszystkich wpisów tablicy alokacji plików i porównania z odpowiadającymi im i-węzłami. Przy dużym rozmiarze partycji lub/i względnie małej prędkości odczytu może to zająć dużo czasu.

W systemie plików z księgowaniem pewna przestrzeń partycji jest przeznaczona na tak zwany dziennik, w którym zapisywane są wszystkie zmiany w strukturze plików, zanim zostaną faktycznie wykonane. Dzięki temu w razie pojawienia się niespójności naprawa polega na prześledzeniu kolejnych wpisów w dzienniku i wykonaniu krok po kroku zapisanych czynności. Z tego powodu poszczególne wpisy muszą mieć charakter niepodzielny.

Często powtarzane jest zdanie o tym, że linuksowe systemy plików – w szczególności ext3 – w ogóle nie podlegają fragmentacji. To nieprawda, bo chociaż został on zaprojektowany tak, by minimalizować to zjawisko, są sytuacje, w których nie da się jej uniknąć, jak choćby powolny zapis dużych plików bez uprzedniej alokacji całej potrzebnej przestrzeni (w tego typu operacjach lubuje się Vuze, klient sieci BitTorrent, znany niegdyś jako Azureus). Co ciekawe, od pojawienia się specyfikacji systemu ext3 w 2001 roku nie powstało narzędzie do defragmentacji tego typu partycji. Jednym ze sposobów jej przeprowadzenia jest konwersja na leciwy ext2 i skorzystanie z narzędzia e2defrag, które wymaga zamontowania partycji w trybie tylko do odczytu (defragmentacja offline), co w szczególnych przypadkach może wiązać się z utratą danych. Z drugiej strony konstrukcja systemu ext4 poza jeszcze lepszymi mechanizmami unikania fragmentacji (ekstenty, opóźniona alokacja) pozwala na jego defragmentację w trybie online, bez konieczności jego odmontowywania. Podsumowując, fragmentacja w przypadku linuksowych systemów plików występuje, ale w porównaniu z FAT i NTFS jest to zjawisko na tyle marginalne, że przy normalnym wykorzystaniu partycji nie ma powodu, by zaprzątać sobie nim głowę.

Ocena artykułu:
Ocen: 27
Zaloguj się, by móc oceniać
Forum
Facebook
Ostatnio komentowane