Linux documentation Project (CS) / Příručka správce sítě
Previous Content Next Up

 

11 Síťový souborový systém (NFS)

    Síťový souborový systém neboli NFS je pravděpodobně nejvýznamnijší Síťovou službou, která využívá balík RPC. Umožňuje přístup k souborům na vzdálených hostitelích, který je uskutečňován zcela stejným způsobem jako přístup uživatele k místním souborům. Toto chování je možné díky kombinaci funkce jádra operačního systému na straně klienta (který používá vzdálený souborový systém) a serveru NFS na straně serveru (který poskytuje souborová data). Tento přístup k souborům je pro klienta zcela transparentní a funguje na nejrůznějších serverových a klientských architekturách.

Systém NFS nabízí několik výhod:

    Podívejme se nyní, jak systém NFS funguje: Klient může požádat o připojení adresáře ze vzdáleného hostitele ke svému místnímu adresáři naprosto stejným způsobem, jako při připojování fyzického zařízení. Avšak syntaxe používaná k zadání vzdáleného adresáře je odlišná. Chcete-li třeba připojit adresář /home z hostitele vlager k adresáři /users na hostiteli vale, měl by správce na hostiteli vale spustit následující příkaz:

# mount -t nfs vlager:/home /users

    Příkaz mount se pokusí spojit pomocí procedur RPC s připojovacím démonem mountd, který běží na hostiteli vlager. Server zkontroluje, zda má hostitel vale povoleno příslušné připojení, a pokud ano, vrátí mu souborový klíč. Tento souborový klíč bude použit ve všech následujících souborových požadavcích pod adresářem /users.

    Při přístupu k souboru pomocí systému NFS spustí jádro systému volání procedury RPC směrem na démona nfsd (démon systému NFS), který se nachází na počítači serveru. Toto volání získá souborový klíč, název souboru, k němuž se má přistupovat, a jako parametry i id uživatele a skupiny, které se vztahují k danému uživateli. Tyto hodnoty slouží k určení přístupových práv k zadanému souboru. Aby se zabránilo neautorizovaným uživatelům ve čtení nebo úpravě souborů, musí být id uživatele a skupiny na obou hostitelích totožná.

    Ve většině unixových implementací je systém NFS jak pro klienta, tak i pro server implementován pomocí démonů, kteří běží na úrovni jádra operačního systému a jsou spouštěni z uživatelského prostoru při zavádění systému. Na hostiteli serveru je spuštěn démon systému NFS (nfsd) a na hostiteli klienta je spuštěn blokový V/V démon (Block I/O daemon - biod). Aby se zvšišla propustnost, provádí démon biod asynchronní V/V komunikaci s využitím dopředného čtení a opožděného zápisu; současně je obvykle spuštěno několik démonů nfsd.

    Implementace systému NFS v Linuxu se nepatrně liší tím, že kód klienta je pevně integrován do virtuálního systému souborů (virtual file system - VFS) v jádru operačního systému a nepotřebuje dodatečné řízení pomocí démona biod. Na druhou stranu běží kód serveru kompletně v uživatelském prostoru, takže je v zásadě nemožné současně spustit více kopší serveru, protože by mohlo dojít k problémům se synchronizací.

    Největší problém linuxového kódu systému NFS spočívá v tom, že jádro operačního systému Linux není ve verzi 1.0 schopno alokovat více paměti, než 4 KB; v důsledku toho neumí síťový kód spravovat větší datagramy, než 3500 bajtů, což je velikost datagramu po odečtení velikosti hlavičky atd. To znamená, že přenosy z a na démony systému NFS, které implicitně používají velké UDP datagramy (například datagramy o velikosti 8 KB, které používá SunOS), musí být uměle upraveny na podporovanou velikost datagramu. To může mít za určitých okolností tvrdý dopad na výkon systému.

    Tento limit se podařilo odstranit teprve nedávno uvedením jádra operačního systému Linux verze 1.1. Kód klienta byl navíc upraven tak, aby této výhody uměl využít.

11.1 Příprava systému NFS

    Před použitím systému NFS, aš už jako klienta nebo jako serveru, je třeba se ujistit, že jádro vašeho operačního systému má zkompilovanou podporu pro systém NFS. Novější jádra mají pro tento účel jednoduché rozhraní, které poskytuje informace o souborových systémech. Veškeré informace najdete v souboru /proc/filesystems, který zobrazíte příkazem cat:

$ cat /proc/filesystems

minix

ext2

msdos

nodev proc

nodev nfs

    Pokud v tomto seznamu chybí souborový systém nfs, pak je nutné zkompilovat vlastní jádro operačního systému s podporou systému NFS. Konfigurace Síťových voleb jádra operačního systému je probrána ve stati "Konfigurace jádra operačního systémuih, která je ve 3. kapitole.

    Ve starších verzích jádra operačního systému, před verzí Linuxu 1.1, je nejjednodušším způsobem, jak zjistit, zda vaše jádro má povolenou podporu systému NFS, vyzkoušet připojit nějaký souborový systém NFS. Za tím účelem můžete třeba v adresáři /tmp vytvořit podadresář a zkusit k němu připojit nějaký místní adresář:

# mkdir /tmp/test

# mount localhost:/etc /tmp/test

    Pokud tento pokus o připojení místního adresáře selže a objeví se zpráva "fs type nfs no supported by kernel", pak bude třeba vytvořit nové jádro operačního systému s povolenou podporou systému NFS. Jakékoliv další chybové zprávy jsou naprosto neškodné, protože jste zatím na svém hostiteli nenakonfigurovali démony systému NFS.

11.2 Připojení svazku systému NFS

Svazky systému NFS se připojují podobně, jako běžné souborové systémy. Spustíte příkaz

mount, který bude mít následující syntaxi:

# mount -t nfs nfs_volume local_dir options

    Svazek nfs_volume je předán ve tvaru remote_host:remote_dir (vzdálený_hostitel:vzdálený_adresář). Protože je tento zápis jedinečný pro systémy NFS, můžete vynechat volbu -t nfs.

    Existuje také spousta doplňkových voleb, které můžete při připojování svazku systému NFS použít v příkazu mount. Tyto volby mohou buď následovat na příkazové řádce za přepínačem -o, nebo je lze pro daný svazek uvedést v příslušné položce voleb v souboru /etc/fstab. V obou případech se více voleb navzájem odděluje čárkami. Volby zadané na příkazové řádce vždy potlačí volby, které jsou uvedeny v souboru fstab.

Vzorová položka v souboru fstab může vypadat takto:

# svazek připojovací bod typ volby

news:/usr/spool/news /usr/spool/news nfs timeo=14,intr

Pak lze tento svazek připojit za pomoci příkazu

# mount news:/usr/spool/news

    Pokud by v souboru fstab nebyly uvedeny žádné volby, bylo by použití příkazu mount na systém NFS složitější. Předpokládejme například, že si chcete připojit domovské adresáře svých uživatelů z počítače moonshot, který používá pro operace čtení/zápis implicitní velikost bloku 4 KB. Velikost bloku můžete snížit pomocí následujícího příkazu na 2 KB, aby vyhovovala omezení vztahujícímu se na velikosti datagramu v operačním systému Linux:

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

    Kompletní seznam všech korektních voleb je popsán na stránkách manuálu nfs(5), jenž je součástí nástroje mount od Ricka Sladkeyho. Tento nástroj spolupracuje se systémem NFS (najdete ho v balíku util-linux od Rika Faitha). Následuje neúplný seznam voleb, které se vám mohou hodit:

    Kromě voleb rsize a wsize všechny výše uvedené volby nastavují chování klienta pro případ, kdy server není dočasně dostupný. Tyto volby spolu souvisí následovně: kdykoliv klient pošle požadavek na server NFS, očekává, že bude operace dokončena v daném časovém limitu (ten udává volba timeout). Pokud v tomto intervalu nepřijde žádné potvrzení, nastane tzv. vedlejší překročení časového limitu (minor timeout) a operace se spustí znovu s dvojnásobnou hodnotou časového intervalu. Po dosažení maximálního časového intervalu 60 sekund dojde k tzv. hlavnímu překročení časového limitu (major timeout).

    Hlavní překročení časového limitu implicitně způsobí, že klient vypíše na konzolu zprávu a celý proces se bude znovu opakovat, tentokrát ovšem s časovým intervalem rovným dvojnásobku časového intervalu z předchozího pokusu. Teoreticky by tento postup mohl trvat nekonečně dlouhou dobu. Svazky, které se tvrdohlavě pokoušejí opakovat operaci tak dlouho, dokud nebude server opět dostupný, se nazývají pevně připojené svazky. Opačný typ svazků představují tzv. volně připojené svazky, které při překročení hlavního časového limitu vygenerují pro daný volaný proces V/V chybu. Protože se používá opožděný zápis, který jsme si představili společně s vyrovnávací pamětí cache, nebude tato chybová zpráva předána vlastnímu procesu dříve, než bude volána funkce write(2), takže program nemá nikdy jistotu, zda operace zápisu u volně připojeného svazku proběhla správně.

    Zda se má daný svazek připojit pevně anebo volně není jen pouhou otázkou vkusu, ale tato volba musí záviset na typu informací, ke kterým chcete na tomto svazku přistupovat. Pokud si například pomocí systému NFS připojíte programy X, určitě nebudete chtít, aby se vaše relace chovala divně jen proto, že někdo zablokoval Síť například současným spuštěním sedmi kopíí programu xv nebo krátkodobým vytáhnutím ethernetové zástrčky. Když tento svazek připojíte pevně, budete mít jistotu, že váš počítač bude čekat tak dlouho, dokud se znovu neobnoví spojení s vaším server NFS. Na druhou stranu mohou existovat volně připojené svazky, které neobsahují kritická data, příkladem může být připojení části news pomocí systému NFS nebo připojení archívů protokolu FTP. Pokud nebude vzdálený počítač dočasně dosažitelný, nebo pokud bude vypnutý, nezablokuje volné připojení svazků vaši relaci. Je-li vaše spojení se serverem nestálé nebo prochází přes vytížený směrovač, můžete buď zvšišt počáteční hodnotu časového intervalu (pomocí volby timeo), nebo můžete dané svazky připojit pevně, avšak zároveň musíte povolit signály přerušující volání systému NFS, protože jinak nebudete moci přerušit zablokovaný přístup k souboru.

Démon mountd bude obvykle nějakým způsobem informován o tom, které adresáře jsou připojeny kterým hostitelem. Tyto informace lze zobrazit za pomoci programu showmount, který je taktéž součástí balíku serveru systému NFS.

11.3 Démoni systému NFS

    Pokud chcete službu NFS poskytovat i ostatním hostitelům, musíte mít na svém počítači spuštěny démony nfsd a mountd. Protože se jedná o programy založené na balíku RPC, nejsou spravovány super serverem inetd, ale jsou spouštěny při procesu zavádění systému a sami se registrují pomocí mapovače portů. Proto se musíte ujistit, že je spouštíte až po spuštění démona rpc.portmap. Obvykle se do souboru rc.inet2 přidají následující dvě řádky:

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

    Informace o vlastnictví, které poskytuje démon systému NFS svým klientům, obvykle obsahují pouze číselná id uživatele a skupiny. Pokud klient i server sdruží s těmito číselnými id shodné názvy uživatelů a skupin, potom říkáme, že sdílejí stejný prostor uid/gid. Příkladem tohoto sdílení může být použití systému NIS k distribuci informací ze souboru passwd všem hostitelům ve vaší lokální síti.

    V některých případech se však tato čísla neshodují. Potom spíše aktualizujte čísla uid a gid na straně klienta tak, aby odpovídala číslům na straně serveru. K tomuto účelu můžete použít mapovacího démona ugidd. Použijete-li níže popsanou volbu map_daemon, řeknete tím démonu nfsd, že má prostor uid/gid nacházející se na serveru přiřadit k prostoru uid/gid, který se nachází na straně klienta. K této operaci se využije démona ugidd, který je spuitiný na straně klienta.

Démon ugidd je server založený na balíku RPC a spouští se ze souboru rc.inet2, stejně jako démoni nfsd a mountd.

if [ -x /usr/sbin/rpc.ugidd ]; then

/usr/sbin/rpc.ugidd; echo -n ln ugiddll

fi

11.4 Soubor exports

    Zatímco výše uvedené volby se týkají konfigurace systému NFS na straně klienta, na straně serveru existuje odlišná skupina voleb, které konfigurují jeho chování vůči klientovi. Tyto volby musí být nastaveny v souboru /etc/exports.

Démon mountd implicitně nepovolí žádnému uživateli připojení adresářů z místního hostitele, což je poměrně rozumný přístup. Chcete-li jednomu nebo více hostitelům povolit připojení adresáře pomocí systému NFS, musí být tento adresář exportován, což znamená, že musí být uveden v souboru exports. Vzorový soubor exports by mohl vypadat následovně:

# soubor exports pro vlager

/home vale(rw) vstout(rw) vlight(rw)

/usr/X386 vale(ro) vstout(ro) vlight(ro)

/usr/TeX vale(ro) vstout(ro) vlight(ro)

/ vale(rw,no root squash)

/home/ftp (ro)

    Každá řádka definuje adresář a hostitele, kteří si ho mohou připojit. Název hostitele je obvykle plně kvalifikovaným doménovým jménem, ale kromě toho může obsahovat i zástupné znaky * a ?, které fungují stejným způsobem, jako v příkazovém interpretu bash. Například adrese lab*.foo.com vyhovuje jak adresa lab01.foo.com, tak i adresa laber.foo.com. Pokud není zadán žádný název hostitele, jako tomu bylo ve výše uvedeném příkladu s adresářem /home/ftp, potom si budou moci tento adresář připojit všichni uživatelé.

    Při ověřování klienta pomocí souboru exports vyhledá démon mountd název hostitele klienta pomocí volání procedury gethostbyaddr(2). V systému DNS vrátí tato procedura kanonický název hostitele klienta, takže je třeba se ujistit, že v souboru exports nepoužíváte žádné přezdívky. Bez použití systému DNS bude vrácený název odpovídat prvnímu nalezenému názvu v souboru hosts, který odpovídá adrese klienta.

    Za názvem hostitele může následovat volitelný seznam příznaků oddělených čárkami a uzavřený do kulatých závorek. Tyto příznaky mohou nabývat následujících hodnot:

    Chyba zjištěná při analýze souboru exports bude zapsána do souboru syslog s úrovní notice (oznámení). Tato chyba se zapíše vždy, když je spuštěn démon nfsd nebo mountd.

    Pamatujte, že názvy hostitelů jsou získány z IP-adresy klienta pomocí zpětného mapování, takže je nutné mít správně nakonfigurovaný resolver. Pokud používáte službu BIND a zakládáte si na bezpečnosti, měli byste v souboru host.conf povolit kontrolu spoofingu.

11.5 Automatické připojování (automounter) v operačním systému Linux

    V některých případech není hospodárné připojovat všechny svazky systému NFS, ke kterým by mohli chtít uživatelé přistupovat; buď z důvodu pouhého množství připojovaných svazků, nebo z důvodu časové prodlevy, kterou by si tento proces vyžádal při zavádění systému.

    Schůdnou alternativou řešení tohoto problému je tzv. démon automatického připojování. Jedná se o démona, který podle potřeby automaticky a zcela transparentně připojuje libovolné svazky systému NFS a taktéž je automaticky odpojuje, pokud nebyly po určitou dobu používány. Další šikovnou vlastností, kterou disponuje démon automatického připojování, je možnost připojení určitého svazku z alternativních míst. Například kopie programů X a podpůrných souborů je možné uchovávat pouze na dvou nebo třech hostitelích a všichni ostatní hostitelé si tyto programy a podpůrné soubory připojí pomocí systému NFS. Když k tomuto účelu použijete démona automatického připojování, můžete všechny tři hostitele namapovat do adresáře /usr/X386; démon automatického připojování se potom bude zkoušet připojit ke všem třem hostitelům, dokud se k některému nepřipojí.

    Běžně používaný démon automatického připojování se v Linuxu nazývá amd. Původně ho napsal Jan-Simonem Pendry a na platformu Linuxu ho portoval Rick Sladkey. Aktuální verze tohoto démona je amd-5.3.

    Vysvětlení démona amd přesahuje rozsah této kapitoly; jako dobrý manuál by vám však mohl posloužit jeho zdrojový kód; tento zdrojový kód obsahuje soubor s textovými informacemi, které jsou velmi podrobné.

Previous Content Next Up