1,服務器端軟件:安裝nfs-utils和portmap(rpcbind)
nfs-utils: 提供rpc.nfsd 及 rpc.mountd這兩個nfs daemons的套件
portmap: nfs其實可以被看作是一個rpc server program,而要啟動一個rpc server program,都要做好port的對應工作,而且這樣的任務就是由portmap來完成的。通俗的說portmap就是用來做port的mapping的。
nfs需要啟動的daemons
-
pc.nfsd:主要復雜登陸權限檢測等 必須
-
portmap:處理rpc程序客戶端和服務器端的端口對應 必須
-
rpc.mountd:負責nfs的檔案系統(tǒng),當client端通過rpc.nfsd登陸server后,對clinet存取server的文件進行一系列的管理 必須
-
lockd:處理通過rpc包的鎖定請求
-
statd:為nfs鎖定服務提供crash恢復功能
-
rquotad:處理當用戶通過nfsmount到遠程服務器時的配額
-
守護進程啟動順序:rpc.portmap, rpc.mountd, rpc.nfsd, rpc.statd, rpc.lockd (新版本會自動跟著nfsd啟動起來), rpc.rquotad
nf服務器端命令:
?yum install nfs-utils portmap
?chkconfig rpcbind on #chkconfig:更新和查詢各運行級別的系統(tǒng)服務
?chkconfig nfs on
?service rpcbind start
?service nfs start
2,服務器端配置文件/etc/exports:指定要共享的目錄及權限 man exports
復制代碼?代碼如下:
#:允許ip地址范圍在192.168.0.*的計算機以讀寫的權限來訪問/home/work 目錄。
/home/work 192.168.0.*(rw,sync,root_squash)
/home? 192.168.1.105 (rw,sync)
/public? * (rw,sync)
配置文件每行分為兩段:第一段為共享的目錄,使用絕對路徑,第二段為客戶端地址及權限。
地址可以使用完整ip或網段,例如10.0.0.8或10.0.0.0/24,10.0.0.0/255.255.255.0當然也可以地址可以使用主機名,dns解析的和本地/etc/hosts解析的都行,支持通配符,例如:*.chengyongxu.com
權限有:
rw:read-write,可讀寫;??? 注意,僅僅這里設置成讀寫客戶端還是不能正常寫入,還要正確地設置共享目錄的權限,參考問題7
ro:read-only,只讀;
sync:文件同時寫入硬盤和內存;
async:文件暫存于內存,而不是直接寫入內存;
no_root_squash:nfs客戶端連接服務端時如果使用的是root的話,那么對服務端分享的目錄來說,也擁有root權限。顯然開啟這項是不安全的。
root_squash:nfs客戶端連接服務端時如果使用的是root的話,那么對服務端分享的目錄來說,擁有匿名用戶權限,通常他將使用nobody或nfsnobody身份;
all_squash:不論nfs客戶端連接服務端時使用什么用戶,對服務端分享的目錄來說都是擁有匿名用戶權限;
anonuid:匿名用戶的uid值,通常是nobody或nfsnobody,可以在此處自行設定;
anongid:匿名用戶的gid值。
nfs客戶端用戶映射:客戶端登陸用戶為root或者其他用戶,然后根據服務器端nfs server配置,相應客戶端連接映射到nfs服務器端的用戶為root或者指定用戶(通過anonuid或者anongid來設定)、nfsnobody等。最后這個映射用戶和共享目錄的權限共同影響該客戶端連接是否有讀寫權限。
手動設定客戶端、服務器端用戶映射,參數(shù):map_static=/etc/nfs.map
/etc/nfs.map文件映射內容如下:
# remote local
gid 500 1000
uid 500 2003
參考:關于nfs客戶連接用戶身份的描述,沒有驗證過下述的描述:
?客戶端連接時候,對普通用戶的檢查,no.1如果明確設定了普通用戶被壓縮的身份,那么此時客戶端用戶的身份轉換為指定用戶,no.2如果nfs server上面有同名用戶,那么此時客戶端登錄賬戶的身份轉換為nfs server上面的同名用戶,no.3如果沒有明確指定,也沒有同名用戶,那么此時 用戶身份被壓縮成nfsnobody
?客戶端連接的時候,對root的檢查,no.1如果設置no_root_squash,那么此時root用戶的身份被壓縮為nfs server上面的root,no.2如果設置了all_squash、anonuid、anongid,此時root 身份被壓縮為指定用戶,no.3如果沒有明確指定,此時root用戶被壓縮為nfsnobody,no.4如果同時指定no_root_squash與all_squash 用戶將被壓縮為 nfsnobody,如果設置了anonuid、anongid將被壓縮到所指定的用戶與組
3,防火墻設置修改
默認情況下,centos6服務器版安裝完成后,防火墻iptables配置中只放開了22端口。
在nfs配置文件/etc/sysconfig/nfs中指定nfs服務相關端口,并修改防火墻放開相應端口
復制代碼?代碼如下:
#port rpc.mountd should listen on.?
#mountd_port=892?
?
#port rpc.statd should listen on.?
#statd_port=662?
?
#/usr/sbin/rpc.rquotad port rquotad should listen on.?
#rquotad_port=875?
?
#tcp port rpc.lockd should listen on.?
#lockd_tcpport=32803?
?
#udp port rpc.lockd should listen on.?
#lockd_udpport=32769??
修改iptables配置文件/etc/sysconfig/iptables,放開111(portmap服務端口),2049(nfs服務端口)
4,/etc/hosts.allow配置修改
/etc/hosts.allow,/etc/hosts.deny 描述哪些主機允許使用本地的inet服務。
默認這里好像可以不需要修改,不過最好設置成只允許需要的客戶端機器連接,然后其他機器的連接都deny
#服務進程名:主機列表:當規(guī)則匹配時可選的命令操作
server_name:hosts-list[:command]
在/etc/hosts.allow中添加允許客戶端訪問的規(guī)則
all:127.0.0.1???????? #允許本機訪問本機所有服務進程
all:192.168.0.135???? #允許192.168.0.135客戶端機器訪問本機所有服務進程
smbd:192.168.0.0/255.255.255.0??? #允許網段的ip訪問smbd服務
sshd:192.168.100.0/255.255.255.0??????? #允許192.168.100.網段的ip訪問服務器上的sshd進程
sshd:60.28.160.244????????????????????????????????? #允許外網的60.28.160.244訪問這個服務器上的sshd進程
在/etc/hosts.deny中 被禁制登陸的嘗試連接信息也可以設置成記錄下來并發(fā)到用戶郵箱
sshd:all??? #禁止所有
5,修改共享出去的目錄權限為760,并修改目錄所有組為nfsnobody
參考:問題7
6,客戶端掛載:執(zhí)行下面的指令就可以把nfs服務器(ip地址為192.168.1.45)共享出來的/home掛裝到本地的/mnt/nfs/home目錄下。
showmount -e nfs-serverip: 查看nfs服務器共享出來的資源
mount -t nfs 192.168.1.45:/home /mnt/nfs/home
7,nfs性能測試:
?根據命令time dd if=/dev/zero of=/mnt/home bs=16k count=16384 來設置合理的wsize,rsize值
?根據nfs客戶端數(shù),在/etc/sysconfig/nfs配置文件中設置合適的nfs服務器端進程數(shù)rpcnfsdcount,默認為8
exportfs命令:如果我們在啟動了nfs之后又修改了/etc/exports,是不是還要重新啟動nfs呢?這個時候我們就可以用exportfs命令來使改動立刻生效,該命令格式如下:
exportfs [-aruv] -a :全部mount或者unmount /etc/exports中的內容 -r :重新mount /etc/exports中分享出來的目錄 -u :umount 目錄 -v :在 export 的時候,將詳細的信息輸出到屏幕上。
showmount命令:顯示nfs服務器的掛載信息。
showmount -e [nfs-server]:顯示指定的nfs server上export出來的目錄,不指定后面ip時查看的是本機作為nfs server時,對外共享的目錄。。
rpcinfo -p命令:顯示rpc信息? -p參數(shù):用rpc協(xié)議來探測主機host上使用的rpcbind,并顯示所有已注冊的rpc程序。
nfsstat命令:查看nfs的運行狀態(tài),對于調整nfs的運行有很大幫助
過程中出現(xiàn)的問題解決:
1, 通過yum或者rpm安裝完portmap后,發(fā)現(xiàn)執(zhí)行命令service portmap start時報如下錯誤:portmap: unrecognized service。
centos6(linux kernel 2.6.32)中,portmap已經被rpcbind代替了,仔細查看安裝信息就會發(fā)現(xiàn),執(zhí)行命令yum install portmap時安裝的就是rpcbind。安裝完成后也可以通過命令:yum whatprovides portmap來查看詳細信息。
2, 客戶端掛載時,報錯誤mount clntudp_create: rpc: port mapper failure – rpc: unable to receive。
?1,通過命令rpcinfo -p來查看portmap服務時候正常啟動以及相應的端口(默認111)
?2,檢查/etc/sysconfig/iptables防火墻設置,允許tcp,udp的111端口訪問,然后service iptables restart
?3,檢查/etc/hosts.deny,/etc/hosts.allow看客戶端連接是否被阻止了
3, 客戶端執(zhí)行命令showmount -e nfs-server時,報錯誤:mount clntudp_create: rpc: program not registered。
nfs、rpcbind服務沒有啟動,使用chkconfig把nfs、rpcbind加到系統(tǒng)服務中并用service來啟動
或者在/etc/hosts.allow中添加允許客戶端訪問的規(guī)則 all:192.168.0.135
4, 客戶端執(zhí)行命令showmount -e nfs-server時,報錯誤:rpc mount export: rpc: unable to receive; errno = no route to host
配置文件:/etc/sysconfig/nfs
找到nfs服務相關端口設置的地方,并移除注釋后,在iptables防火墻設置中指定允許相應端口的udp,tcp流通過。
#mountd_port=892
#statd_port=662
#lockd_tcpport=32803
#lockd_udpport=32769
iptables -a input -p tcp –dport 662 -m state –state new -j accept
iptables -a input -p udp –dport 661 -m state –state new -j accept
5, showmount -e nfs-server成功,正式掛載時報錯:mount: mount to nfs server ‘192.168.1.5’ failed: system Error: no route to host.這是由于nfs服務的默認端口2049被防火墻阻塞了,和上面類似修改iptables允許2049端口通過
6, showmount -e nfs-server成功,正式掛載時報錯:mount: mount to nfs server ‘192.168.1.5’ failed: timed out (retrying).
編輯/etc/sysconfig/iptables時,相關端口的tcp端口允許通過,而udp不允許。其他可能的原因參考:mount command fails with nfs server failed error.
disable name lookup requests from nfs server to a dns server.?
or? nfs version used by the nfs client is other than version 3.
7,exports配置文件中目錄權限屬性設置為rw(默認為root_squash),但是在客戶端mount目錄執(zhí)行touch命令時報錯誤:touch: cannot touch `a’: permission denied。解決:
?服務器端共享目錄權限查看ll -d /home
?修改服務器端共享目錄權限chown 760 /home(文件所有者root有全權限、文件所有組用戶有讀寫權限、其他用戶無權限,然后把目錄的組設置為nfsnobody)
?修改服務器端共享目錄權限組擁有者為nfsnobody(cat /etc/passwd | grep nob)
?chgrp nfsnobody /home
?成功在客戶端創(chuàng)建新的文件!