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:參考NFS daemons
- pc.nfsd:主要複雜登陸許可權檢測等 必須
- portmap:處理RPC程式用戶端和伺服器端的連接埠對應 必須
- rpc.mountd:負責NFS的檔案系統,當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:更新和查詢各運行層級的系統服務
•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等。最後這個映射使用者和共用目錄的許可權共同影響該用戶端串連是否有讀寫權限。
手動設定用戶端、伺服器端使用者映射,參數:map_static=/etc/nfs.map
/etc/nfs.map檔案對應內容如下:
# remote local
gid 500 1000
uid 500 2003
參考:NFS 學習筆記中關於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
#服務進程名:主機列表:當規則匹配時可選的命令操作
server_name:hosts-list[:command]
在/etc/hosts.allow中添加允許用戶端訪問的規則
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中 被禁制登陸的嘗試串連資訊也可以設定成記錄下來並發到使用者郵箱
sshd:ALL #禁止所有
5,修改共用出去的目錄許可權為760,並修改目錄所有組為nfsnobody
參考:問題7
6,用戶端掛載:執行下面的指令就可以把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用戶端數,在/etc/sysconfig/nfs設定檔中設定合適的nfs伺服器端進程數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參數:用rpc協議來探測主機host上使用的rpcbind,並顯示所有登入的RPC程式。
nfsstat命令:查看NFS的運行狀態,對於調整NFS的運行有很大協助
過程中出現的問題解決:
1, 通過yum或者rpm安裝完portmap後,發現執行命令service portmap start時報如下錯誤:portmap: unrecognized service。
CentOS6(Linux Kernel 2.6.32)中,portmap已經被rpcbind代替了,仔細查看安裝資訊就會發現,執行命令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, 用戶端執行命令showmount -e nfs-server時,報錯誤:mount clntudp_create: RPC: Program not registered。
nfs、rpcbind服務沒有啟動,使用chkconfig把nfs、rpcbind加到系統服務中並用service來啟動
或者在/etc/hosts.allow中添加允許用戶端訪問的規則 ALL:192.168.0.135
4, 用戶端執行命令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目錄執行touch命令時報錯誤:touch: cannot touch `a': Permission denied。解決:
•伺服器端共用目錄許可權查看ll -d /home
•修改伺服器端共用目錄許可權chown 760 /home(檔案所有者root有全許可權、檔案所有組使用者有讀寫權限、其他使用者無許可權,然後把目錄的組設定為nfsnobody)
•修改伺服器端共用目錄許可權組擁有者為nfsnobody(cat /etc/passwd | grep nob)
•chgrp nfsnobody /home
•成功在用戶端建立新的檔案!