RPC, NFS, Autofs, AMD

Jan Kuběja, xkubeja@fi.muni.cz


Obsah


RPC

Vzdálené volání procedur (Remote Procedure Calls) slouží k volání procedur v jiných procesech, ,které typicky ani nemusí běžet na stejném počítači. Dálková volání procedur představují systémová volání, která zajišťují kompletní správu požadavků mezi klientem a serverem. Technologie RPC je standardním mechanismem, který mohou využít všechny klientské stanice pro připojení k serveru. Klient od severu zjistí, na kterou aplikaci mají být RPC volání přesměrována. Chcete-li sdílet určitou aplikaci na serverum, musíte ji zaregistrovat u správce RPC, kterému se říká portmapper, mapovač portů, nebo také RPC library dispatcher. Hlavním úkolem portmapperu je sdělit klientovi současné umístění aplikace na serveru. Portmapper je deamon, jehož umístění bývá
/usr/sbin/portmap
nebo
/sbin/portmap
Také bývá program pojmenován rpc.portmap,místo portmap. Samotné volání se skládá z několika částí:
  1. Zabalení parametru a identifikace procedury do formy, která je vhodná pro prenos po síti (marshalling)
  2. Poslání vytvořeného balíčku k jinému procesu
  3. Vybalení identifikace procedury a jejich parametru (unmarshalling)
  4. Provedení procedury
  5. Zabalení návratove hodnoty do formy, ktera je vhodná pro přenos po síti
  6. Poslání vytvořeného balíčku k volajícímu procesu
  7. Vybalení návratove hodnoty
  8. Vrácení teto hodnoty volající proceduře
To, že se volání provádí mezi dvěma počítači (adresovými prostory), přináší následující problémy: Jak se dají tyto problémy řešit?
Také je potřeba aby obě strany, klient i server, chápaly tytéž data stejně, tj nezávisle na stroji, op. systému,... Sun pro svou realizaci svého RPC mechanismu využívá standardu XDR, který je popsán v RFC 1832. Jedná se o XDR (eXternal Data Representation), standard pro popis a kódování dat, který vznikl právě na problému přenosu dat mezi počítači s různými architekturami, což vyvolává hlavní otázku, jak to je s endianitou dat, atd... XDR používá jednotný jazyk, kterým data popisuje, viz. rfc 1832.

Jestli vám RPC běží poznáte pomocí příkazu rpcinfo(8).
[xkubeja@nymfe38 xkubeja]$ /usr/sbin/rpcinfo -p
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  32768  status
    100024    1   tcp  32771  status
    100021    1   udp  32769  nlockmgr
    100021    3   udp  32769  nlockmgr
    100021    4   udp  32769  nlockmgr
    100011    1   udp    877  rquotad
    100011    2   udp    877  rquotad
    100011    1   tcp    880  rquotad
    100011    2   tcp    880  rquotad
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100005    1   udp    891  mountd
    100005    1   tcp    894  mountd
    100005    2   udp    891  mountd
    100005    2   tcp    894  mountd
    100005    3   udp    891  mountd
    100005    3   tcp    894  mountd
    391002    2   tcp  32777  sgi_fam



NFS

Network File System byl vytvořen za účelem možnosti vzdáleného připojení např. diskových oddílů jiného počítače prostřednictvím počítačové sítě a rodiny protokolů TCP/IP. Princip síťového souborového systému si objasníme na následujícím příkladu.

Chceme-li prostřednictvím NFS sdílet adresář /export/home/johnny na serveru derrick a chcemeli, aby se jevil jako místní adresář /home/johnny, zadáme:

$ mount -t nfs derrick:/exports/home/johnny /home/johnny V případě úspěšného použití příkazu mount bychom měli mít přístup do adresáře /home/johnny a mělibychom také mít stejné možnosti co se týče práce se soubory, jako kdybychom s nimi pracovali přímo na stroji derrick.

Tak to byl rychlý úvod, teď trochu podrobněji. NFS je postaven na slavném,výše popsaném mechanismu jménem RPC. S trochou nadsázky by se dalo říci, že RPC vzniklo kvůli NFS. Ovšem není tomu tak. Na mechanismu RPC je postaveno ještě několik významných služeb, zejména NIS.

Proces, ve kterém se klient připojí k diskovému oddílu na serveru, má několik kroků:
  1. Klient se připojí k portmapperu, který běží na serveru, aby zjistil, který port je nastaven jako služba pro připojení NFS.
  2. Klient kontaktuje tuto službu a žádá o připojení diskového oddílu. Služba ověří, zda má uživatel právo diskový oddíl připojit. Přístupová práva jsou zapsána v konf. souboru /etc/exports. Má-li uživatel příslušná práva, vygeneruje připojovací služba hlášení potvrzující provedení požadavku.
  3. Klient se opět připojí k portmapperu aby zjistil, ke kterému portu je připojen.
  4. Kdykoliv klient posílá požadavek na NFS server (např. čtení z adresáře,...), jsou NFS serveru zaslány příslušné požadavky, právě ve formě RPC volání.
  5. Klient po ukončení práce aktualizuje své tabulky připojení, server však neinformuje, viz následující.

Upozorňovat server není nutné, protože nearchivuje informace o všech klientech, kteří k němu své souborové systémy připojili. Protože server nemá k dispozici informace o právě připojených klientech a naopak - klienti nemají přehled o stavu serveru, nelze z pohledu serveru ani klientských stanic rozlišit mezi "spadlým" a opravdu pomalým systémem. Je-li NFS server restartován, všichni uživatelé budou moci automaticky pokračovat v práci na sdílených diskových oddílech, jakmile se server opět uvede do provozu.

NFS verze

NFS představuje ustálený protokol - RFC 1094. Normalizační komise pracují na tom, aby NFS odpovídal požadavkům nových technologií a uživatelů. Současně používanou verzí je 3.0. Zároveň se rozjíždí verze 4.0. Linux podporuje verze 2 a 3 možná i 4 (?). Většina operačních systémů, které NFS podporují, umí velmi pravděpodobně pracovat s verzí 2.0.

Konfigurace NFS serveru

Programy - deamony:
Konfigurace serveru probíhá nastavením souboru /etc/exports. To je jediný konf. soubor NFS serveru. V tomto souboru je uveden seznam diskových oddílů, které lze sdílet, seznam uživatelů, kteří je smí sdílet a jejich přístupová práva. Formát každé položkz je následující:
/dir/to/export	client1(permissions)	client2(permissions) ...
Tyto položky mají jako oddělovač nový řádek. /dir/to/export je adresář ke sdílení, client1 je jméno stanice klienta, permissions jsou přístupová práva oddělena čárkami. Přístupová práva: Chceme li aby NFS server nacetl změny v konfiguraci, bez nutnosti jeho restartu, použijeme příkaz exportfs -a. Lze jej také použít jako příkazovou alternativu k souboru exports. Více exports(5), exportfs(8).
NFS server se v linuxu ovládá skriptem /etc/rc.d/init.d/nfs.

Konfigurace NFS klienta

Klientské stanice lze nakonfigurovat poměrně lehce, protože není nutné instalovat další software. Jedinou podmínkou správné funkce je kompilace jádra s podporou pro NFS. Všechny distribuce linuxu se standardně dodávají s povolenou podporou NFS. Klienti si připojují diskové oddíly pomocí příkazu mount(8). A to buď automaticky při startu systému - pomocí konf. souboru /etc/fstab fstab(5), nebo automaticky pomocí automounteru (automount(8),nebo amd(8)), nebo manuálně - v shellu, viz. příklad výše. Příklad souboru /etc/fstab:

Automount

Automount(8) je daemon, který nám umožňuje automaticky připojovat či odpojovat jak lokální diskové svazky, tak i NFS-sdílené d. svazky. Hlavní konf. soubor je /etc/auto.master, viz auto.master(5). Každý řádek v tomto souboru popisuje který mountpoint (adresář) je popsán ve kterém vedlejším konf. souboru, ten již popisuje, které souborové systémy se pod jakým jménem adresáře mohou připojit. Je to celkem intuitivní konfigurace, uvedu příklady:
[xkubeja@nymfe38 xkubeja]$ cat /etc/auto.master
# $Id: auto.master,v 1.2 1997/10/06 21:52:03 hpa Exp $
# Sample auto.master file
# Format of this file:
# mountpoint map options
# For details of the format look at autofs(8).
/mnt                    /etc/auto.mnt           --timeout 3
/misc                   /etc/auto.tmpnymfe      --timeout 3
/packages               /etc/auto.packages      --timeout 10800
/net/anxur              /etc/auto.anxur         --timeout 60
/home                   /etc/auto.home          --timeout 10800
/net/afs                /etc/auto.afs           --timeout 60
/net/afs_software       /etc/auto.software      --timeout 60
/net/news               /etc/auto.news          --timeout 60
/net/atlas/home         /etc/auto.atlas         --timeout 10800
/net/aisa               /etc/auto.aisa          --timeout 300
/net/anxur1             /etc/auto.anxur1        --timeout 300

Tímto admini stroje nymfe38 říkají, že mountpoint /mnt má konfiguraci v souboru /etc/auto.mnt a dále zde uvádí parametr daemonu automount --timeout 3, tj. timeout je zde 3 vteřiny, implicitně bývá 5 minut (ovšem uvádí se to ve vteřinách). Takže automount tímto ví, že když všechny procesy opustí připojený filesystem z tohoto mountpointu, tak pokud ještě počká 3 vteřiny a pak teprve daný filesystem odpojí.

Podívejme se tedy blíže na mountpoint /home, tedy ptáme se souboru /etc/auto.home, co nám o něm řekne:
[xkubeja@nymfe38 xkubeja]$ cat /etc/auto.home
*       -rw,soft,intr   atlas.fi.muni.cz:/export/home/&

Tady vidíme, že z tohoto mountpointu je přístupný přes adresář * podstrom /export/home/& přes NFS z NFS-serveru atlas.fi.muni.cz. To jsme zrovna kápli na speciální případ - znaky * a & zde mají speciální význam. * znamená 'cokoliv' , a & se vždy nahradí tím řetězcem, kterým začíná řádek, na němž se vyskytuje, v tomto případě se substituuje za řetezec použit místo hvězdičky. Tento zápis zkracuje v dané situaci konfiguraci, neboť je pro všechny uživatele, mající svůj home na atlasu stejná.

Uvedu příklad. Nechť na atlasu existuje adresář /export/home/user. Potom, když jsem na tomto stroji (nymfe38) a provedu
[xkubeja@nymfe38 xkubeja]$ cd /home/user
připojí se mi na toto místo (do adresáře /home/user, na nymfe38) podstrom /export/home/user ze stroje atlas.fi.muni.cz.

Pochopitelně, automount ke každému připojení používá příkaz mount(8), a chceme li mu dát nějaké parametry (mimo ty základní - tj. co kam připojit), napíšeme je do druhého sloupce, tedy v našem případě vidíme parametry -rw,soft,intr.

Démon automount se v linuxu ovládá pomocí skriptu autofs(8).
/etc/init.d/autofs

Amd

Amd (Auto Mount Daemon) je podobný automounter jako Automount. Používá se hlavně na BSD systémech. Hlavní konfigurační soubor je /etc/amd.conf, vypsán níže, formát je značně podobný s hlavním konf. souborem automountu (/etc/auto.master). Více viz amd.conf(5).
[xkubeja@gorgo04 xkubeja]$ cat /etc/amd.conf
[ global ]
auto_dir = /amd
restart_mounts = yes
cache_duration = 5
dismount_interval = 5
log_file = syslog
log_options = all
map_type = file

[ /home ]
map_name = /etc/amd.home

[ /packages ]
map_name = /etc/amd.packages

[ /net/aisa ]
map_name = /etc/amd.aisa

[ /mnt ]
map_name = /etc/amd.mnt
Tento soubor nám podobně sděluje, že je zde mountpoint /home a je nakonfigurován v souboru /etc/amd.home. Pátrejme dál.
[xkubeja@gorgo04 xkubeja]$ cat /etc/amd.home
*               type:=nfs;rhost:=atlas;rfs:=/export/home/${key};opts:=rw,grpid,resvport,vers=2,proto=udp,nosuid,nodev,utimeout=900

Tento soubor nám říká již podrobné informace o tomto mountpointu, opět stojí za povšimnutí fakt, že syntax je podobná jako v případě automountu (viz. výše, soubor /etc/auto.home ), akorát tu je pár změn na kráse: rhost:=atlas;rfs:=/export/home/${key}; říká to samé jako v případě automountu, jen místo znaku & se zde píše ${key} a jinak ostatní věci na řádku jsou ty 'druhořadé' parametry pro mount(8).