NFS Ganesha

Z DCEwiki
Skočit na navigaci Skočit na vyhledávání

NFS Ganesha je opensource NFS server s podporou všech aktuálně používaných verzí NFS protokolu (v3,v4.0,v4.1,v4.2,pNFS) a protokolu 9P (Plan9).

Upozornění NFS Ganesha je NFS server, který běží v uživatelském prostoru, nikoliv v jádře! V linuxovém prostředí se většinou používá NFS server nfsd, který běží jako proces v linuxovém jádře[1]. Na to je třeba dát pozor, neboť tyto servery nemohou- bez toho aniž by to bylo ošetřeno v konfiguraci - běžet na jednom stroji současně. Oba servery totiž ve výchozím stavu naslouchají na stejném síťovém portu 2049.

V oficiálních repozitářích Debianu NFS Ganesha - na rozdíl od GlusterFS - zatím k dispozici není, i když od verze 2.2 jsou součástí zdrojového kódu i soubory potřebné pro sestavení balíku na Debianu. Vývoj je totiž stále poměrně živý. Konfigurační nastavení dosud není ustálené a v detailech se mezi jednotlivými verzemi liší. A pokud se v konfiguraci objeví parametr, který parser nezná, nebo neumí zpracovat, tak to má vliv na nastavení serveru, případně se ani nespustí.

Takhle jsem se kupř. zasekal na parametru Squash. V ukázkovém příkladu bylo No_Root_Squash, ale Ganesha akceptoval pouze No_root_squash. NFS server se sice spustil, ale připojení bylo jen pro čtení, ačkoliv mount vypisoval, že je připojení rw


GlusterFS + NFS Ganesha a Pacemaker

NFS Ganesha je vyvíjen jako NFS server pro clusterové prostředí, proto má novější GlusterFS (>=3.7.6), který vyvíjí fa. Red Hat i jakousi podporu pro automatickou konfiguraci exportů, kterou zajišťuje přes Pacemaker - tedy přesněji řečeno přes jeho ovládací CLI pcs. Bohužel se mi to nepodařilo rozběhat, jelikož pcs nemám v sestavení Pacemakeru, který používám, k dispozici.


Sestavení ze zdrojových kódů

Zdrojové repozitáře NFS Ganesha jsou v gitu a pro sestavení se používá cmake. Kromě výchozího git repozitáře nfs-ganesha.git je součástí i samostatný submodul pro knihovnu libntircp

Upozornění V současné době (čerstvě po vydání verze 2.3.0) je třeba vzít při kompilaci v patrnost následující body:
  • Naklonovaný repozitář nemá větev master nastavenou na nejčerstvější verzi serveru, ale na verzi 2.2.0. Přičemž ale až verze 2.3.0 řeší některé záležitosti spojené s GlusterFS, které řeší výkon i paralelizaci.
  • Ani ve verzi 2.3.0 (vydané 27. října 2015) ještě není opraven problém s parsováním nastavení serveru pro vybrané IPv4 subnety. (Řešení jsem našel v mailu od Johannese Fuchse, který reagoval na podobný problém https://www.mail-archive.com/nfs-ganesha-devel@lists.sourceforge.net/msg00769.html - viz poznámka u kompilace zdrojového kódu

Naklonování repozitářů

git clone https://github.com/nfs-ganesha/nfs-ganesha.git
cd ~/nfs-ganesha.git
git submodule update --init
git checkout -b v2.3.0 remotes/origin/V2.3.0
cd src/libntirpc
git checkout -b v1.4.0 remotes/origin/V2.3.0
git submodule update
Poznámka {{{1}}}

Doinstalování balíků potřebných ke kompilaci

Základní sada balíků potřebných pro kompilaci a uspokojení závislostí:

apt-get install \
	bison \
	cmake \
	flex \
	libattr1-dev \
	libblkid-dev \
	libdbus-1-dev \
	libdbus-c++-dev \
	libdbus-glib-1-dev \
	libcap-dev \
	libjemalloc-dev \
	libkrb5-dev \
	libncurses5-dev \
	libnfsidmap-dev \
	libnfsidmap-dev  \
	uuid-dev

Dále je třeba doinstalovat balíky pro sestavení požadovaných backendů (FSAL):

  • Pro zakompilování podpory pro GlusterFS musí být k dispozici jeho API, které je součástí instalačního balíčku - glusterfs-common
  • Aby NFS Ganesha mohl spolupracovat s klientem Samba4 je potřeba zakompilovat podporu pro Winbind4 (MSPAC_SUPPORT) - libwbclient-dev
  • Podporu pro Lustre jsem nekompiloval
  • Podporu pro XFS jsem nekompiloval
  • Podporu ZFS (libzfswrap_init) jsem nekompiloval
Poznámka Toto jsou aktuální názvy instalačních balíků Debianu unstable. Do budoucna není vyloučeno, že se jejich názvy mohou drobně změnit, proto si vždy před instalací zkontrolujte, pod jakým názvem máte potřebné instalační balíky k dispozici.

Kompilace

Pro sestavení na Debianu je třeba použít malou fintu, kterou jsem našel na https://wiki.mosuma.com/wiki/Nfs-ganesha

A totiž, že se aplikace sestavuje v paralelně umístěném adresáři build

mkdir ~/build
cd ~/build
cmake \
-DUSE_FSAL_GLUSTER=ON \
-DCMAKE_BINARY_DIR=/usr \
-DCMAKE_BUILD_TYPE=Maintainer ~/nfs-ganesha.git/src/
Upozornění Pokud jsou v průběhu konfigurace doinstalovávány některé knihovny, je třeba před novým spuštěním cmake smazat tyto soubory...
CMakeCache.txt
CPackConfig.cmake
CPackSourceConfig.cmake
Pro sestavování binárních balíčků lze s výhodou využít overlay systému. Díky tomu lze pak bez problémů odseparovat to co bylo nainstalováno před kompilací a co patří k instalaci aplikace.


NFS Ganesha - konfigurace

Démon ganesha.nfsd pokud nemá na příkazové řádce určeno jinak, hledá při spuštění statický konfigurační soubor ganesha.conf v adresáři /etc/ganesha. Dodatečně ho lze konfigurovat prostřednictvím rozhraní DBus - to ovšem umí až novější verze a v systému musí být nainstalované příslušné řídící skripty. Více o tom, bude pojednáno níže.

ganesha.conf

Je výchozí konfigurační soubor, který může obsahovat veškerou konfiguraci serveru, ale také si ji může pomocí direktivy %include natahovat ze samostatných souborů. Viz ukázkový příklad jejího použití pro natažení obsahu souboru export.conf z adresáře /etc/exporty_ganesha :

%include "/etc/exporty_ganesha/export.conf"
Upozornění Veškeré změny ve statické konfiguraci jsou akceptovány pouze při startu. Pokud není ošetřena změna dynamicky přes DBus rozhraní, je nutno provést restart služby ganesha.nfsd!

Syntaxe konfiguračních souborů

  • Konfigurační soubor(y) mohou obsahovat libovolné UTF-8 znaky
  • Lze u nich používat komentáře. Jako komentář se bere jakýkoliv text na řádku, který následuje znak mřížky ( # )
  • Jednotlivé položky v konfiguraci je rozděleny do bloků. Každý blok začíná názvem bloku, který následují složené závorky. Např.
FSAL {
 ...
}
  • Uvnitř bloku jsou parametry, kterým se přiřazují hodnoty rovnítkem =. Obsah parametru musí být vždy ukončen středníkem. Viz kupř.
Name = "Obsah parametru" ;
  • Parametry mohou být uvedeny čistě malými písmeny, ale interně jsou konvertovány podle pravidla, že začínají kapitálkou, tudíž je vhodné používat tuto konvenci rovnou.
  • Obsahem parametru mohou být pouze alfanumerické znaky, podtržítka ( _ ), pomlčky ( - ) a tečky ( . ). Je-li obsahem řetězec, musí být uzavřen do uvozovek.
  • Obsahem parametru může být i seznam (list), jako např. u parametru Clients v bloku CLIENT. Jednotlivé položky seznamu jsou odděleny čárkou - ( , )
Clients = 192.168.0.10, 192.168.1.0/8;
  • Kromě parametrů mohou být součástí některých typů bloků i podbloky, pro které platí totéž co pro bloky.
  • Jaké jsou použitelné bloky a jaké mají parametry - včetně vlastnosti jejich obsahu (jestli to má být řetězec, nebo číslo) je popsáno v souboru /usr/share/doc/ganesha/config_samples/config.txt
Upozornění Kulaté závorky se v konfiguračním souboru NFS Ganesha nepoužívají!

Konfigurační bloky

Nastavení NFS protokolů
Pro konfiguraci připojení přes NFS a P9 jsou určené bloky NFS_CORE_PARAM, NFS_IP_NAME, NFS_KRB5 a NFSV4
Plan9
NFS Ganesha umí fungovat i jako server pro Plan9 protokol. Ten ve výchozím stavu funguje přes port 564 (TCP) a 5640 (RDMA). Blok P9 dovoluje tato výchozí čísla portů změnit. Kromě toho také umožňuje změnit některé parametry pro připojení přes RDMA
EXPORT
Jednotlivé položky k exportu se nastavují prostřednictvím bloku EXPORT. Každý takový blok musí být unikátní a mít své vlastní unikátní identifikační číslo (parametr Export_id). EXPORT je základním blokem, kterým se nastavuje co a jak a z jakého úložiště se má exportovat. Úložištěm může být lokální adresář, i datový prostor sdíleného úložiště - vše záleží na tom, jaký je v bloku EXPORT nastaven podblok FSAL. Kdo a s jakými právy může ke sdíleným datům přistupovat se nastavuje v podbloku CLIENT.
Globální parametry pro FSAL
Pro některé typy FSAL lze nastavit parametry i na na globální úrovni. Týká se to clusterových souborových systémů CEPH, GPFS, LUSTRE, PT a z lokálních VFS, XFS a ZFS
Logování
Pro nastavení parametrů logování je určen blok LOG.
Režim PROXY
NFS Ganesha umí fungovat také jako NFS proxy. K tomuto nastavení je určen blok PROXY.

Ověření uživatele přes Kerberos

Aby fungovalo ověřování uživatelů přes Kerberos (knihovna krb5), musí být Kerberos správně nakonfigurován jak na straně serveru, kde běží NFS Ganesha, tak na straně klienta. Pro konfiguraci kerbera se používá blok NFS_KRB5

Jestli Kerberos funguje, lze ověřit takto...

(postup ověření přes kerberos...)

NFS Ganesha pracuje u NFS4 připojení s kerberem v závislosti na tom jak je nastavený parametr SecType:

krb5
Místo lokálního UID a GID se použije nastavení získané po ověření klienta přes Kerbera
krb5i
Kromě ověření se Kerberos pak využívá i během připojení a to tak, že se přes NFS posílají také kontrolní součty, šifrované přes Kerbera, aby tím bylo zajištěno, že do komunikace mezi serverem a klientem se necpe nikdo třetí
krb5p
Kerberos se nepoužije pouze k ověření, ale je jím šifrovaná veškerá komunikace mezi serverem a klientem, což ovšem znamená, že jde i o nejpomalejší variantu spojení, neboť tím stoupá zátěž procesoru jak na straně klienta, tak na straně serveru.


FSAL

FSAL (Filesystem Storage Access Layer) je právě to, čím se NFS Ganesha liší od NFS serveru, který je v kernelu. Pro každý export může být použitý jiný typ FSAL - podle toho jaká data se mají přes NFS zpropagovat:

VFS
Používá souborový systém operačního systému (POSIX). Jeho prostřednictvím lze exportovat soubory z lokálních souborových systémů. Jedinou podmínkou je, že lokální FS musí umět používat zamykání souborů ("file handles"), jako kupř. XFS. Tento FSAL podporuje také pNFS protokol pro souborový systém EXOFS a proprietární PanFS - podmínkou je ovšem jedno sdílené úložiště.
PROXY
NFS Ganesha umí fungovat také v režimu PROXY. Tj. že se sám přes tento FSAL připojí jako klient k jinému NFS serveru a pak pro něj dělá frontend. Kupř. 9P a NFSv3 klienti tak mohou jeho prostřednictvím přistupovat k jinému NFSv4 serveru. Tento FSAL lze využít i pro vzdálený přístup na NFSv4 server přes striktní firewally.
GLUSTER
Je distribuovaný souborový systém, na jehož svazky NFS Ganesha přistupuje přes knihovnu libgfapi. Intenzivně se vyvíjí a NFS Ganesha může běžet na jednom i více nodech GlusterFS. Díky tomu, že nody mohou přistupovat na jeden svazek současně, má NFS Ganesha pro tento FSAL i poporu pNFS. Ovšem s tou podmínkou, že pouze jeden z nodů funguje jako primární NFS server, který spravuje metadata. Ostatní nody fungují pouze jako poskytovatelé dat.
ZFS
ZFS je souborový systém, který dovoluje publikovat úložiště jak ve formě normálního souborového systému, tak jako blokové zařízení. FSAL pro ZFS do něj přistupuje prostřednictvím knihovny libzfswrap přes FUSE. ZFS "pool" lze obsluhovat jak na úrovni diskových oddílů, tak jako normální souborový systém.
CEPH
Je distribuovaný souborový systém, který má podobné vlastnosti jako ZFS. FSAL pro CEPH využívá knihovnu libcephfs a dovoluje exportovat prostřednictvím jednoho NFS serveru i více než jeden CephFS cluster. NFS Ganesha verze 2.0 však pro CEPH dosud nemá plnou podporu pNFS tak jako pro GlusterFS.
LUSTRE
Jde o clusterový souborový systém od fy Oracle, který ovšem předpokládá, že všechny nody mají jedno sdílené úložiště. V současné době ale pro něj není podpora pNFS.
GPFS
Je proprietární distribuovaný souborový systém fy. IBM. FSAL u něj podporuje všechny verze NFS protokolu, včetně NFSv4.2 s podporou pNFS, ovšem jelikož nejde o oficiální produkt je podpora GPFS v3.5 pouze exeprimentální.
HPSS
Je virtuální souborový systém IBM pro přístup k páskovému zálohovacímu systému IBM HPSS.
Poznámka GlusterFS ve výchozím nastavení spouští pro každý svazek NFS server, který je v kernelu. Novější verze GlusterFS už má integrovaný přepínač ganesha (resp. nfs-ganesha) , kterým lze zapnout (nebo naopak zapnout) podporu pro server NFS Ganesha. Jinak bude GlusterFS automaticky spuštět pro NFS export svazků procesy kernelového NFS serveru. Spouštění kernelového NFS servery lze zabránit pouze nastavením parametru nfs.disable na ON v konfiguraci svazku.

CLIENT

Konfigurační podblok CLIENT je v nastavení bloku EXPORT velmi důležité. Ba přímo zásadní! Ve výchozím nastavení totiž NFS Ganesha naslouchá na všech síťových rozhraních. A to nejenom na IPv4, ale také na IPv6 adresách. Pokud tedy v bloku EXPORT povolíte připojení bez autorizace přes Kerbera (sys), tak to znamená, že se k vypublikovanému úložišti bude moct připojit každý klient ze kteréhokoliv stroje. Což v případě veřejné adresy představuje dosti značnou bezpečnostní díru.

Zabránit tomu lze tím, že se v bloku EXPORT nastaví výchozí parametr Access_type na none, a jiná hodnota se povolí až u konfigurace podbloku CLIENT. Totéž platí i pro další parametry bloku EXPORT. Klienta, který nebude splňovat kritéria podbloku CLIENT tak NFS Ganesha rovnou odmítne - bez toho že by se ho vůbec pokoušel ověřit vůči Kerberu.


Server nfs-ganesha používá - pokud může - IPv6, proto by mělo být IPv6 připojení aktivní Od verze 2.2 má FSAL_GLUSTER podporu pro pNFS a ACL

Dynamické řízení NFS Ganesha

Pro dynamické řízení démona ganesha.nfsd se používá Dbus. Jeho prostřednictvím lze za běhu přidávat i odebírat exporty, nastavovat úroveň logování, nebo zjišťovat aktuální parametry. Nedělá se to však přímo, ale pomocí utilit, napsaných v Pythonu (v2.7):

sm_notify.ganesha
utilita, která by měla - v případě že dojde k výpadku IP adresy přes kterou byli NFS klienti připojeni - poslat na tyto klientské stanice signál o tom, že si mají změnit IP adresu NFS serveru
ganesha_stats
Je utilita, která umožňuje vypisovat různé statistické informace o aktuálně připojených klientech, exportech, datových přenosech aj.
ganesha_mgr
Te obslužná utilita, jejímž prostřednictvím lze přidávat či odebírat exporty, vypsat připojené klienty, nebo upravit úroveň logování. Také lze jejím prostřednictvím NFS server korektně vypnout.
purge_gids
?
grace_period
Provádí obnovení připojení vzdálených klientů? Zatím nevím. Jako parametr se mu dává IPv6 adresa
get_clientids
?
fake_recall
?

Jak přidat, nebo odebrat exportovanou položku

Jak upravit úroveň logování


  1. Od procesů které běží v userspace se ty jaderné ve výpisu příkazu ps liší tím, že jsou uzavřené do hranatých závorek - takže [nfsd].

Odkazy

https://gluster.readthedocs.org/en/latest/Administrator%20Guide/NFS-Ganesha%20GlusterFS%20Intergration/ - Ganesha na gluster.readthedocs.org - Postup nastavení NFS Ganesha pro podporu clusterového nastavení u GlusterFS
https://wiki.mosuma.com/wiki/Nfs-ganesha - wiki, podle které jsem postupoval při kompilaci. Finta s adresářem build - ale nefunkční konfigurace.
http://sourceforge.net/projects/nfs-ganesha/ - Stránky k NFS Ganesha na webu sourceforge.net
http://nfs-ganesha.sourceforge.net/files/nfs-ganesha-adminguide.pdf - Administrátorská příručka v0.4 k NFS Ganesha z r.. 2008 v PDF formátu na webu sourceforge.net