NFS (Network File System).

lehe originaal www.ise.ee

Võrgufailisüsteem NFS (Network File System) on RPC-protokolli kasutav võrguteenus. NFS võimaldab juurdepääsu välishostide failidele täpselt samamoodi, nagu kasutaja omab juurdepääsu kohalikele failidele. See toimub kliendipoolse tuuma (mis kasutab välissüsteemi) ja serveripoolse NFS-serveri (mis pakub failide andmeid) funktsioonide ühendamise teel. Taoline juurdepääs failidele on kliendile täiesti nähtamatu ning töötab paljude serverite ja hostide liitstruktuuril.

NFS pakub mitmeid eeliseid:

Vaatame nüüd, kuidas NFS töötab. Klient võib ühendada välishosti kataloogi kohalikku kataloogi samamoodi nagu füüsilise seadme. Süntaks väliskataloogi täpsustamiseks on siiski erinev. Näiteks ühendamaks kataloogi /home hostis vkompu kataloogiga /users hostis marm peaks ülem käivitama hostis marm järgmise käsu:

# mount -t nfs vkompu:/home /users

Käsk mount üritab siis RPC kaudu ühendust võtta deemoniga mountd hostis vkompu. Server kontrollib, kas marm lubab kataloogi ühendada ja positiivse vastuse korral tagastab asjakohase failisanga, mida kasutatakse kõigis järgnevates kataloogi /users failide päringutes.

Kui keegi pöördub faili poole NFS-i kaudu, siis tuum paigutab serverina töötavas arvutis RPC-kutse NFS-deemonile nfsd. Kutse parameetriteks on failisang, failinimi ning kasutaja- ja grupikood faili pääsuõiguste kontrolliks. Et volitamata kasutajad ei saaks faile lugeda ega muuta, peavad kasutaja- ja grupikoodid mõlemas hostis kokku langema.

Enamikus Unixi teostustes täidavad NFS-funktsioone nii kliendi kui serveri poolel tuumataseme deemonid, mis aktiveeritakse süsteemi käivitamisel: NFS-deemon (nfsd) serverhostis ja BIO-deemon (biod) klienthostis. Andmeedastuse parandamiseks teostab biod asünkroonset S/V-reþiimi, st eellugemist ja järelkirjutamist; kusjuures mitmed nfsd-deemonid töötavad reeglina samaaegselt.

Linuxi NFS-teostus erineb veidi selle poolest, et kliendipool on tugevasti integreeritud virtuaalse failisüsteemi (VFS) tuumakihiga ning ei vaja lisajuhtimist läbi deemoni biod. Teisest küljest töötab serveriprogramm täielikult kasutaja koordinaadisüsteemis ning serveri eri koopiate samaaegne töö on sünkroniseerimisprobleemide tõttu peaaegu võimatu. Linuxi NFS tunneb puudust ka eellugemisest ja järelkirjutusest.

Linuxi võrgufailisüsteemi tõsiseim probleem on aga see, et Linuxi tuum pole võimeline töötlema mälu üle 4K-suuruste tükkide. Selle tulemusena ei saa võrguprogramm käsitseda suuremaid datagramme kui umbes 3500 baiti (pärast päise ja muude lisaandmete mahaarvamist). Järelikult tuleb vaikimisi suuri UDP-datagramme (näiteks 8K SunOS-is) kasutavate NFS-deemonite saadetisi kunstlikult vähendada. See mõjub arvutite jõudlusele teatud tingimustes väga halvasti. Piirang on uuemates Linuxi tuumades nüüdseks kaotatud ja kliendipool vastavalt modifitseeritud.

Süsteemi NFS ettevalmistus

Enne võrgufailisüsteemi NFS kasutamist serveri või kliendina peate veenduma, et teie Linuxi tuuma on NFS-tugi sisse kompileeritud. Uuematel tuumadel on selleks otstarbeks lihtne liides failisüsteemis proc (fail /proc/filesystems), mille saate kuvada käsuga cat:

$ cat /proc/filesystems
minix
ext2
msdos
nodev proc
nodev nfs

Kui nfs loendis puudub, siis tuleb Linuxi tuum uuesti kompileerida koos NFS-toega.

Vanemate tuumade puhul (varasemad kui Linux 1.1) on lihtsaim viis NFS-i töö kontrollimiseks proovida tegelikult võrgufailisüsteemi ühendada. Selleks looge kataloogi /tmp mõni fail ja proovige ühendada suvalist kohalikku kataloogi:

# mkdir /tmp/test
# mount localhost:/etc /tmp/test

Kui ühendamiskatse ebaõnnestub ja järgneb veateade ”fs type nfs no supported by kernel”, peate koostama uue tuuma. Kõik muud veateated on ohutud (kuni te pole konfigureerinud NFS-deemoneid oma hosti).

NFS-köite ühendamine

NFS-köited ühendatakse analoogiliselt tavaliste failisüsteemide ühendamisega. Käivitage käsk mount järgmise süntaksiga:

# mount -t nfs nfs_volume local_dir options

Parameeter nfs_volume on antud kujul remote_host:remote_dir. Kuna failisüsteemi NFS esitus on ainulaadne, võite ära jätta suvandi -t nfs. Lisaks saate NFS-köite ühendamisel täpsustada mitut suvandit. Need võib määratleda kas käsureal võtme -o järel või köite kohta käiva kirje suvandiväljal failis /etc/fstab. Mõlemal juhul on eri suvandid eraldatud komadega. Käsureal täpsustatud suvandid alistavad alati failis fstab antud määrangud.

Näiteks kirje failis /etc/fstab võib olla kujul:

# volume mount point type options news:/usr/spool/news /usr/spool/news nfs timeo=14,intr

Selle köite saab ühendada järgmise käsuga:

# mount news:/usr/spool/news

Kui failis fstab-kirje puudub, muutuvad keerukamaks NFS-i mount-käsud. Oletame näiteks, et ühendate kasutajate kodukataloogid masinast nimega moonshot, mis kasutab lugemis-kirjutusoperatsioonideks vaikimisi ploki pikkust 4KB. Te võite vähendada ploki pikkuse 2KB-ni, et kohanduda Linuxi datagrammi suuruspiiranguga:

# mount moonshot:/home /home -o rsize=2048,wsize=2048

Järgnev tabel sisaldab mittetäieliku loendi nendest suvanditest, mida te tõenäoliselt soovite kasutada:

rsize=n jawsize=n Täpsustavad NFS-kliendi kasutatava datagrammi pikkuse tema poole pöördumisel (vastavalt lugemisel ja kirjutamisel). Vaikeväärtus on1024 baiti (UDP pikkusepiirangu tõttu).
timeo=n Häälestab aja (kümnendiksekundites), kui kaua NFS-klient ootab oma pöörduse täitmist. Vaikeväärtus on 0,7 sekundit.
hard Köite püsiühendus (ka vaikimisi).
soft Tühistab püsiühenduse.
intr NFS-pöörduse katkestus. Võib kasutada abortimiseks, kui server ei vasta.

Kõik suvandid (välja arvatud rsize ja wsize) mõjutavad kliendi käitumist juhul, kui server peaks muutuma ajutiselt kättesaamatuks. Koostöö toimub järgmiselt: kui klient saadab päringu NFS-serverisse, ootab ta operatsiooni lõppu eelmääratletud ajavahemiku jooksul (suvand timeout). Kui selle aja jooksul kinnitust ei saada, rakendub eelnev ajalõpp (nn minor timeout) ja operatsiooni proovitakse täita uuesti poole pikema ajaintervalliga. Pärast jõudmist maksimaalse ooteajani, 60 sekundini, teostub tegelik ajalõpp (major timeout).

Ajalõpu korral saadetakse vaikimisi kliendi kuvarile teade ja alustatakse uuesti, seekord esialgsetest ajavahemikest kaks korda pikematega. Põhimõtteliselt võib see kesta lõputult. Püsiühendusega köited üritavad visalt ühendusoperatsiooni kuni serveri taaskättesaadavaks muutumiseni. Püsiühenduseta köited genereerivad üldise ajalõpu saabumisel pöörduva protsessi jaoks kohe sisend-väljund-vea. Vahemäluga järelkirjutuse tõttu võib veaolek levida protsessi enda sisse enne järjekordset pöördumist funktsiooni write poole. Seega ei saa programm kunagi kindel olla, kas kirjutusoperatsioon püsiühenduseta köitesse üleüldse õnnestus.

Köite püsiühenduse kasutamine pole lihtsalt maitseküsimus, vaid sõltub ka köites säilitatavast informatsioonist. Näiteks X-programmide ühendamisel NFS-i kaudu ei soovi te kindlasti X-sessiooni ebaõnnestumist lihtsalt selle tõttu, et keegi põhjustas võrguummiku, käivitades programmi xv seitse koopiat samaaegselt või tõmmates nalja pärast hetkeks välja Etherneti-pistiku. Köite püsiühendus tagab, et arvuti ootab ära ühenduse taastamise NFS-serveriga. Teisest küljest — vähemkriitilised andmed nagu NFS-ühendusega uudisesektsioonid või FTP-arhiivid ei pruugi olla püsivalt ühendatud, sest välismasina ajutine mittekäideldavus ei tekita arvuti krahhi. Kui võrguühendus serverisse on kihiline või kulgeb läbi ülekoormatud marsruuteri, võite suvandi timeo abil suurendada algset ajalõppu, luua köidete püsiühenduse või lubada NFS-väljakutse katkestuse, et saaks abortida tardunud failide poole pöördumise.

Harilikult deemon mountd jälgib, millised hostid milliseid katalooge ühendavad. Selle teabe saab kuvada NFS-serveripaketi programmiga showmount.

NFS-deemonid

Kui soovite pakkuda NFS-teenust teistele hostidele, peate oma arvutis käivitama deemonid nfsd ja mountd. RPC-põhiseid programme nfsd ja mountd ei juhi inetd, vaid nad käivitatakse alglaadimisel ja registreeritakse porditeisenditena. Seetõttu tuleb need deemonid pärast rpc.portmap'i käivitamist kindlasti aktiveerida. Tavaliselt lisatakse faili rc.inet2 järgmised read:

if [ -x /usr/sbin/rpc.mountd ]; then          /usr/sbin/rpc.mountd; echo -n " mountd"  fi  if [ -x /usr/sbin/rpc.nfsd ]; then          /usr/sbin/rpc.nfsd; echo -n " nfsd"  fi

Failide valdusteave, mida NFS-deemon oma klientidele pakub, sisaldab harilikult ainult numbrilisi kasutaja- ja grupikoode. Kui klient ja server kasutavad samu kasutaja- ja grupinimesid koos samade digitaalkoodidega, kehtib neile ühine kasutaja- ja grupikoodide ruum (näiteks parooliteabe levitamisel kohtvõrgu kõigisse hostidesse seoses NIS-teenustega).

Mõnel juhul ei lange need siiski kokku. Kliendi kasutaja- ja grupikoodide kohandamiseks serveris olevatega võite kasutada andmeteisendusdeemonit ugidd. Suvandi map_daemon kasutamist selgitatakse allpool, aga deemonile nfsd on võimalik öelda, et ta sobitaks deemoni ugidd abiga kliendi ning serveri kasutaja- ja grupikoodid.

Deemon ugidd on RPC-põhine server, mis käivitatakse failist rc.inet2 täpselt samamoodi nagu deemonid nfsd ja mountd.

if [ -x /usr/sbin/rpc.ugidd ]; then          /usr/sbin/rpc.ugidd; echo -n " ugidd"  fi

Fail exports

Kui ülalkirjeldatud suvandid mõjutasid kliendi NFS-konfiguratsiooni, siis serveris määratleb teine funktsioonikomplekt serveri käitumise kliendi suhtes. Nimetatud suvandid tuleb häälestada failis /etc/exports.

Deemon mountd ei luba vaikimisi kellelgi ühendada katalooge kohalikust hostist, mis on ka üsna mõistlik. Võrgufailisüsteemiga ühendamiseks tuleb kataloog eksportida, st kataloog peab olema registreeritud failis exports. Näidisfail on järgmine:

# exports file for vkompu  /home             marm(rw) vpast(rw) vmarts(rw)  /usr/X386         marm(ro) vpast(ro) vmarts(ro)  /usr/TeX          marm(ro) vpast(ro) vmarts(ro)  /                 marm(rw,no root squash)  /home/ftp         (ro)

Iga eeltoodud rida defineerib kataloogi ja hostid, millega on lubatud seda kataloogi ühendada. Hosti nimi on tavaliselt täielik domeeninimi, mis võib lisaks sisaldada metamärke “*” ja “?” (toimivad samuti nagu Bourne'i kestas). Näiteks lab*.foo.com vastab nimele lab01.foo.com kui ka nimele laber.foo.com. Kui hostinime pole antud, nagu ülaltoodud näites kataloogil /home/ftp, võib iga host selle kataloogi ühendada.

Deemon mountd otsib failist exports kliendi hostinime päringu gethostbyaddr abil. See päring töötab süsteemiga DNS ning vajab kliendi kanoonilist hostinime, seega ärge kasutage failis exports pseudonüüme. DNS-i kasutamata on vastuseks esimene leitud hostinimi failis hosts, mis vastab kliendi aadressile.

Hostinimele järgneb valikuline, sulgudes ning komadega eraldatud lippude loend. Lipud võivad omada järgmisi väärtusi:

insecure Volitamata juurdepääs sellest masinast.
unix-rpc Selle masina Unix-domeeni RPC-autentsuskontroll. See tähendab lihtsalt, et päringud tuleksid kinnisest Internetipordist (st pordi aadress peab olema väiksem kui 1024). Vaikesuvand.
secure-rpc Selle masina püsiv RPC-autentsuskontroll.
kerberos Sellest masinast tulevate pöörduste Kerberos-autentsuskontroll.
root_squash Turbelisand, mis tühistab hostides eeliskasutaja erilised pääsuõigused, teisendades päringud kliendi kasutajakoodiga 0 serveri kasutajakoodiks 65534 (-2). See kasutajakood peaks olema seotud kasutajaga nobody.
no_root_squash Päringuid kasutajakoodiga 0 mitte teisendada. Vaikesuvand.
ro Ühendada failid kirjutuskaitsega. Vaikesuvand.
rw Ühendada failid lugemis-kirjutuspääsuga.
link_relative Teisendada absoluutsed sümboolsed lingid (kus lingi sisu algab kaldkriipsuga) suhtelisteks linkideks, lisades vajaliku arvu sümboleid “../” (linki sisaldavast kataloogist serveri kataloogini). Süsteem saab sellest suvandist õigesti aru ainult siis, kui terve hosti failisüsteem on ühendatud. Muidu võib mõni link viidata tühjusse või mis veel hullem, keelatud kohta. Vaikesuvand.
link_absolute Säilitada sümboolsete linkide olek (normaalne käitumisviis Suni NFS-serveritel).
map_identity Käsib NSF-serveril eeldada, et klient kasutab samu kasutaja- ja grupikoode nagu server. Vaikesuvand.
map_daemon Käsib NFS-serveril eeldada, et klient ning server ei jaga sama kasutaja- ja grupikoodide ruumi. Deemon nfsd koostab siis loendi teisendatavatest koodidest kliendi ja serveri vahel, küsitledes kliendi deemonit ugidd.

Faili exports analüüsil leitud vead esitatakse deemoni syslogd funktsiooni notice abil pärast deemonite nfsd või ugidd käivitamist.

Pange tähele, et hostinimed saadakse kliendi IP-aadressi teisendamisel, mistõttu tuleb õigesti konfigureerida teisendusvahend. Kui kasutate BIND-serverit ja muretsete turvalisuse pärast, peaksite lubama narrimiskontrolli failis host.conf.

Linuxi automaatühendaja

Kõigi potentsiaalselt vajalike NFS-köidete ühendamine võib osutuda ebaotstarbekaks nende suure arvu või pika käivitusaja tõttu. Elujõuliseks alternatiiviks on nn automaatühendaja (automounter) — deemon, mis vajaduse korral automaatselt ja nähtamatult ühendab iga NFS-köite ning lahutab köite, mida pole mõnda aega kasutatud. Automaatühendaja põhieeliseks on asjaolu, et ta võib ühendada konkreetse köite alternatiivsetest kohtadest. Näiteks võite hoida NFS-i kasutades X-programmide ja tugifailide koopiaid kahes või kolmes hostis. Registreerige kõik kolm asukohta ning automaatühendaja üritab neid ühendada kataloogiga /usr/X386, kuni üks ühenduskatsetest õnnestub.

Linuxis tavaliselt kasutatav automaatühendaja kannab nime amd.