Partícionálás

A PC-k merevlemezén (ha pl. DOS lemezként van formázva,) 2 boot szektor található, szemben pl. a hajlékony lemezzel, ahol csak egy. A fő boot szektor a lemez fizikailag első szektora (0-ás cilinder, 0-ás fej, 1-ső szektor, a továbbiakban 0/0/1), szokás MBR-nek is nevezni (Master Boot Record). Ez az 512 byte-os szektor tartalmaz egyrészt egy Intel x86 gépi kódú betöltőprogramot, másrészt a szektor végén egy 4-szer 16 byte-os táblázatot, amit két byte, 0x55 és 0xAA zár le (Megjegyzés: a 0x__ jelölés 16-os számrendszerben leírt számot jelent). Ez a 64 byte-os táblázat a partíciós tábla.

A partíciós táblázat segítségével a merevlemezt eredetileg maximum 4 tartományra, partícióra lehetett osztani. Ezek a partíciók tartalmazhatnak akár egyforma, akár különböző operációs rendszerekhez tartozó lemezterületet. A lemezt akkor is érdemes lehet több részre partícionálni, ha csupán egyetlen operációs rendszert használ rajta az ember, erről esetleg később még írok. (Illetve ha valakinek van kedve írni, vagy már létező link-je van, szóljon)

A partíciós bejegyzések felépítése

A táblázat egy 16 byte-os bejegyzése a következő adatokat tartalmazza:

Megjegyzések:

  1. A táblázatban az adatok a fenti sorrendben találhatóak
  2. A zárójelben lévő számok az adat méretét adják byte-ban
  3. A cilinder/fej/szektor (C/F/S) cím fej,szektor,cilinder sorrendben szerepel a táblázatban, 8,6,10 bitként kódolva (ahol a 10 bites cilindercím alsó 8 bitjét a harmadik byte adja, felső 2 bitjét pedig a második byte legnagyobb helyiértékű két bitje)

Első ránézésre látszik, hogy a táblázat meglehetősen redundáns: Ugyanaz az adat, a partíció kezdete, kétféleképpen is meg van adva: C/F/S címként, illetve (relatív) szektorcímként is. A partíció végének C/F/S címe is egyértelműen meghatározza a partíció méretét, ami ennek ellenére meg van adva. Ezeknek a mennyiségeknek ugyanazt az adatot kell eredményezniük, egyébként a bejegyzést a különféle operációs rendszerek illegálisnak veszik, és figyelmen kívül hagyják.

C/F/S címmel csak az első 1024 cilinderen lévő (pl. 504 MegaByte-ig, illetve módosított geometria esetén tipikusan 1 GigaByte-ig, maximum 7.8 GigaByte-ig terjedő) partíciókat adhatunk meg, viszont a partíciós táblában szintén szereplő szektorcímmel ennél sokkal nagyobb a korlát: 2 TeraByte (2048 GigaByte). Ezért az OS/2 és a Linux csak a szektorcímet használja ezekből az adatokból (hiszen semmi sem köti őket a BIOS C/F/S korlátaihoz), és a "messzi" partíciók kezdő illetve befejező C/F/S címeként a partíciós táblában 1023/xx/yy (az utolsó C/F/S-ként címezhető szektor) szerepel. (Régebbi Linux fdisk még nem figyelt erre, a címet moduló 1024 tette a partíciós tábla C/F/S bejegyzéseibe, ez az OS/2-nek nem mindig tetszik:)
A boot-olandó partíciónak viszont az első 1024 cilinderen belül kell lennie (legalábbis azon file-oknak, amikre a boot-olás közben szükség van), hogy a BIOS el tudja azt indítani. Hogy ez megabyte-ban mit jelent, az már a BIOS által használt (illetve szimulált) diszk geometriától függ. (pl. 504 mega, 1 giga, 7.8 giga)

Erre a témára még visszatérünk, most viszont maradjunk az eredeti, C/F/S és szektorcím redundanciáján alapuló partíciós bejegyzéseknél.

A partíció helye

A redundáns információk kiszámításához (meg egyébként is:) tudnunk kell a lemez geometriáját, tehát hogy a lemezegységen egy cilinder hány fejet, illetve egy fej hány szektort tartalmaz, nevezzük ezt rendre FPC-nek illetve SPF-nek. A legtöbb operációs rendszer elvárja még, hogy egy partíció cilinderhatáron kezdődjön, illetve végződjön. Ettől csak a partíciós táblát közvetlenül követő partíció kezdőcíme térhet el, ami fej határon kell kezdődjön. (Ebből következik egyébként, hogy a partíciós tábla egyetlen szektorja után következő SPF-1 darab szektor kihasználatlan marad; néhány boot manager képes ide költözteti magát.)

Szóval:

A partíciós tábla helye PC cilinder, PF fej és PS szektor:
PC = 0 (legalábbis az MBR esetében)
PF = 0
PS = 1
Egy partíció kezdete BC cilinder, BF fej és BS szektor:
BC = szabadon választható
BF = 0 vagy 1 (partíciós táblát követő partíciónál lehet 1)
BS = 1
A partíció vége EC cilinder, EF fej és ES szektor:
EC = szabadon választható
EF = FPC-1
ES = SPF
A partíció kezdetének R relatív szektorcíme:
R = ((BC-PC) * FPC + BF) * SPF
A partíció S mérete szektorban:
S = ((EC+1-BC) * FPC - BF) * SPF

Ezek a képletek csak akkor alkalmazhatóak, ha a partíció kezdete és vége "jólnevelt", cilinderhatáros, ahogy nem sokkal fentebb írtam. A képletben azért szerepel PC értéke, mert (majd később látni fogjuk) van olyan partíciós tábla is, ami nem a 0/0/1-es címen található, hanem PC/0/1-en. Az ezt követő legelső partícióra is igaz az, hogy elég, ha fej határos címen kezdődik.

Lehet egyébként kísérletezni vele, hogy nem hagyunk lyukat az első partíció előtt (én még nem tettem ilyet:). Ha szereti valaki a veszélyeket, próbálkozhat azzal is, hogy nem cilinderhatáron fejez be egy partíciót. Ekkor a fenti képletek picit bonyolódnak. Valahol azt olvastam, hogy ami ezt biztos nem szereti, az a DOS és az OS/2. Megzavarhat más operációs rendszereket is, például akkor, hogyha egy SCSI csatolón nincs engedélyezve a BIOS bővítés: Ekkor a partíciós táblában szimulált diszk geometriát a megfelelő fdisk program (pontosabban a diszk vezérlő (driver) program) magából a partíciós táblából próbálja kitalálni, több-kevesebb sikerrel - ha nem cilindenhatáros a partíció, inkább kevesebb sikerrel..

A FreeBSD rögtön kezdődhet az MBR után, nem kell feltétlenül cilinderhatárra tenni. Installálásnál választható, hogy a 2-es szektorra kerüljön, vagy pedig cilinderhatárra.

Szerencsére ezeket a képleteket nem kell sűrűn használnunk; az fdisk jellegű partíció módosító programok ezt a számítást automatikusan elvégzik. Ami személy szerint nem tetszik bennük (sem a dos-os, sem a linux-os fdisk-ben), az az, hogy magát a partíció kezdőcímét is elrejtik (bár linux alatt a cfdisk-kel van lehetőség "table" formátumú használatra is). A kedvenc partíció nézegető - módosító programom a Norton féle DiskEditor (DE), amivel a partíciós táblában található minden információhoz hozzá lehet férni, e mellett pedig ad egy jó eszközt is, amivel a redundáns adatok egyikét automatikusan kiszámíttathatjuk az után, hogy a másikat beírjuk. Persze tudom, ízlések és pofonok...

A linux fdisk esetén arra még figyelni kell, hogy a cilinderek számozását ez a program nem 0-tól, hanem 1-től kezdi!

A boot flag

Ennek a byte-nak az értéke 0 (inaktív) vagy 0x80 (aktív) lehet. Az MBR-ben lévő boot program (illetve programocska) ebből tudja azt, hogy a 4 közül melyik az a partíció, amit el kell indítania. Pontosabban az eredeti (egyszerűsítve fogalmazva: DOS-os) boot program viselkedik így. Ha lecseréljük valamilyen boot manager-re, vagy egy másik operációs rendszer (pl. Linux) betöltő programjára, az szedheti ezt az információt máshonnan is, így nem kell a boot flag-ben feltétlenül 0x80-as értéknek lennie a bootolandó partíciónál. A DOS viszont nem csak bootoláskor használja ezt a flag-et, hanem később is ebből tudja, hogy melyik is az a partíció, ahol saját maga van, és amiből a C: drive kell legyen, tehát DOS-os partíciónál (ha azt akarjuk boot-olni) akkor is be kell állítani ezt a flag-et, ha maga a boot program (pl. a linuxos lilo) ezt nem kívánja.

Az előzőek azt is jelentik, hogy lehetséges a partíciós táblába több DOS partíciót is tenni (ezek közül az lesz a C: drive, amelyiknek a boot flag-je aktív), illetve nem feltétlenül az első partíciónak kell lennie a DOS-os partíciónak. Nagy kapacitású lemezek esetében van azonban egy korlát, aminél nagyobb címen nem kezdődhet olyan DOS partíció, amiről boot-olni akarunk: A DOS partíció első szektora (az úgynevezett boot record) szintén tartalmaz egy adatstruktúrát, és azon kívül egy kis programocskát. Ennek a programocskának része egy szubrutin, ami lineáris címből C/F/S címet számít ki. Ebben a rutinban van egy "bug" (programhiba), aminek eredményeként nem boot-ol ("Non-System disk" hibát jelez) a rendszer, hogyha a betöltendő szektor (IO.SYS első 3 szektora) címében C*F értéke 65535-nél nagyobb lenne. Ha például nagy kapacitású SCSI lemezünk van (tipikusan XX/255/63-as geometriával), akkor az IO.SYS kezdete legfeljebb a 257-es cilinderen lehet, tehát 2015 MegaByte-nál (1.96 GigaByte-nál) korábban kell a DOS partíciót kezdeni. (IDE lemez esetén más geometriával, de hasonló címre (2016 MegaByte) adódik a határ.)

A probléma megoldására csináltam egy patch-et, hogyha szükséged van rá, szóljál. Ezen patch lehetővé teszi 2 GigaByte-nál magasabb címen kezdődő DOS partíció boot-olását is.

(A Windows 95 installálása módosítja a boot programot is, és abban más módszerrel számítják ki a C/F/S címet, itt már nincs az előbb említett programhiba.)

A partíció típuskódja

Ez a byte írja le azt, hogy az adott partíció milyen adatokat (milyen operációs rendszert, pontosabban milyen file rendszert) tartalmaz. Nulla értékű kód jelzi azt, hogy a partíciós bejegyzés nincs használva, a többi közül pedig a legfontosabbakat itt összesítem: (A 0x__ írásmód 16-os számrendszerbeli számot jelez)

Újabb kódokról később lesz szó.

Valójában egy normális operációs rendszer esetében ezek a kódok nem kellenének nagy fontossággal bíróknak lenniük, ott csak azért hasznosak, mert az fdisk ezekből ki tudja írni, hogy az adott partíciónak mi a neve. Azért van néhány kivétel: az 5-ös kód (ami fentebb nem is szerepel) kitüntetett szereppel rendelkezik, erről külön fejezet szól. A DOS csak a saját partícióival hajlandó foglalkozni, úgyhogy ott fontos, hogy a partíció típusa 6-os legyen (ma már az 1-es és 4-es érték nem használatos). (Hallottam még egy 0xF2-es DOS partíciókódról is, SecondaryDOS néven, de nem tudom, mit takar...)


Up Arrow
Tartalomjegyzék
Diszk geometria Left Arrow Right Arrow Az Extended partíció