A root fájlrendszer mountolása NFS-en keresztül (nfsroot)

Írta: Gero Kuhlmann gero@gkminix.han.de 1996

Amennyiben egy merevlemezt nem tartalmazó (diskless) rendszert kívánsz használni X-terminál gyanánt vagy nyomtató szerverként, a root fájlrendszeredet egy nem-lemez (non-disk) típusú eszközre kell helyezned. Ez lehet egy ramdiszk (lásd ugyanebben a könyvtárban az inird.txt fájl a további információkért), vagy egy NFS-en keresztül mountolt fájlrendszer. A következő szöveg leírja, hogy miként használjuk az NFS-t a root fájlrendszer számára. A szövegben a ,,kliens'' elnevezés jelöli a lemezegység nélküli rendszert, míg a ,,szerver'' jelenti az NFS szervert.


1.) Az nfsroot képesség engedélyezése

Az nfsroot használatához ki kell választanunk a kernel konfigurálása alatt az NFS támogatást. Jegyezzük meg, hogy ebben az esetben az NFS támogatás nem tölthető be modulként. A konfigurációs szkript ezután meg fogja kérdezni, hogy vajon akarjuk-e használni az nfsroot képességet, és ha igen, akkor miféle autokonfigurálási rendszert akarunk használni. Biztos ami biztos; válasszuk ki mind a BOOTP-t, mind pedig a RARP-ot.


2.) A kernel parancs sor

Amint a kernelt betölti egy bootbetöltő (bootloader), ami lehet a loadlin, LILO vagy éppen egy hálózati boot program (netboot); meg kell mondanunk neki, hogy milyen root fs eszközt fog használni, merre találja a szervert, valamint mi annak a szerveren lévő könyvtárnak a neve, amelyet root-ként fog mountolni. Mindezek megadhatók néhány kernel parancs sori paraméterként:


root=/dev/nfs

Ez szükséges az ál-NFS-eszköz engedélyezéséhez. Jegyezzük meg, hogy ez nem egy valós eszköz, hanem mindössze egy szinoníma arra, hogy közöljük a kernellel, hogy egy valódi eszköz helyett használja inkább az NFS-t.


nfsroot=[<szerver-ip-címe>:]<root-könyvtár>[,<nfs-opciók>]

Amennyiben az nfsroot paraméter nincs megadva a parancssorban, az alapértelmezett "/tftpboot/%s" forma kerül használatra.

<szerver-ip-címe> Meghatározza az NFS-szerver IP címét. Ha ez a mező nincs megadva, az alapértelmezett érték az lesz, amelyet az nfsaddrs változó (lásd alább) használ. Kézenfekvő a használata ennek a paraméternek azokban az esetekben, ha eltérő RARP és NFS szerverek használatát kívánjuk engedélyezni. Általában üresen hagyhatjuk.
<root-könyvtár> A szerverről root-ként mountolt könyvtár neve. Ha itt egy ,,%s'' jel található a sztringben, akkor a jel a kliens ASCII értelmezésű IP címét fogja helyettesíteni.
<nfs-opciók> Szabványos NFS opció. Valamennyi opciót vesszőkkel kellelválasztani egymástól. Ha az opció mező nincs megadva, a következő alapértelmezett értékek kerülnek felhasználásra:
    port      	= amit a szerver portmap démonja ad meg
    rsize     	= 1024
    wsize      	= 1024
    timeo      	= 7
    retrans    	= 3
    acregmin	= 3
    acregmax	= 60
    acdirmin	= 30
    acdirmax	= 60
    flags      	= hard, nointr, noposix, cto, ac

 

nfsaddrs=<kliens-ip-cím>:<szerver-ip-cím>:<gw-ip>:<netmaszk>:<gépnév>:<eszközfájl>:<autoconf>

Amennyiben hiányzik ez a paraméter a kernel parancssorából, valamennyi mező üresnek feltételezett, és az alább megemlített alapértelmezések kerülnek alkalmazásra. Általánosságban ez azt jeleni, hogy a kernel megpróbál mindent beállítani, felhasználva ehhez mind a RARP, mind a BOOTP protokollt. (Attól függően persze, hogy mit engedélyeztünk a kernel konfigurálása alatt, és ha mindkettőt engedélyeztük, akkor amelyik protokoll előszőr válaszol.)

<kliens-ip-cím> A kliens IP címe. Ha értéke üres, akkor a címet vagy a RARP vagy a BOOTP határozza meg. Az, hogy melyik protokoll használt, függ attól, hogy melyiket engedélyeztük a kernel konfigurálása alatt, valamint függ az <autoconf> paramétertől. Ha ez a paraméter nem üres, akkor sem a RARP, sem a BOOTP protokoll nem kerül használatra.
<szerver-ip-cím> Az NFS szerver IP címe. Ha a RARP használt a kliens címének meghatározására és ez a paraméter NEM üres, a válaszok csak egy kitüntetett szervertől elfogadottak. Ahhoz, hogy különböző RARP és NFS szervert használhass, add meg a RARP szerveredet ezen a helyen (vagy hagyd üresen), és add meg az NFS szerveredet az nfsroot paraméterben (lásd feljebb). Amennyiben ez a bejegyzés üres, annak a szervernek a címe kerül felhasználásra, amelyet a RARP vagy a BOOTP kérés válasza tartalmaz.
<gw-ip> Az átjáró (gateway) IP címe, ha a szerver eltérő alhálózaton (subnet) található. Ha ez a bejegyzés üres, akkor átjáró nem lesz használatban és a szerver feltételezetten a helyi hálózaton található, hacsak nem érkezett egy érték a BOOTP protokollon keresztül.
<netmaszk> Hálózati maszk (netmask) a helyi hálózati csatólóegység (interface) számára. Ha értéke üres, a hálózati maszk értéke a kliens IP címéból kerül származtatásra, hacsak nem érkezik egy válasz a BOOTP protokollon keresztül.
<gépnév> A kliens neve. Ha üres, akkor a kliens IP címe használt az ASCII jelrendszer szerint, vagy a BOOTP protokollon keresztül kapott érték.
<eszközfájl> A használni kívánt hálózati eszközfájl neve. Ha üres, akkor valamennyi eszközfájl használt a RARP kérések számára, és az első megtalált a BOOTP részére. Az NFS számára az az eszközfájl kerül használatra, amelyiken a RARP vagy a BOOTP válaszok megérkeztek. Amennyiben csak egyetlen eszközfájlod (device) van, biztonságosabb, ha üresen hagyod.
<autoconf> Az autokonfiguráció használatára alkalmas eljárás. Ha értéke a ,,rarp'', vagy a ,,bootp'', akkor a meghatározott protokoll használt. Amennyiben a ,,both'' vagy üres érték van megadva, akkor - az első esetben - mindkét protokoll használatban lesz, persze ha ezeket a kernel konfugurálása alatt engedélyezted. A ,,none'' azt jelenti, hogy nincs autokonfiguráció. Ebben az esetben neked kell meghatároznod valamennyi szükséges, az imént ismertetett mezők értékét.

Az <autoconf> paraméter egyedül is szerepelhet, mint az nfsaddrs paraméter értéke (minden nélkül, a ,,:'' karakterek elé), és ebben az esetben az autokonfiguráció lesz használatban. Viszont a ,,none'' érték ebben az esetben nem elérhető.


3.) A kernel betöltője

A kernel memóriába való bejuttatására többféle mód is használható. A megvalósítás a rendelkezésre álló adottságoktól függ:

3.1) A kernel írása floppy-ra, a dd parancs segítségével:

Ahogy mindíg, most is felírhatjuk a kernelt egy floppy-ra, használva a dd parancsot, ekkor egyáltalán nem lehetséges a kernel parancssorok használata. A ,,root='' paraméter helyettesítésére hozz létre egy báb eszközfájlt (dummy device) bármely linux rendszeren, a 0 főértékkel és a 255 mellékértékkel, használva az mknod parancsot:
mknod /dev/boot255 c 0 255

Ezután másold át a kernelt a floppy-ra, használva a dd parancsot:

dd if=/usr/src/linux/arch/i386/boot/zImage of=/dev/fd0

És végül használd az rdev parancsot a root eszközfájl beállítására:

rdev /dev/fd0 /dev/boot255

Ezután letörölheted a báb eszközfájlt (dummy device), hiszen nincs már számára elérhető, valódi eszközfájl.

A másik két kernel parancssori paraméter nem helyettesíthető az rdev paranccsal. Emiatt használatos az az eljárás, hogy a kernel alapértelmezésban használja a RARP és/vagy a BOOTP protokollt, és ha a RARP protokollon keresztül kap egy választ, akkor a /tftpboot/<kliens-ip-cím>/ könyvtárat fogja mountolni root -ként. Amennyiben a kernel egy BOOTP választ kapott, a válaszban lévő könyvtár nevét használja.

3.2) A LILO használata

Amikor LILO-t használsz, a LILO konfigurációs fájljában az ,,append='' paranccsal meg tudod adni valamennyi szükséges parancssori paramétert. Mindemellett a ,,root='' parancs használatához szükséges lehet beállítani egy báb eszközfájlt (dummy device), amelynek beállításáról az előbbi 3.1 -es részben olvashatsz bővebben. A LILO használatáról és az ,,append='' parancsról a LILO dokumentációjában találhatsz leírást.

3.3) A loadlin használata

Ha DOS parancspromptról akarsz Linux-ot bootolni és helyi merevlemez nélkül akarsz root fájlrendszert mountolni, akkor használatod a loadlin-t is. Azt modtam az imént, hogy működik, de valójában még soha sem próbáltam. Általában létrehozhatod a kernel parancssorokat itt is, hasonlóan, mint ahogy azt a LILO-nál meg tudod tenni. További információknak nézz utána a loadlin dokumentációjában.

3.4) Bootrom használata

Ez talán a lemez nélküli (diskless) kliensek bootolásának legelegánsabb módja. Bootrom használata esetén a kernel a TFTP protokollon keresztül töltődik be. Amennyire tudom, a nem kereskedelmi bootromok már támogatják a Linux bootolását nfs felett, de létezik két ingyenes bootrom a sunsite.unc.edu -n és ennek tükrein. Az egyik a ,,netboot-nfs'', míg a másik az ,,etherboot''. Mindkettő tartalmaz mindent, amire szükséged lehet a lemez nélküli (diskless) Linux kliensek bootolásához.

4.) Jóváírás

Az nfsroot kódot a kernelben én, Gero Kuhlmann <gero@gkminix.han.de> írtam, a BOOTP kódjával együtt és Martin Mares <mj@k332.feld.cvut.cz> működött közre jónéhány hiba kijavításában. Az nfsroot legelső verziójának megírásakor kapott segítségért szeretnék köszönetet mondani Jens-Uwe Mager-nek <jum@anubis.han.de>.


Magyar változat: Murzsa Norbert email: kuksi@kuksi2.igyuk.hu