Nélkülözhetetlen segédprogram, de melyiket válasszuk? Mióta első nagyobb, 80 MB-os winchesteremet megvettem folyamatosan használok töredezettség-mentesítő, avagy defragmentáló programot. Eleinte DOS alatt, FAT fájl-rendszerhez, majd Windows NT alatt, az NTFS-hez. NTFS-hez csak az elmúlt egy-két évben kapható hatékony eszköz, viszont mára bővült a kínálat, így cikkünk - szakmai - útmutatót kíván nyújtani a megannyi alternatíva között.
Nélkülözhetetlen segédprogram, de melyiket válasszuk?

Már az elején felmerül a kérdés, hogy miért van szükség töredezettség-mentesítő programra. Itt valójában két használati szempontot lehet megkülönböztetni. Az első, amikor tudatosan a gyorsabb működés érdekében optimalizáljuk partíciónkon a fájlok elhelyezkedését, erre leginkább az NT kiszolgálók illetve a hozzáértőbb NT munkaállomás felhasználók esetén kerül sor, s itt nem mindegy, hogy milyen programot választunk. A másik eset a "nagytakarítás" esete, hogy jobban érezzük magunkat, ha rend van körülöttünk, így van ez gépünkkel is, tehát "rendet rakunk" egy segédprogrammal winchesterünkön. A végeredmény az egybefüggő fájl és szabad terület, ezt a fejlesztők - tán gúnyosan - "szép lemeznek" nevezik, pedig korántsem csak ennyi az elvárás egy töredezettség-mentesítő programtól.
  

1. kép - Speed Disk DOS-hoz, a régi ismerős
 DOS alatt a töredezettség mentesítés viszonylag egyszerű probléma, az operációs rendszer, a DOS (pl. MS-DOS 6.22-ig) kizárólagos joggal rendelkezik a számítógép felett. Továbbá nem kell a fejlesztőknek azzal törődniük, hogy különböző task-ok a töredezettség mentesítés során írni akarnának fájlokba, sőt mivel nincs operációs rendszer szinten beépített cache - fájl művelet gyorsító - még ezzel (ennek szinkronizálásával) sem kell a fejlesztés során bajlódni. Így viszonylag egyszerűen, közvetlen fizikai lemezműveletekkel a FAT fájl-rendszer egyszerűsége révén könnyen optimalizálható a töredezett fájl struktúra. DOS alatt legelterjedtebb a Symantec cég, Speed Disk programja volt (1. kép), mely számos verziót megélt. Ilyen program fejlesztése DOS alá oly annyira nem bonyolult feladat, hogy jártasabb rendszer-programozók nagyobb nehézségek árán viszonylag jó programokat fejleszthettek, így a fent nevezett Speed Disk mellett még számos cég adott ki ilyen programot. Nem így van ez a multi task-os operációs rendszereknél. Már a Windows 95 alá fejlesztett töredezettség-mentesítők készítése során jelentősen több probléma akadt, mint elődjénél, a DOS során. Mindemellett viszonylag jó és megbízható termékek láttak napvilágot, nagyrészt a FAT fájl-rendszer egyszerűségének köszönhetően. Persze érdemes megemlíteni, hogy ilyen, multi task-os környezetbe nagyrészt másmilyen algoritmusú, felépítésű töredezettség-mentesítő kell, bár ez a Windows 95/98 rendszereknél nem kellett, hogy elvárás legyen (révén nem kiszolgálók). Az igazi probléma a Windows NT operációs rendszer illetve az NT natív állomány rendszerének az NTFS-nek az elterjedésekor jelentkezett. Az NTFS-t eleve úgy tervezték, hogy lehetőség szerint minimalizálja a fájl töredezést, így sokan azzal érveltek, hogy nincs is szükség NTFS-hez töredezettség-mentesítőre. Őket és a kételkedőket az idő megcáfolta és kiderült, hogy talán jobban szükség van NTFS-hez a töredezettség-mentesítőkre, mint a jó öreg FAT-hoz.

Előző az NTFS fájl-rendszerről szóló írásunkbol, egyértelműen kiderül, hogy az NTFS "lelkét" alkotó MFT (Master File Table - Mester Fájl Tábla) lévén, hogy valójában ő is egy fájl, a fájlokhoz hasonlóan töredezhet. Így a partíció, a fájlok elérési adatait, illetve jellemzőit tartalmazó tábla hozzáférési ideje jelentősen nő, így lassítva az egész rendszert. Az NTFS fájl-rendszerű partíciók töredezettség mentesítésének szükségességét először az Executive Software ismerte fel, és még Windows NT 3.51-hez mutatta be töredezettség-mentesítő programját, a Diskeeper-t. Mivel a Windows NT már nem csak egy munkaállomás egyszerű operációs rendszere, hanem kiszolgálóké is, így még nagyobb jelentősége volt egy ilyen program fejlesztésének, hisz a géphez forduló nagyszámú felhasználók várakozási idejét is csökkentette az optimálisabb - egybefüggő - fájl elrendezés végett. Azonban koránt sem volt ilyen egyszerű az NT-s töredezettség-mentesítő programok fejlesztése: az NTFS az egyik legösszetettebb és legbonyolultabb fájl-rendszer. Beépített cache-sel rendelkezik, így számos rendszerstruktúrát, fájlt és jellemzőt memóriában tart, nem is beszélve a megannyi egyidőben történő fájl hozzáférésről, módosításról. Az NTFS a Windows NT 3.51 során nem rendelkezett beépített cluster mozgató eljárással, így eleinte az Executive Software saját NTFS és FAT fájl-rendszer vezérlő-programokat adott Diskeeper programuk mellé. Ez a továbbiakban a service pack-ek (javítócsomagok) kiadása során számos kalamajkával járt, részint a Diskeeper lecserélte az újabb NTFS vezérlőt, vagy fordítva, ami mind a felhasználók, mind a Microsoft részére számos kellemetlenséggel járt.

A Windows NT 4.0 fejlesztése során nyílt lehetőség arra, hogy az Executive Software és a Microsoft bemutassa a töredezettség mentesítés beépített támogatását. A Microsoft operációs rendszerekhez hűen itt is csak a lehetőség volt adott, konkrét segédprogramot nem mellékeltek az NT rendszerekhez. Még egy egyszerűbb, "butított" verzió sem került a Windows NT 4.0 mellé, úgy ahogy ezt az MS-DOS 6.2-ben a Microsoft megtette a defrag (Symantec, a Speedisk egyszerűsített változata) programmal. A felhasználók nyomására a Windows 2000-ben (Windows NT 5.0) már lesz egy egyszerű defragmentáló program (a Diskeeper lebutított változata).

Az NT defragment API-ja
  

2. kép - Fájl és szabad hely töredezés
A Windows NT 4.0 töredezettség mentesítés támogatása a fájl-rendszer vezérlő (FSCTL: file system control) parancsokon alapul. A továbbiakban ezen parancsokat, illetve funkciókat tekintjük át, hogy tisztában legyünk az NTFS partíciók töredezettség mentesítésének nehézségeivel. Az alábbi négy FSCTL-t mutatták be a töredezettség mentesítéshez: FSCTL_GET_VOLUME_BITMAP, FSCTL_GET_RETRIEVAL_POINTERS, FSCTL_MOVE_FILE, FSCTL_READ_MFT_RECORD. Ezek a funkciónevek nem feltétlenül a Microsoft által használatos hivatalos nevek - ugyanis ezek nem közismertek -, viszont jól megvilágítják a parancsok funkcióit. Az első három mind NTFS illetve mind FAT fájl-rendszerek esetén használható, míg a negyedik az MFT révén nyílván csak NTFS környezetben nyeri el funkcióját. Ez a parancs lehetővé teszi, hogy nagyon pontos információkat szerezzünk egy fájlról, illetve a partíció fájljairól, annak elhelyezkedéseiről, viszont nem dokumentált NTFS adatstruktúrák is szükségesek használatához, így nem foglalkozunk vele. A maradék három FSCTL viszont tökéletesen elegendő ahhoz, hogy úgy fejlesszenek - fejlesszünk - töredezettség-mentesítő programot, hogy nem ismerjük sem az NTFS adatstruktúrákat, sem az adott pillanatban módosított vagy a cache-elt állományokat. Ez nagyon fontos szerepet játszott az NTFS Defragment API kialakítása során. Csupán két fogalmat kell ismerni az NTFS filozófiájából: LCN-nel jelölik a partíció adott logikai cluster-ét, pl. LCN 1234, a 1234. logikai cluster (LCN: Logical Cluster Number). Míg az egy fájlon belüli cluster-eket VCN-nel, az-az virtuális cluster számmal (VCN: Virtual Cluster Number) jelölik. A VCN 0 a fájl első (a nulladik) cluster-ét jelöli, mely fenti példánkban az LCN 1234-ben található.

A FSCTL hívásokat a Windows NT kernel módú könyvtára az NTDLL.DLL fájl (\WINNT\SYSTEM32\) szolgálja ki számos más, pl. operációs alrendszeri funkcióval együtt. A fent megnevezett FSCTL-ek közül legelőször az FSCTL_GET_RETRIEVAL_POINTERS parancsot használják a töredezettség mentesítő programok, ennek segítségével lehet lekérdezni egy adott fájl elhelyezkedését, az elfoglalt cluster-ek listáját. A visszaadott lista megmutatja, hogy a fájl melyik VCN-éhez melyik LCN tartozik. A második FSCTL parancs a FSCTL_GET_VOLUME_BITMAP, melynek segítségével a partíció üres - illetve foglalt - cluster-eit kérdezhetjük le. Ez is fontos parancs, hisz tudni kell, hogy hova lehet majd mozgatni más fájl cluster-ét. A visszaadott bit tömbben az 1-es bitek a foglalt, míg a 0-s bitek a szabad cluster-eket jelentik. Végezetül most, hogy már mind a fájlról és mind a partíció üres cluster-eiről begyűjtötte programunk a szükséges információkat nekiállhatunk töredezettség mentesíteni partíciónkat, illetve fájljainkat. (Hogy valójában mit is töredezettség mentesítünk: a fájlt, vagy a partíciót? Bonyolult kérdés: valahol az arany középutat kell a töredezettség-mentesítő algoritmusnak megcéloznia, ugyanis mindkettő megoldásnak van hátránya.) Az FSCTL_MOVE_FILE parancs hivatott az adott fájl, adott cluster-einek a szabad helyre történő átmozgatására. A parancs csak 4 KB-os vagy kisebb cluster méretű partíciókon használható így, ha a FORMAT paranccsal 4 GB-osnál nagyobb méretű partíciót készítünk biztosan nem működik ez a parancs, és ezzel együtt számos defragmentáló program. A másik fontos dolog, hogy a - move-file - parancs által felszabadított hely nem használható azonnal egy másik cluster "odamozgatására", ugyanis a véglegesítés, csak a határpont (checkpoint) képzésekor történik, ami kb. minden 4-5 másodpercben zajlik le. A fájlok töredezettség mentesítése során fontos, hogy a másik folyamat (program) által kizárólagosra megnyitott fájlt nem lehet töredezettség mentesíteni. Így sem a paging file-t, sem a registry-t, sem az NTFS adatstruktúrákat, és főképp az MFT-t nem lehet ezekkel a szabványos parancsokkal töredezettség mentesíteni. Továbbá ezt a fájl mozgató rutint úgy írták meg, hogy csak adat fájl cluster-eket tud mozgatni, könyvtár vagy meta-adatokat nem, így a könyvtárak sem töredezettség mentesíthetőek ezzel a szabványos - és igen megbízható ! - eljárással.

Ebből a rövid elméleti összefoglalóból talán az tűnik ki, hogy milyen egyszerű töredezettség-mentesítő programot írni. Valóban, tényleg egyszerű olyan programot írni, mely a cluster-eket ide-oda mozgatja, hisz ezt már egyszerűen megtehetjük az alábbi példaprogrammal. Viszont a felsorolt számos buktató mellett ott van a legfőbb probléma, hogy igen jó, hatékony töredezettség-mentesítő algoritmust (algoritmusokat) kell kifejleszteni. Ezen algoritmusoknak egyszerre kell: a mind a fájlokat, mind a partíciót és nem utolsó sorban az üres helyet töredezettség mentesíteni. (Ugyanis a szabad hely is töredezve van a partíción, itt egy kis szabad hely, majd 456 cluster-nyivel arrébb egy kicsit nagyobb. A töredezett hely pedig a későbbiekben növeli a fájl töredezést. Lásd 2. kép.) Továbbá olyan algoritmusokat kell kifejleszteni melyek nem csak hatékonyak, hanem a fájl mozgatások számát is minimalizálni kell, avagy ezzel a töredezettség mentesítési időt csökkenteni. A probléma - az algoritmus - összetett, így nem csoda, hogy neves szoftverházak is csak "köztes" megoldásokat tudtak kifejleszteni. A "köztes" megoldások alatt értem a nem eléggé hatékony - de funkcióját jól ellátó - algoritmusokat (pl. Diskeeper), továbbá az egyszerűbb algoritmusok használatát nem szabványos - nem a fentiekben ismertetett - parancsokkal (pl. Speed Disk), melyeknek megbízhatósága elvileg megkérdőjelezhető.

Itt megtalálható Mark Russinovich töredezettség-mentesítő példaprogramja (vagy itt: http://www.sysinternals.com/defrag.htm) és forráskódja, melyet a szakmaibb részletek iránt érdeklődő Olvasóink áttanulmányozhatnak. A példaprogram a help-jében megadott módon le tudja kérdezni a partíció üres cluster-einek listáját, az adott fájl helyfoglalását, illetve át tudja ezekkel a szabványos hívásokkal mozgatni a fájl egyes - vagy összes - cluster-eit. (A program nyugodtan kipróbálható, hibát nem okozhatunk vele, hisz a szabványos FSCTL hívásokat használja!)

Töredezettség-mentesítők a gyakorlatban

Két neves cég töredezettség-mentesítő programját teszteltük számos körülmény között. A teszt a probléma sokrétűsége miatt egészen sokáig elhúzódott, így sikerült a programokat mind hétköznapinak nevezhető, mind szélsőséges körülmények között "vizsgáztatni". A programok tesztelésekor a fent ismertetett elméleti rész fontos volt, ugyanis tudni kellett értékelni egyes programok szolgáltatását: "nem mind arany, ami fénylik" állítja bölcsen a közmondás. A két töredezettség-mentesítő program a nem rég megjelent (és hazánkban a cikk megjelenésekor már kapható) Executive Software cég Diskeeper 5.0 (DK5) illetve a Symantec cég Speed Disk 5.0 (SD5) verziójú programja. Mindkét program számos fejlődésen ment keresztül, viszont a közös 5.0-s verzióra teljesen kettévált működési elvük, melyről az alábbiakban szót ejtünk. A két tesztelt program mellett létezik még másik három - idehaza tudomásom szerint nem kapható - töredezettség-mentesítő, a PerfectDisk NT, O&O Defragmentation, és a VoptNT. A Windows NT-s világban idáig leginkább a Diskeeper program volt elterjedve - mi is ezt ismertük, a 4.0-s változatot -, bár a konkurens termékek újításai ezt megváltoztathatják.