7. Technikai részletek

(Köszönet érte Randall Hoppernek )

Ebben a szakaszban megpróbálunk kellő mennyiségű alapvető ismeretet átadni a használatban levő merevlemezekről, valamint ezen lemezek rendszerindítási folyamatáról, elegendőt ahhoz, hogy le tudjuk küzdeni azokat a leggyakoribb problémákat, amelyek több operációs rendszer indítása során leselkednek ránk. Teljesen a kezdetektől indul, ezért javasolt egészen addig a pontig ugrani az olvasásban, ahol már ismeretlen dolgok is kezdenek feltűnni.

7.1. Amit tudni érdemes a lemezekről

Három alapvető jellemző írja le a merevlemezen található adatok pontos helyét: cilinder, fej, szektor. Igazából nem teljesen lényeges tudni, hogy ezek milyen viszonyban is állnak egymással, kivéve annyit, hogy ezek együttesen azonosítják be fizikailag a lemezen található adatokat.

Egy merevlemeznek van adott számú cilindere, feje és szektora az egyes cilinder-fej párosok mentén (amelyet egyébként sávnak is neveznek). Ezek az információk adják meg együttesen a merevlemez “fizikai geometriáját”. Általában 512 byte található szektoronként valamint 63 szektor fejenként, azonban a cilinderek és a fejek száma jelentősen változik lemezenként. Ezért a merevlemezen maximálisan tárolható adatok mennyiségét a következőképpen lehet kiszámítani ezek ismeretében:

(a cilinderek száma) × (a fejek száma) × (63 szektor/sáv) × (512 byte/szektor)

Például, ez egy 1,6 gigabyte-os Western Digial AC31600 EIDA merevlemez esetén:

(3148 cilinder) × (16 fej) × (63 szektor/sáv) × (512 byte/szektor)

amely 1 624 670 208 byte-nak felel meg, ami pedig nagyjából 1,6 gigabyte.

Az egyes merevlemezek fizikai geometriáját (a cilinderek, fejek és a sávonkénti szektorok számát) az ATAID és az Interneten megtalálható egyéb hasonló programokkal lehet lekérdezni. De valószínűleg magán a merevlemezen is megtalálható ez az adat. Azonban nem árt óvatosnak lennünk: ha a BIOS-ban LBA-t állítottunk be (ld. 7.3 Szakasz), az említett programok egyikét sem tudjuk használni. Ezért sem képes sok más program (pl. az MSD.EXE vagy a FreeBSD fdisk) megállapítani a fizikai lemez geometriát; helyette az átértelmezett geometriát (a LBA-ból származó virtuális azámadatokat) adják vissza. Erről még beszélni fogunk.

Még egy apróság ezzel kapcsolatban. A 3 szám — nevezetesen a cilinderek, a fejek és a szektorok sávonkénti száma — ismeretében képesek vagyunk betájolni egy konkrét abszolút szektort (vagyis egy 512 byte-os adatblokkot) a lemezünkön. A cilindereket és fejeket 0-tól, míg a szektorokat 1-től szokták számozni.

Azok számára, akik még jobban el akarnak mélyedni a technikai részletekben, a lemezek geometriájában, a boot szektorok és BIOS-ok stb. titkaiban, mindent megtalálhatnak róluk az Interneten. Keressenek rá bátran a Lycos, Yahoo stb. szolgáltatásokban a boot sector vagy master boot record szavakra. A sok hasznos ismeret között esetleg találkozni fogunk Hale Landis Hogyan is működik? c. leírásgyűjteményével is. Ezzel kapcsolatban ld. a 6 Szakaszt.

Rendben, ennyi elég is lesz a terminológiáról. Beszéljük a bootolásról!

7.2. A rendszerindítás folyamata

A merevlemez első szektorában (azaz a 0. cilinder, 0. fej, 1. szektor) lakozik a Master Boot Record (MBR). Ez tartalmazza lényegében a teljes lemez térképét. Legfeljebb 4 partíciót képes tárolni, amelyek mindegyike a lemez egy-egy folytonos darabkája. A FreeBSD ezeket a partíciókat egyébként slice-oknak hívja annak érdekében, hogy elkerülje a saját partícióival történő összetévesztésüket, habár mi most nem így fogunk tenni. Minden egyes partícióra telepíthető egy-egy operációs rendszer is.

Az MBR-ben található összes partíciós bejegyzésnek van egy ún. partíció azonosítója, egy kezdő cilinder/fej/szektor értéke és egy befejező cilinder/fej/szektor értéke. A partíció azonosítója megadja, hogy az adott partíció milyen típusú (milyen operációs rendszer használja), a kezdő/befejező értéke pedig azt, hol található. A 1 Táblázatban a teljesség igénye nélkül felsoroltunk néhány ismertebb azonosítót.

Táblázat 1. Partíció azonosítók

Az. (hex)Leírás
01Elsődleges DOS12 (12 bites FAT)
04Elsődleges DOS16 (16 bites FAT)
05Kiterjesztett DOS
06Elsődleges nagy DOS (> 32MB)
0AOS/2®
83Linux® (EXT2FS)
A5FreeBSD, NetBSD, 386BSD (UFS)

Megjegyezzük, hogy nem mindegyik partíció indítható (ilyen pl. a kiterjesztett DOS). Egyesek igen — mások pedig nem. Amitől egy partíció bootolhatóvá válik, az a partíció boot szektora, amely az egyes partíciók elején található.

Amikor beállítjuk a kedvenc boot managerünket, az tulajdonképpen átnézi az összes merevlemez MBR-jeinek partíciós táblájában található bejegyzéseket és lehetővé teszi számunkra, hogy elnevezgessük őket. Majd amikor elindítjuk a számítógépet, a boot manager az elsőként próbált merevlemez Master Boot Recordjában elhelyezett speciális program segítségével életre kel. Felkeresi a választásunknak megfelelő partíciót az MBR partíciós táblájában, és felhasználva az így megismert kezdő cilinder/fej/szektor adatokat, betölti az adott partíció boot szektorát, majd átadja neki a vezérlést. A partíció boot szektora ezek után már elegendő információt tartalmaz a rajta levő operációs rendszer indításához.

Egyetlen fontos tudnivalót nem említettünk meg még: minden merevlemezen található MBR. Azonban ezek közül csak az tekinthető fontosnak, amely a BIOS által elsőként próbált lemezen található. Ha csak IDE csatolós merevlemezeink vannak, ez általában az első IDE lemez (pl. az elsődleges lemez az első vezérlőn). Ugyanez a helyzet a csak SCSI-t tartalmazó rendszerekben. Ha viszont van IDE és SCSI merevlemezünk is, a BIOS általában az IDE lemezeket próbálja először elindítani, így az elsőként elindított lemez az első IDE lemez. A boot managert tehát az elsőként elinduló merevlemez MBR-jébe kell elhelyeznünk a fentiekben leírtak szerint.

7.3. A rendszerindítás korlátai és veszélyei

Most pedig következzen mindaz, amire nagyon oda kell figyelnünk.

7.3.1. A rettegett 1024 cilinderes korlát és hogyan segít ezen az LBA

A bootolás folyamatának első része a BIOS-on keresztül megy végbe (ha még nem ismernénk: a BIOS az az alaplapon található chip, amely a számítógép indításához nélkülözhetetlen rutinokat tárolja). Mint olyan, a folyamat első része tehát a BIOS interfészének korlátozásaitól függ.

Ezen időtartam alatt a BIOS által nyújtott interfészt használjuk a merevlemez olvasására (13H megszakítás, 2-es funkció), amely 10 bitet használ a cilinderek, 8 bitet a fejek és 6 bitet a szektorok számozására. Ezzel lekorlátozza használóját (tehát az MBR-ből induló boot managereket és a boot szektorokban található betöltőket) az alábbiakra:

  • legfejlebb 1024 cilinderre

  • legfejlebb 256 fejre

  • legfejlebb 64 szektorra sávonként (ami ténylegesen 63, mivel a 0. nem használható)

Mostanában azonban a nagyobb merevlemezeknek tengernyi cilinderük van, de nem túl sok fejük, ezért ezek a lemezek szinte kivétel nélkül átlépik az 1024 cilinderes határt. Ha vesszük ezt a tényt és összevetjük a BIOS által kínált interfésszel, rájöhetünk, hogy nem bootolhatunk akárhonnan a lemezről. A rendszerindító kódnak (tehát a boot managernek és az összes indítható partícióban található betöltőnek) az 1024. cilinder alatt kell lennie. Tényekre fordítva a szót, ha van egy átlagos merevlemezünk, aminek 16 feje van, ez nagyjából:

1024 cilinder/lemez × 16 fej/lemez × 63 szektor/(cilinder - fej) × 512 byte/szektor,

ami megfelel a sokszor emlegetett 528 MB-os határnak.

Itt jön a képbe a BIOS LBA (Logical Block Addressing). Ennek segítségével ugyanis a BIOS-hívások használója képes hozzáférni az 1024. feletti fizikai cilinderekhez is a BIOS-on keresztül, méghozzá a cilinderek átdefiniálásával. Vagyis újraértelmezi a cilinderek és a fejek számát, és ezzel olyan képzetet ad, mintha a merevlemeznek kevesebb cilindere de több feje lenne, mint a valóságban. Másképp fogalmazva, kihasználja azt a helyzetet, hogy a modern merevlemezekben viszonylag kevés fej és sok cilinder található, ezért eltolja a kettő között nyugvó osztást, aminek köszönhetően mind a két érték az imént említett határok (1024 cilinder, 256 fej) alatt tud maradni.

A BIOS LBA használatával a merevlemezek ezen korlátozása virtuálisan el is tűnik (nos, valójában csak 8 gigabyte-nyival arrébb kerül). Ha LBA-t támogató BIOS-unk van, akkor a FreeBSD-t és minden más operációs rendszert bárhova pakolhatunk, hiszen így nem fogunk az 1024 cilinderes korlátba ütközni.

Az előbb példaként felhozott 1,6 gigabyte-os Western Digital esetén tehát a fizikai geometria:

(3148 cilinder, 16 fej, 63 szektor/sáv, 512 byte/szektor)

Azonban a BIOS LBA ezt így fordítja át:

(787 cilinder, 64 fej, 63 szektor/sáv, 512 byte/szektor),

ami ugyanazt a tényleges lemezméretet eredményezi, azonban a cilinder- és fejadatok a BIOS-hívások által kezelhető tartományba esnek. (Mellékesen megjegyzem, hogy nekem pont egy Linux és egy FreeBSD partícióm van az egyik merevlemezemen, éppen az 1024. cilinder felett, és mind a kettő remekül bootol, hála az LBA-nak).

7.3.2. Boot managerek és a lemez kiosztása

Egy másik fontos dolog, amire figyelnünk kell a boot managerek telepítése során, az éppen a boot managernek foglalt hely a lemezen. A legjobb erre már előre gondolni, és ezzel elkerüljük egy vagy több operációs rendszerünk újratelepítését.

Ha nyomonkövettük a Master Boot Recordról (avagy hol is található az MBR), a partíciók boot szektoráról és a rendszerindítási folyamatról szóló 7.2 Szakaszt, felmerülhet bennünk a kérdés, hogy a merevlemezükön hova is fog kerülni maga a boot manager. Nos, egyes boot managerek kellően kis méretűek ahhoz, hogy teljes egészében elférjenek a Master Boot Recordban (0. cilinder, 0. fej, 1. szektor), a partíciós tábla mellett. Másoknak ellenben valamivel több helyre van szüksége és tulajdonképpen a 0. cilinder 0. fejének sávjában nyúlnak túl az MBR-en néhány szektornyival, mivel azok általában szabadon maradnak… általában.

És itt jön a csel! Egyes operációs rendszerek (köztük a FreeBSD is) megengedik, hogy a partíciójuk akár közvetlenül a Master Boot Record után kezdődjön a 0. cilinder 0. fejének 2. szektorában. Tulajdonképpen, ha a FreeBSD telepítőjének egy olyan lemezt adunk meg, amelynek az eleje vagy a teljes egésze éppenséggel üres, a FreeBSD partícióját alapértelmezés szerint közvetlenül ide rakja (legalább is így tette, amikor megpróbáltam telepíteni). Ezután szépen felrakjuk a boot managert, és ha az éppenséggel hajlamos elfoglalni az MBR után következő néhány szektort, akkor ezzel együtt felül is írja az első partíció adatait. A FreeBSD esetében így felülírja a lemezcímkét, amitől a FreeBSD partíció ezáltal bootolhatatlanná válik.

Ha egyszerűen el akarjuk kerülni ezt a problémát (és megadni az esélyt más, kevésbé rugalmas boot managerek számára), akkor hagyjuk szabadon a lemezen található első sávot. Vagyis ne tegyünk semmilyen partíciót a 0. cilinder, 0. fej, 2. szektorától kezdődően egészen a 0. cilinder, 0. fej 63. szektoráig, hanem helyezzük azt a 0. cilinder 1. fejének 1. szektorára. Ugyan nem mernék rá megesküdni, de ha létrehozunk egy DOS partíciót a lemez elején, a DOS alapértelmezés szerint ezt a területet szabadon hagyja (ezért is gondolja úgy néhány boot manager, hogy szabad). Ezt inkább magam szeretem csinálni, ezért létrehozok egy 1 megás DOS partíciót a lemez elején, mivel ezzel ráadásul meg tudom akadályozni, hogy elsőleges DOS meghajtónevek felcserélődjenek egy újrapartícionálást követően.

Hivatkozásképpen, a következő boot managerek használják a Master Boot Recordot az adataik és kódjuk tárolására:

  • OS-BS 1.35

  • Boot Easy

  • LILO

Ezek a boot managerek használnak további szektorokat a Master Boot Record után:

  • OS-BS 2.0 Beta 8 (2-5. szektorok)

  • Az OS/2 boot managere

7.3.3. Mit tegyünk, ha nem indul el a rendszer a számítógépünkön?

Egyes esetekben előfordulhat, hogy a boot managerek telepítése során az MBR-t olyan állapotba sikerül hozni, ahonnan a számítógépünk nem képes elindulni. Ugyan nem valószínű, de megtörténhet, amikor ismételten használjuk az FDISK-et egy már meglevő boot manager alatt.

Ha van a lemezen egy bootolható DOS partíció, akkor indítsuk el azt egy DOS-os rendszerlemezről, és írjuk be:

A:\> FDISK /MBR

Ennek segítségével vissza tudunk rakni egy egyszerű DOS rendszerbetöltő kódot az MBR-be, ami után be tudjuk tölteni a DOS-t (de csak a DOS-t) a merevlemezről. Másik megoldás lehet, hogy simán újra felrakjuk a boot managerünket egy rendszerindító lemezről.

Ha kérdése van a FreeBSD-vel kapcsolatban, a következő címre írhat (angolul): <freebsd-questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése, kérjük erre a címre írjon: <gabor@FreeBSD.org>.