knfsd

From DCEwiki
Jump to: navigation, search

Jde o standardní součást linuxového jádra od r. 2006. Protože je k dispozici prakticky v každé linuxové distribuci, jde v současné době o nejčastěji používaný NFS server.

Díky tomu, že je implementován přímo v linuxovém jádře má lepší propustnost než NFS servery spouštěné v rámci userspace, které byly k dispozici dříve. Jako např. User space NFS (poslední update v listopadu r.2002) nebo UNFS3 (vyvíjený od r. 2004; poslední update je z října 2015).

NFS utils[edit]

Monitoring NFS[edit]

Nástroje využitelné na straně NFS klienta[edit]

nfsstat[edit]

Je nástroj využitelný jak na straně serveru, tak na straně klienta. Vypisuje tabulku se statistickým přehledem zpracovaných operací, ale na klientské stanici s parametrem -m vypisuje jaké NFS adresáře, ze kterého stroje a s jakými atributy jsou aktuálně připojeny.

Poznámka Následující příklad demonstruje ukázkový výpis příkazu nfsstat s parametrem -m na bezdiskovém virtuálním stroji postel
root@postel:~# nfsstat -m
/root from 192.168.136.3:/srv/share_new/virtual_machines/k2-diskless/debian-wheezy
 Flags: ro,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,proto=tcp,port=2049,timeo=7,retrans=3,sec=sys,local_lock=all,addr=192.168.136.3

/opt from k909:/srv/share_new/virtual_machines/k2-app
 Flags: rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.136.3,mountvers=3,mountport=46323,mountproto=tcp,local_lock=none,addr=192.168.136.3

/usr/src from k909:/srv/share_new/virtual_machines/k2-diskless/debian-src
 Flags: rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.136.3,mountvers=3,mountport=46323,mountproto=tcp,local_lock=none,addr=192.168.136.3

/home/picpetr from k909:/srv/share_new/virtual_machines/k2-home/picpetr
 Flags: rw,relatime,vers=4,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.136.200,minorversion=0,local_lock=none,addr=192.168.136.3

nfsiostat[edit]

Je nástroj který vypisuje přehled I/O operací každého z aktuálně připojených sdílených NFS adresářů.

Jeho výstup však lze - oproti výstupu příkazu nfsstat - mnohem lépe využívat ve skriptech. Viz následující příklad pro srovnání

Poznámka Následující příklad demonstruje výpis příkazu nfsiostat na bezdiskovém virtuálním stroji postel ...
root@postel:~# nfsiostat
k909:/srv/share_new/virtual_machines/k2-app mounted on /opt:

   op/s         rpc bklog
   0.34            0.00
read:             ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  0.000           0.001         127.005        0 (0.0%)           3.308           3.462
write:            ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  0.000           0.000           0.000        0 (0.0%)           0.000           0.000

k909:/srv/share_new/virtual_machines/k2-home/picpetr mounted on /home/picpetr:

   op/s         rpc bklog
  12.34            0.00
read:             ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  0.288          10.334          35.861        0 (0.0%)           1.012           1.395
write:            ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  0.704          12.399          17.608        0 (0.0%)           0.328           0.562

k909:/srv/share_new/virtual_machines/k2-diskless/debian-src mounted on /usr/src:

   op/s         rpc bklog
   0.34            0.00
read:             ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  0.000           0.057         173.034        0 (0.0%)          19.742          25.442
write:            ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  0.000           0.000           0.000        0 (0.0%)           0.000           0.000

192.168.136.3:/srv/share_new/virtual_machines/k2-diskless/debian-wheezy mounted on /root:

   op/s         rpc bklog
   0.78            0.00
read:             ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  0.007           0.678          91.448        0 (0.0%)           6.879           9.304
write:            ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  0.000           0.000           0.000        0 (0.0%)           0.000           0.000
                  
k909:/srv/share_new/virtual_machines/k2-home/kapical1 mounted on /home/kapical1:

   op/s         rpc bklog
  12.89            0.00
read:             ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  0.303          10.582          34.931        0 (0.0%)           0.974           1.337
write:            ops/s            kB/s           kB/op         retrans         avg RTT (ms)    avg exe (ms)
                  0.749          12.839          17.140        0 (0.0%)           0.323           0.545

...a jeho následné využití pro zjištění namountovaného NFS adresáře nekorektně odhlášených uživatelů - tj. takových u kterých nedošlo díky nekorektnímu ukončení session k odmountování domovského adresáře.

root@postel:~# for i in $(nfsiostat | grep k2-home | awk '{print $1}'); do if [ ! "$(ps hos -U ${i##*/})" ]; then echo $i ; fi ; done
k909:/srv/share_new/virtual_machines/k2-home/kapical1

Nástroje využitelné na straně NFS serveru[edit]

exportfs[edit]

Je základní nástroj pro práci s NFS serverem. Jeho prostřednictvím lze za běhu nastavit či zrušit sdílení adresáře ale také umožňuje zjistit co a s jakými parametry se vlastně exportuje.

Vlastní konfigurace NFS serveru je uložena v souboru /etc/exports a může vypadat kupř. takto:

/srv/app \
    192.168.136.207(rw,fsid=2,nohide,async,subtree_check,no_root_squash) \
    192.168.136.0/24(ro,fsid=2,nohide,async,subtree_check,no_root_squash)
Upozornění Pokud uvedete naopak nejdřív rozsah adres a teprve potom adresu jednoho stroje z rozsahu, tak jako je uvedeno v následujícím příkladu:
/srv/app \
   192.168.136.0/24(ro,fsid=2,nohide,async,subtree_check,no_root_squash) \
   192.168.136.207(rw,fsid=2,nohide,async,subtree_check,no_root_squash)

Tak se nejprve pravidlo na celý rozsah a teprve až pak pravidlo na stroj. Takže klient vzdálený adresář připojí, mount bude ukazovat, že je ve stavu read-write, ale stejně bude jen pro čtení, protože server bude uplaňovat pravidlo platné pro celý rozsah, na které narazí dřív.

showmount[edit]

Je nástroj, co umožňuje vypsat aktuálně vyexportované adresáře a IP adresy strojů na které jsou připojeny. Efekt použitého parametru:

-e 
co je vypublikováno a kam (IP rozsahy a adresy)
-a 
co bylo kdy připojeno a odkud (všechny IP adresy cíle)
Upozornění Tento příkaz však neumožňuje vypsat namountované podadresáře!.

rpcinfo[edit]

Pro správné namapování UID klientů se u NFS využívá RPC. Dnes je součástí NFSv4 ale starší NFS server mapování vůbec neřešil. Soubory na straně NFS serveru ukládal se stejným UID, jako měl zrovna uživatel, který soubor vlastnil na klientské stanici.

Problém do určité míry řešil démon portmapper, který umožňoval přemapovávat lokální uživatelské UID na jiné. Ovšem to mělo háček. Pokud měl někdo přístup k účtu superuživatele root na lokálním nodu kam byl připojen adresář sdílený přes NFSv3, mohl tohoto démona vypnout a tím automaticky získal přístup ke všem zde uloženým souborům bez ohledu na nastavená práva a UID nasdílených adresářů.

Server NFSv4 už ale nepoužívá portmapper ale rpcbind, který sice také používá RPC, ale funguje jinak.

Poznámka Správné mapování UID je problém především u bezdiskových strojů, protože při mountováníadresáře sdíleného přes NFS nejsou v ramdisku nejsou k dispozici služby, které by umožnily autorizované připojení přes NFSv4. Pokud by totiž byly součástí, tak by výpadek autorizačního mechanismu znamenal automaticky kolaps bezdiskového stroje, protože by ztratil přístup k souborům na serveru.

U nás je to vyřešeno tak, že systémové adresáře bezdiskových strojů, se sdílejí přes NFS na zcela samostatném odděleném síťovém segmentu, kdežto uživatelské adresáře se mountují prostřednictvím jiného segmentu na základě autorizovaného přístupu přes NFSv4

Debug NFS[edit]

http://prefetch.net/blog/index.php/2011/11/01/using-wiresharks-protocol-decoding-to-debug-nfs-problems/

Nástroje nfswatch a nfsstat pomáhají porozumět jaké operace server obsluhuje.

Analýza síťové komunikace[edit]

Umožní sledovat NFS traffic jaký leze po síti Nejprve provést dump tcp komunikace..

tcpdump -w /var/tmp/nfs.dmp -i eth0 host 192.168.56.102 and not port 22

Výsledek pak předhodit do wiresharku

wireshark nfs.dmp

Analýza debugovacích zpráv[edit]

Aby bylo možné provést aktivaci debugovacích zpráv, musí být jádro zkompilováno s volbou CONFIG_SUNRPC_DEBUG=y běžná distribuční jádra Debianu jsou bohužel kompilovaná bez ní.

Standardně je volba vypnuta, protože výpis komunikace do logu zbytečně zatěžuje server. Aktivace debugovacích zpráv se provádí teprve tehdy, vyskytne-li se problém, který je třeba analyzovat. Provádí se zápisem čísla do souboru /proc/sys/rpc/nfs_debug

# echo 32767 > /proc/sys/rpc/nfs_debug
Výpis debugovacích zpráv je vypnutý
sock (NFSDBG_VFS 0×0001)
fs (NFSDBG_DIRCACHE 0×0002)
export (NFSDBG_LOOKUPCACHE 0×0004)
svc (NFSDBG_PAGECACHE 0×0008)
16 
proc (NFSDBG_PROC 0×0010)
32 
fileop (NFSDBG_XDR 0×0020)
64 
auth (NFSDBG_FILE 0×0040)
128 
repcache (NFSDBG_ROOT 0×0080)
256 
xdr (NFSDBG_CALLBACK 0×0100)
512 
lockd
Poznámka Vtipné je, že nastavení všech flagů individuálně zapíše hodnotu 1023, která ve výsledku odpovídá svým efektem hodnotě 32767, ovšem když se nastaví all a pak se flagy postupně vyhodí, zůstane nastavena výchozí hodnota 31744
32767 
all
65535 
(NFSDBG_ALL 0xFFFF)

a potom na inod se kterým je problém aplikovat příkaz stat

# stat /problémový/soubor/či/adresář

A pak deaktivovat debugovácí zprávy

# echo 0 > /proc/sys/rpc/nfs_debug

Analyzovat:

  • Debugovací zprávy co jsou ve výpisu příkazu dmesg
  • výstup příkazu stats a také udělat stat na rodičovský adresář

Z výstupu lze zjistit co klient dělá a proč neprobíhá správně ověřování inodu

Vyzkoušet také provést touch

Použití rpcdebug[edit]