knfsd
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
Monitoring NFS
Nástroje využitelné na straně NFS klienta
nfsstat
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.
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
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í
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
exportfs
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)
showmount
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)
Tento příkaz však neumožňuje vypsat namountované podadresáře!. |
rpcinfo
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.
Debug NFS
Nástroje nfswatch a nfsstat pomáhají porozumět jaké operace server obsluhuje.
Analýza síťové komunikace
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
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
- 0
- Výpis debugovacích zpráv je vypnutý
- 1
- sock (NFSDBG_VFS 0×0001)
- 2
- fs (NFSDBG_DIRCACHE 0×0002)
- 4
- export (NFSDBG_LOOKUPCACHE 0×0004)
- 8
- 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
- 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