A FreeBSD több állományrendszert ismer, köztük a hálózati állományrendszert (Network File System, NFS) is. Az NFS állományok és könyvtárak megosztását teszi lehetővé a hálózaton keresztül. Az NFS használatával a felhasználók és a programok képesek majdnem úgy elérni a távoli rendszereken található állományokat, mintha helyben léteznének.
Íme az NFS néhány legjelentősebb előnye:
A helyi munkaállomások kevesebb tárterületet használnak, mivel a közös adatokat csak egyetlen számítógépen tároljuk és megosztjuk mindenki között.
A felhasználóknak nem kell a hálózat minden egyes gépén külön felhasználói könyvtárral rendelkezniük. Ezek ugyanis az NFS segítségével akár egy szerveren is beállíthatóak és elérhetővé tehetőek a hálózaton keresztül.
A különböző háttértárak, mint például a floppy lemezek, CD-meghajtók és Zip® meghajtók a hálózaton több számítógép között megoszthatóak. Ezzel csökkenteni tudjuk a hálózatunkban szükséges cserélhető lemezes eszközök számát.
Az NFS legalább két fő részből rakható össze: egy szerverből és egy vagy több kliensből. A kliensek a szerver által megosztott adatokhoz képesek távolról hozzáférni. A megfelelő működéshez mindössze csak néhány programot kell beállítani és futtatni.
A szervernek a következő démonokat kell működtetnie:
Démon | Leírás |
---|---|
nfsd | Az NFS démon, amely kiszolgálja az NFS kliensektől érkező kéréseket. |
mountd | Az NFS csatlakoztató démonja, amely végrehajtja az nfsd(8) által átküldött kéréseket. |
rpcbind | Ez a démon lehetővé teszi az NFS kliensek számára, hogy fel tudják deríteni az NFS szerver által használt portot. |
A kliensen is futnia kell egy démonnak, amelynek a neve nfsiod. Az nfsiod démon az NFS szerver felől érkező kéréseket szolgálja ki. A használata teljesen opcionális, csupán a teljesítményt hívatott javítani, de a normális és helyes működéshez nincs rá szükségünk. Az nfsiod(8) man oldalán erről többet is megtudhatunk.
Az NFS beállítása
viszonylag egyértelműen adja magát. A
működéséhez szükséges
programok automatikus elindítása csupán
néhány apró módosítást
igényel az /etc/rc.conf
állományban.
Az NFS szerveren gondoskodjunk
róla, hogy az alábbi
beállítások szerepeljenek az
/etc/rc.conf
állományban:
A mountd magától el fog indulni, ha az NFS szervert engedélyezzük.
A kliensen a következő
beállítást kell felvennünk az
/etc/rc.conf
állományba:
Az /etc/exports
állomány
adja meg, hogy az NFS milyen
állományrendszereket exportáljon (vagy
másképpen szólva „osszon
meg”). Az /etc/exports
állományban tehát a megosztani
kívánt állományrendszereket kell
szerepeltetnünk, és azt, hogy melyik
számítógépekkel tudjuk ezeket
elérni. A gépek megnevezése mellett a
hozzáférésre további
megszorításokat írhatunk fel. Ezek
részletes leírását az
exports(5) man oldalon találjuk meg.
Lássunk néhány példát az
/etc/exports
állományban
megjelenő bejegyzésekre:
A most következő példákban az
állományrendszerek
exportálásának finomságait
igyekszünk érzékeltetni, noha a
konkrét beállítások gyakran a
rendszerünktől és a hálózati
konfigurációtól függenek.
Például, ha a /cdrom
könytárat akarjuk három gép
számára megosztani, akik a szerverrel
megegyező tartományban találhatóak
(ezért nem is kell megadnunk a tartományt) vagy
mert egyszerűen megtalálhatók az
/etc/hosts
állományunkban.
Az -ro
beállítás az
exportált állományrendszereket
írásvédetté teszi. Ezzel a
beállítással a távoli rendszerek nem
lesznek képesek módosítani az
exportált állományrendszer
tartalmát.
gép1 gép2 gép3
A következő sorban a /home
könyvtárat három gép
számára osztjuk meg, melyeket IP-címekkel
adtunk meg. Ez olyan helyi hálózat esetén
hasznos, ahol nem állítottunk be
névfeloldást. Esetleg a belső
hálózati neveket az
/etc/hosts
állományban is
tárolhatjuk. Ezzel utóbbival kapcsolatban a
hosts(5) man oldalt érdemes fellapoznunk. Az
-alldirs
beállítás
lehetővé teszi, hogy az alkönyvtárak is
csatlakozási pontok lehessenek. Más
szóval, nem fogja csatlakoztatni az
alkönyvtárakat, de megengedi a kliensek
számára, hogy csak azokat a
könyvtárakat csatlakoztassák, amelyeket kell
vagy amelyekre szükségünk van.
A következő sorban az /a
könyvtárat úgy exportáljuk, hogy az
állományrendszerhez két
különböző tartományból is
hozzá lehessen férni. A
-maproot=root
beállítás
hatására a távoli rendszer
root
felhasználója az
exportált állományrendszeren szintén
root
felhasználóként
fogja írni az adatokat. Amennyiben a
-maproot=root
beállítást
nem adjuk meg, akkor a távoli rendszeren hiába
root
az adott felhasználó, az
exportált állományrendszeren nem lesz
képes egyetlen állományt sem
módosítani.
A kliensek is csak a megfelelő engedélyek
birtokában képesek elérni a megosztott
állományrendszereket. Ezért a klienst ne
felejtsük el felvenni a szerver
/etc/exports
állományába.
Az /etc/exports
állományban az egyes sorok az egyes
állományrendszerekre és az egyes
gépekre vonatkoznak. A távoli gépek
állományrendszerenként csak egyszer
adhatóak meg, és csak egy alapértelmezett
bejegyzésük lehet. Például
tegyük fel, hogy a /usr
egy
önálló állományrendszer. Ennek
megfelelően az alábbi bejegyzések az
/etc/exports
állományban
érvénytelenek:
Egy állományrendszerhez, vagyis itt a
/usr
partícióhoz, két
export sort is megadtunk ugyanahhoz a kliens
nevű géphez. Helyesen így kell megoldani az
ilyen helyzeteket:
Az adott géphez tartozó egy állományrendszerre vonatkozó exportoknak mindig egy sorban kell szerepelniük. A kliens nélkül felírt sorok egyetlen géphez tartozónak fognak számítani. Ezzel az állományrendszerek megosztását tudjuk szabályozni, de legtöbbek számára nem jelent gondot.
Most egy érvényes exportlista következik,
ahol a /usr
és az
/exports
mind helyi
állományrendszerek:
A mountd démonnal az
/etc/exports
állományt minden
egyes módosítása után újra be
kell olvastatni, mivel a változtatásaink csak
így fognak érvényesülni. Ezt
megcsinálhatjuk úgy is, hogy küldünk egy
HUP (hangup, avagy felfüggesztés) jelzést a
már futó démonnak:
#
kill -HUP `cat /var/run/mountd.pid`
vagy meghívjuk a mountd
rc(8)
szkriptet a megfelelő paraméterrel:
#
/etc/rc.d/mountd onereload
Az 11.7. szakasz - Az rc használata FreeBSD alattban tudhatunk meg részleteket az rc szkriptek használatáról.
Ezek után akár a FreeBSD
újraindításával is
aktiválhatjuk a megosztásokat, habár ez nem
feltétlenül szükséges. Ha
root
felhasználónként
kiadjuk a következő parancsokat, akkor azzal minden
szükséges programot elindítunk.
Az NFS szerveren tehát:
#
rpcbind
#
nfsd -u -t -n 4
#
mountd -r
Az NFS kliensen pedig:
#
nfsiod -n 4
Ezzel most már minden készen áll a
távoli állományrendszer
csatlakoztatására. A példákban a
szerver neve szerver
lesz, valamint a kliens
neve kliens
. Ha csak ideiglenesen akarunk
csatlakoztatni egy állományrendszert vagy
egyszerűen csak ki akarjuk próbálni a
beállításainkat, a kliensen
root
felhasználóként
az alábbi parancsot hajtsuk végre:
#
mount szerver:/home /mnt
Ezzel a szerveren található
/home
könyvtárat fogjuk a
kliens /mnt
könyvtárába
csatlakoztatni. Ha mindent jól
beállítottunk, akkor a kliensen most már be
tudunk lépni az /mnt
könyvtárba és láthatjuk a szerveren
található állományokat.
Ha a számítógép
indításával automatikusan akarunk
hálózati állományrendszereket
csatlakoztatni, akkor vegyük fel ezeket az
/etc/fstab
állományba. Erre
íme egy példa:
Az fstab(5) man megtalálhatjuk az összes többi beállítást.
Bizonyos alkalmazások (például a
mutt) csak akkor működnek
megfelelően, ha az állományokat a
megfelelő módon zárolják. Az
NFS esetében az
rpc.lockd használható
az ilyen zárolások
megvalósítására. Az
engedélyezéséhez mind a szerveren és
a kliensen vegyük fel a következő sort az
/etc/rc.conf
állományba (itt
már feltételezzük, hogy az
NFS szervert és klienst
korábban beállítottuk):
A következő módon indíthatjuk el:
#
/etc/rc.d/lockd start
#
/etc/rc.d/statd start
Ha nincs szükségünk valódi
zárolásra az NFS kliensek
és az NFS szerver között,
akkor megcsinálhatjuk azt is, hogy az
NFS kliensen a mount_nfs(8) programnak
az -L
paraméter
átadásával csak helyileg
végzünk zárolást. Ennek
további részleteről a mount_nfs(8) man
oldalon kaphatunk felvilágosítást.
Az NFS megoldását a gyakorlatban rengeteg esetben alkalmazzák. Ezek közül most felsoroljuk a legelterjedtebbeket:
Több gép között megosztunk egy telepítőlemezt vagy más telepítőeszközt. Ez így sokkal olcsóbb és gyakorta kényelmes megoldás abban az esetben, ha egyszerre több gépre akarjuk ugyanazt a szoftvert telepíteni.
Nagyobb hálózatokon sokkal kényelmesebb lehet egy központi NFS szerver használata, ahol a felhasználók könyvtárait tároljuk. Ezek a felhasználói könyvtárak aztán megoszthatóak a hálózaton keresztül, így a felhasználók mindig ugyanazt a könyvárat kapják függetlenül attól, hogy milyen munkaállomásról is jelentkeztek be.
Több géppel is képes így
osztozni az /usr/ports/distfiles
könyvtáron. Ezen a módon sokkal
gyorsabban tudunk portokat telepíteni a
gépekre, mivel nem kell külön mindegyikre
letölteni az ehhez szükséges
forrásokat.
Az amd(8) (automatikus csatlakoztató
démon, az automatic mounter daemon)
önműködően csatlakoztatja a távoli
állományrendszereket, amikor azokon belül
valamelyik állományhoz vagy
könyvtárhoz próbálunk
hozzáférni. Emellett az
amd az egy ideje már
inaktív állományrendszereket is
automatikusan leválasztja. Az
amd használata egy remek
alternatívát kínál az
általában az /etc/fstab
állományban megjelenő állandóan
csatlakoztatott állományrendszerekkel
szemben.
Az amd úgy
működik, hogy kapcsolódik egy NFS szerver
/host
és /net
könyvtáraihoz. Amikor egy állományt
akarunk elérni ezeken a könyvtárakon
belül, az amd kikeresi a
megfelelő távoli csatlakoztatást és
magától csatlakoztatja. A
/net
segítségével egy
IP-címről tudunk exportált
állományrendszereket csatlakoztatni, miközben
a /host
a távoli gép
hálózati neve esetében
használatos.
Ha tehát a /host/izemize/usr
könyvtárban akarunk elérni egy
állományt, akkor az amd
démonnak ahhoz először az
izemize
nevű gépről
exportált /usr
könyvtárat kell csatlakoztatnia.
Egy távoli számítógép
által rendelkezésre bocsátott
megosztásokat a showmount
paranccsal
tudjuk lekérdezni. Például az
izemize
gépen elérhető
exportált állományrendszereket így
láthatjuk:
%
showmount -e izemize
Exports list on izemize:
/usr 10.10.10.0
/a 10.10.10.0
%
cd /host/izemize/usr
Ahogy a példában látjuk is, a
showmount
parancs a /usr
könyvtárat mutatja megosztásként.
Amikor tehát belépünk a
/host/izemize/usr
könyvtárba,
akkor amd magától
megpróbálja feloldani az izemize
hálózati nevet és csatlakoztatni az
elérni kívánt exportált
állományrendszert.
Az amd az indító
szkripteken keresztül az /etc/rc.conf
alábbi beállításával
engedélyezhető:
Emellett még az amd_flags
használatával további paraméterek is
átadható az amd
felé. Alapértelmezés szerint az
amd_flags
tartalmaz az alábbi:
Az /etc/amd.map
állomány
adja meg az exportált állományrendszerek
alapértelmezett beállításait. Az
/etc/amd.conf
állományban az
amd további
lehetőségeit konfigurálhatjuk..
Ha többet is szeretnénk tudni a témáról, akkor az amd(8) és az amd.conf(5) man oldalakat javasolt elolvasnunk.
Némely PC-s ISA buszos Ethernet kártyákra olyan korlátozások érvényesek, melyek komoly hálózati problémák keletkezéséhez vezethetnek, különösen az NFS esetében. Ez a nehézség nem FreeBSD-függő, de a FreeBSD rendszereket is érinti.
Ez gond általában majdnem mindig akkor merül fel, amikor egy (FreeBSD-s) PC egy hálózatba kerül többek közt a Silicon Graphic és a Sun Microsystems által gyártott nagyteljesítményű munkaállomásokkal. Az NFS csatlakoztatása és bizonyos műveletek még hibátlanul végrehajtódnak, azonban hirtelen a szerver látszólag nem válaszol többet a kliens felé úgy, hogy a többi rendszertől folyamatosan dolgozza felfele a kéréseket. Ez a kliens rendszeren tapasztalható csak, amikor a kliens FreeBSD vagy egy munkaállomás. Sok rendszeren egyszerűen rendesen le sem lehet állítani a klienst, ha a probléma egyszer már felütötte a fejét. Egyedüli megoldás gyakran csak a kliens újraindítása marad, mivel az NFS-ben kialakult helyzetet máshogy nem lehet megoldani.
Noha a „helyes” megoldás az lenne, ha
beszereznénk egy nagyobb teljesítményű
és kapacitású kártyát a FreeBSD
rendszer számára, azonban egy jóval
egyszerűbb kerülőút is
található a kielégítő
működés eléréséhez. Ha a
FreeBSD rendszer képviseli a szervert,
akkor a kliensnél adjuk meg a -w=1024
beállítást is a
csatlakoztatásnál. Ha a FreeBSD rendszer a
kliens szerepét tölti be, akkor
az NFS állományrendszert az
-r=1024
beállítással
csatlakoztassuk róla. Ezek a
beállítások az fstab
állomány negyedik mezőjében is
megadhatóak az automatikus csatlakoztatáshoz, vagy
manuális esetben a mount(8) parancsnak a
-o
paraméterrel.
Hozzá kell azonban tennünk, hogy létezik egy másik probléma, amit gyakran ezzel tévesztenek össze, amikor az NFS szerverek és kliensek nem ugyanabban a hálózatban találhatóak. Ilyen esetekben mindenképpen győződjünk meg róla, hogy az útválasztók rendesen továbbküldik a működéshez szükséges UDP információkat, különben nem sokat tudunk tenni a megoldás érdekében.
A most következő példákban a
gyorsvonat
lesz a
nagyteljesítményű munkaállomás
(felület) neve, illetve a freebsd
pedig a
gyengébb teljesítményű Ethernet
kártyával rendelkező FreeBSD rendszer
(felület) neve. A szerveren az
/osztott
nevű könyvtárat
fogjuk NFS állományrendszerként
exportálni (lásd exports(5)), amelyet majd a
/projekt
könyvtárba fogunk
csatlakoztatni a kliensen. Minden esetben érdemes lehet
még megadnunk a hard
vagy
soft
, illetve bg
opciókat is.
Ebben a példában a FreeBSD rendszer
(freebsd
) lesz a kliens, és az
/etc/fstab
állományában így szerepel az
exportált állományrendszer:
És így tudjuk manuálisan csatlakoztatni:
#
mount -t nfs -o -r=1024 gyorsvonat:/osztott /projekt
Itt a FreeBSD rendszer lesz a szerver, és a
gyorsvonat
/etc/fstab
állománya így fog kinézni:
Manuálisan így csatlakoztathatjuk az állományrendszert:
#
mount -t nfs -o -w=1024 freebsd:/osztott /projekt
Szinte az összes 16 bites Ethernet kártya képes működni a fenti írási vagy olvasási korlátozások nélkül is.
A kíváncsibb olvasók számára eláruljuk, hogy pontosan miért is következik be ez a hiba, ami egyben arra is magyarázatot ad, hogy miért nem tudjuk helyrehozni. Az NFS általában 8 kilobyte-os „blokkokkal” dolgozik (habár kisebb méretű darabkákat is tud készíteni). Mivel az Ethernet által kezelt legnagyobb méret nagyjából 1500 byte, ezért az NFS „blokkokat” több Ethernet csomagra kell osztani — még olyankor is, ha ez a program felsőbb rétegeiben osztatlan egységként látszik — ezt aztán fogadni kell, összerakni és nyugtázni mint egységet. A nagyteljesítményű munkaállomások a szabvány által még éppen megengedett szorossággal képesek ontani magukból az egy egységhez tartozó csomagokat, közvetlenül egymás után. A kisebb, gyengébb teljesítményű kártyák esetében azonban az egymáshoz tartozó, később érkező csomagok ráfutnak a korábban megkapott csomagokra még pontosan azelőtt, hogy elérnék a gépet, így az egységek nem állíthatóak össze vagy nem nyugtázhatóak. Ennek eredményeképpen a munkaállomás egy adott idő múlva megint próbálkozik, de ismét az egész 8 kilobyte-os blokkot küldi el, ezért ez a folyamat a végtelenségig ismétlődik.
Ha a küldendő egységek méretét az Ethernet által kezelt csomagok maximális mérete alá csökkentjük, akkor biztosak lehetünk benne, hogy a teljes Ethernet csomag egyben megérkezik és nyugtázódik, így elkerüljük a holtpontot.
A nagyteljesítményű munkaállomások természetesen továbbra is küldhetnek a PC-s rendszerek felé túlfutó csomagokat, de egy jobb kártyával az ilyen túlfutások nem érintik az NFS által használt „egységeket”. Amikor egy ilyen túlfutás bekövetkezik, az érintett egységet egyszerűen újra elküldik, amelyet a rákövetkező alkalommal nagy valószínűséggel már tudunk rendesen fogadni, összerakni és nyugtázni.
Ha kérdése van a FreeBSD-vel kapcsolatban, a
következő címre írhat (angolul):
<questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése, kérjük erre a címre írjon:
<gabor@FreeBSD.org>.