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.
Konfigurace pro NFS server je uložena v souboru /etc/exports
a sdílení adresáře /srv/app
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)
- IP adresa, doplněná maskou, určuje pro jaké adresy klientských strojů bude konfigurace platná. V tomto konkrétním případě maska
/24
(255.255.255.0
) vymezuje 256 adres (192.168.136.0–192.168.136.255) - rw je atribut, kterým lze povolit strojů s vyhovující IP adresou zápis. Opakem je ro, kterým se dá naopak, na straně serveru, zápis z těchto strojů zakázat. Je to preventivní opatření pro případ, že by si někdo přivlastnil IP adresu některého ze strojů v uvedeném rozsahu a namountoval sdílený adresář v režimu pro zápis.
- async je velice důležitý atribut z hlediska rychlosti I/0. U disklessové infrastruktury stroje používající sendvič zapisují své změny do RAM a ty ostatní, si mohou dovolit asynchronní zápis – při kterém se spokojí jen potvrzením ze strany NFS serveru, že mají operaci považovat za dokončenou. Své adresáře s nikým jiným nesdílejí, takže jim nevadí, že se změny v souborech sdíleného adresáře propadnou na disk se zpožděním. Opakem je atribut sync, při kterém NFS klient čeká po každé operaci na to, až mu NFS server potvrdí, že data skutečně uložil na disk, aby se zabránilo případné kolizi. Což dává smysl jen pokud se adresář sdílí v režimu rw
- subtree_check říká NFS serveru, aby kontrole exportu při mountu bral do úvahy také předanou cestu, pokud bude v rámci sdíleného adresáře existovat. Bez tohoto atributu by NFS server akceptoval jen požadavky, u kterých by cesta striktně odpovídala vyexportovanému záznamu.
- no_root_squash je atribut, kterým lze zakázat tzv. squashování[1] číselného ID uživatele root. Jeho opakem je all_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
Použití rpcdebug
- ↑ Squashování znamená, že se číselné ID uživatele navyšuje, aby nebylo možné prostřednictvím NFS na server nahrát zneužitelný soubor.