Chapter 10. Walka z fragmentacją

Systemy plików NTFS i ext3 mają różne strategie walki z fragmentacją plików na dysku (czyli zajmowaniem przez pliki wielu wzajemnie niesąsiednich grup bloków czy klasterów). Działanie Ext3FS można porównać do zapobiegania, a NTFS - skutecznego leczenia.

  1. ext3 wykorzystuje dokładnie te same metody, co ext2. System ten stosuje metodę prealokacji bloków, która polega na tym, że na prośbę o powiększenie wielkości pliku stara się mu przydzielić większą liczbę kolejnych bloków (konkretniej 8), niż potrzebuje. Prealokowane bloki są tylko zarezerwowane w bitmapie przydzielonych bloków i przy kolejnej prośbie o powiększenie wielkości pliku mogą zostać wykorzystane - zmniejsza to istotnie fragmentację danych.

    Drugą strategią wykorzystywaną przez ext3 jest przydzielanie nowych bloków pliku w pobliżu już istniejących, a przynajmniej w tej samej grupie bloków. Najpierw próbuje więc przydzielać następujący po ostatnim przydzielonym blok danych, w drugiej kolejności szuka wolnego bloku danych w niedużej odległości 64 od najbardziej pożądanego, wreszcie stara się wyszukać w tej samej grupie bloków, a w ostateczności w innej. Nowe bloki są przydzielane, w miarę możności, w tej samej grupie, co odpowiadający im i-węzeł.

    Ze względu na bardzo dobrze spisujące się strategie przeciwko fragmentacji danych, kwestię użyteczności defragmentatora w systemach plików ext od dawna uważano za mało istotną. W ext2 istnieje narzędzie defragmentacyjne e2defrag, ale niestety nie daje się go użyć bezpośrednio pod ext3, bez chwilowej konwersji na ext2.

  2. NTFS z kolei nie stosuje tak skutecznych strategii antyfragmentacyjnych. Jedyną używaną w nim strategią jest rezerwowanie specjalnego obszaru na dysku dla MFT (tak zwana MFT zone - strefa MFT), z którego klastry są przydzielane zwykłym plikom tylko wtedy, kiedy nie ma już miejsca w pozostałej części woluminu (zapobiega to fragmentacji newralgicznej struktury danych NTFS).

    Ze względu na to, w NTFS istnieją dobre narzędzia defragmentujące. Z jednej strony system plików udostępnia API dla obcych programów defragmentujących:

    • FSCTL_GET_VOLUME_BITMAP - zwraca mapę wolnych i używanych klastrów

    • FSCTL_GET_RETRIEVAL_POINTERS - zwraca mapę klastrów używanych przez poszczególne pliki

    • FSCTL_MOVE_ FILE - odpowiada za przenoszenie plików.

    NTFS dostarcza także własnego narzędzia do defragmentacji (\Windows\System32\Defrag.exe). W Windows 2000 mogło być używane tylko w trybie okienkowym, a w Windowsach XP i 2003 Server może być uruchamiane także w trybie tekstowym, a także o wybranych przez użytkownika porach. Program nie umożliwia takich funkcjonalności, jak wyłączanie z defragmentacji pewnych plików i katalogów czy podawanie na koniec działania szczegółowego raportu - takie możliwości oferuje wiele komercyjnych defragmentatorów.

    W Windowsie 2000 defragmentator posiada wiele niedociągnięć: niemożność defragmentacji metadanych NTFS, takich jak MFT czy przenoszenia części plik, które przekraczają 256-kilobajtową granicę w ramach pliku (ze względu na wykorzystanie menedżera cache'u). W Windowsie XP i 2003 Server te ograniczenia zostały przezwyciężone, a jedynym pozostającym jest niemożność defragmentacji plików związanych ze stronicowaniem i plików z logami NTFS-a.