NFS (Network FileSystem)

Jiří Denemark, xdenemar@fi.muni.cz


Obsah


RPC (Remote Procedure Call)

RPC, protokol pro vzdálené volání procedur vyvinutý firmou Sun Microsystems, je definován v RFC 1050 (verze 1) a RFC 1831 (verze 2). Každá RPC služba je jednoznačně určena svým číslem. Seznam služeb a jejich čísel se nachází v souboru /etc/rpc. O registraci služeb na straně serveru se stará portmapper (démon portmapd).

Klient, který chce využít nějakou službu, nejprve zkontaktuje portmapper a ten mu odpoví zda a na jakém portu je požadovaná služba dostupná. Poté klient na tento port odešle svůj požadavek na spuštění nějaké procedury a po jejím vykonání dostane výsledek. Z důvodu použitelnosti v heterogenním prostředí se pro výměnu dat mezi serverem a klientem používá standard XDR (eXternal Data Representation, RFC 1014), který definuje strojově nezávislý způsob výměny binárních dat.

RPC je využíváno hlavně v NFS.


NFS (Network FileSystem)

NFS od Sun Microsystems poskytuje transparentní přístup k souborům umístěným na různých strojích v různých částech sítě.

Verze

NFS verze 1
První verze, v praxi nebyla nikdy použita.
NFS verze 2
První distribuční verze definovaná v RFC 1094.
NFS verze 3 (RFC 1813)
Oproti předchozí verzi, která fungovala nad UDP umožňuje i provoz nad TCP, přidává některé funkce, např. MKNOD (vytváření speciálních souborů) a COMMIT (obdoba sync()).
NFS verze 4 (RFC 3010)
Právě vyvíjená verze NFS. Narozdíl od starších verzí podporuje tradiční přístup k souborům a jejich zamykání a kešování na straně klienta. Jména souborů a adresářů jsou kódována v UTF-8. Výrazně je zvýšena také bezpečnost.
Systém používá RPC verze 2.

Linux podporuje NFS verze 2 a 3 jako klient i server.

Jak to funguje

Protokol NFS je navržen jako bezestavový, což znamená, že server si nemusí pamatovat vůbec nic. Pouze provádí požadavky, které mu přichází a nemusí vůbec nic vědět o tom, jaký k sobě tyto požadavky mají vztah. Vzhledem k tomu, že ve většině případů běží nad UDP, musí být server schopen zvládnout duplicitní požadavky.

Každý požadavek musí obsahovat veškeré informace nutné pro jeho vykonání. Například požadavek na zápis do souboru musí obsahovat identifikaci souboru, pozici, na kterou se mají data zapsat, velikost dat a samozřejmě samotná data.

Komunikace s NFS serverem probíhá na dvou úrovních. Nejprve je potřeba pomocí mount protokolu připojit adresářový strom, se kterým se bude pracovat. Stejně jako vlastní NFS využívá i tento protokol RPC. Při požadavku na připojení adresáře dojde k autentizaci klienta a poté je mu předán identifikátor kořenového adresáře, který se poté použije při komunikaci protokolem NFS.

Jakmile je strom připojen, může začít komunikace protokolem NFS, který již obsahuje příkazy pro práci se soubory.

Konfigurace

Server

Hlavním konfiguračním souborem pro server NFS je /etc/exports(5). Tento soubor obsahuje záznamy ve tvaru:

    directory machine1(option11,option12,...) machine2(option21,option22,...) ...
kde
directory
je adresář, který chceme zpřístupnit pomocí NFS
machineX
DNS nebo IP adresa stroje, pro který chceme daný adresář zpřístupnit. Zadávání většího počtu strojů si lze zjednodušit hned několika způsoby:
optionX
může být některá z následujích voleb:
ro Z této stanice nebude umožněn zápis do daného adresáře
rw Adresář bude zpřístupněn jak pro čtení tak pro zápis
no_root_squash Root na klientovi bude mít stejný přístup k souborům jako by to byl root na serveru. Implicitně je to vypnuté a požadavky od uživatele root budou považovány za požadavky od uživatele nobody. Hlavní využití je pro bezdiskové stroje.
no_subtree_check Vypíná kontrolu příslušnosti požadovaného souboru do exportovaného stromu. Pokud je zpřístupněn celý diskový oddíl, urychlí tato volba zpracování na serveru.
sync Po každém zápisu na disk se provede sync(), čímž se zajistí, že data byla opravdu zapsána na disk, ale zpomalí odezvu.
Při použití NFS verze 3 lze volání sync() vynutit pro každý zápis zvlášť pomocí RPC procedury COMMIT.

Pro chod NFS serveru je třeba spustit následující tři démony: rpc.portmap (někdy též portmap), mountd (nebo rpc.mountd) a nfsd (někdy rpc.nfsd). Pomocí příkazu rpcinfo -p si lze vypsat seznam zaregistrovaných RPC programů a ověřit, zda mezi nimi jsou i mountd a nfsd.

Klient

NFS klient nepotřebuje žádnou zvláštní konfiguraci, stačí pouze připojit exportovaný adresář pomocí příkazu mount například takto

    mount -t nfs server.domain:/exported/directory /mnt/nfs
Při připojování je možno zadat některé zajimavé volby:
rsize=n
wsize=n
Určují velikost datagramů, které budou použity pro čtení resp. zápis.
hard Pokud dojde ke spadnutí serveru, bude program přistupující k souboru přes NFS čekat až se znovu podaří navázat spojení se serverem. Pokud zaroveň nebyla zadána volba intr nebude možné takovýto program přerušit.
soft Při selhání požadavku bude procesu vrácena chyba a ten se s tím musí vyrovnat. Tato volba se nedoporučuje, protože může dojít k poškození souborů nebo ztrátě dat.
intr Viz. hard.

Výsledný příkaz pak může vypadat třeba takto

    mount -t nfs -o ro,hard,intr,rsize=8192 server.domain:/exported/directory /mnt/nfs


Automount

V některých případech, např. pokud přes NFS připojujeme domovské adresáře uživatelů, by bylo lepší, pokud by nebyly všechny adresáře připojeny pořád, ale připojil by se vždy jen ten, se kterým se zrovna pracuje a poté by se zase odpojil. Pro tyto účely se hodí démon automount, který v případě potřeby připojuje libovolné svazky v systému a po nějaké době nečinnosti je zase odpojuje.

Démon se spouští skriptem /etc/init.d/autofs, který přečte soubor /etc/auto.master a pro každý v něm uvedený mount point spustí automount s potřebnými parametry.

Formát souboru /etc/auto.master je následující:

    mount_point map_type:map_name options
kde
mount_point
Je místo pro připojení svazků.
map_type:map_name
Mapa, podle které se bude připojování řídit.
options
Nepoviné volby, které se předají démonu automount.
Příklad souboru /etc/auto.master
    /auto       /etc/auto.misc
    /mnt        yp:mnt.map

Soubor /etc/auto.misc pak může vypadat například takto:

    home        -ro,soft,intr           server.domain:/home
    cd          -fstype=iso9660,ro      :/dev/cdrom
    zip         -fstype=auto            :/dev/hdd4
kde první sloupec je klíč a určuje kam se daný souboový systém připojí (např. /auto/home), druhý sloupec udává parametry pro připojení svazku (viz. mount(8)) a třetí sloupec popisuje co se bude připojovat.