NFS是NetworkFileSystem的縮寫,它最大的功能是可以通過網絡讓不同的機器、不同的操作系統可以分享個別的文件。這個NFS服務器可以讓那你的PC來將網絡遠程的NFS服務器分享的目錄,掛載到本地端的機器當中,在本地端的機器看起來,那個遠程主機的目錄就好像是自己的一個磁盤分區。
基本上NFS這個服務的端口開在2049,但是由於文件系統非常複雜,因此NFS還有其他的程序去啓動額外的端口,預設NFS用來傳輸的端口是隨機選擇小於1024以下的端口來使用的。客戶端要遠程調用(RemoteProcedureCall,RPC)的協議來輔助。
RPC最主要的功能就是在指定每個NFS功能所對應的portnumber,並且回報給客戶端,讓客戶端可以連接到正確的端口上去。服務器在啓動NFS時,會隨機取用數個端口,並主動向RPC註冊,因此RPC可以知道每個端口對應的NFS功能,然後RPC又是固定使用port111來監聽客戶端的需求並回報客戶端正確的端口。
注:要啓動NFS之前,RPC就要先啓動了,否則NFS會無法向RPC註冊。另外,RPC若重新啓動時,原本註冊的數據會不見,因此RPC重新啓動後,它管理的所有服務都需要重新啓動來重新向RPC註冊。
客戶端有NFS文件存取需求時,向服務器端要求數據的流程:
1.客戶端會向服務器端的RPC(port111)發出NFS文件存取功能的詢問要求;
2.服務器端找到對應的已註冊的NFSdaemon端口後,會回報給客戶端;
3.客戶端了解正確的端口後,就可以直接與NFSdaemon來聯機。
NFS啓動的RPCdaemons
rpc.nfsd:這個daemon主要的功能就是在管理客戶端是否能夠使用服務器文件系統掛載信息等,其中還包含這個登陸者的ID的判別
rpc.mountd:這個daemon主要的功能,則是在管理NFS的文件系統哩!當客戶端順利的通過rpc.nfsd而登入服務器之後,在他可以使用NFS服務器提供的檔案之前,還會經過檔案權限(就是那個-rwxrwxrwx與owner,group那幾個權限啦)的認證程序!他會去讀NFS的配置文件/etc/exports來比對客戶端的權限,當通過這一關之後客戶端就可以取得使用NFS檔案的權限啦!(注:這個也是我們用來管理NFS分享之目錄的權限與安全設定的地方哩!)
NFS的文件訪問權限:
客戶端以NFS取用服務器端的文件系統時,還得具有
1NFS服務器有開放可寫入的權限(與/etc/exports設定有關)
2實際的文件權限具有可寫入的權限。
NFSServer端設定
所需軟件:
RPC主程序:rpcbind
NFS主程序:nfs-utils
[root@centos ~]# yum install rpcbind [root@centos ~]# yum install nfs-utils
NFS配置文件:
主要配置文件:/etc/exports
NFS文件系統維護指令:/usr/sbin/exportfs
分享資源的登錄文件:/var/lib/nfs/*tab
客戶端查詢服務器分享資源的指令:/usr/sbin/showmount
[root@www ~]# vim /etc/exports /tmp 192.168.100.0/24(ro) localhost(rw) *.ev.ncku.edu.tw(ro,sync) [分享目錄] [第一部主機(權限)] [可用主機名] [可用通配符]
要將/tmp分別分享給三個不同的主機或網域的意思。記得主機後面以小括號()設計權限參數,若權限參數不止一個時,則以逗號(,)分開。且主機名與小括號是連在一起的喔!在這個檔案內也可以利用#來批註呢。
想將/tmp分享出去給大家使用,由於這個目錄本來就是大家都可以讀寫的,因此想讓所有的人都可以存取,要讓root寫入的檔案還是具有root的權限
[root@centos ~]# vim /etc/exports # 任何人都可以用我的 /tmp ,用通配符來處理主機名,重點在no_root_squash /tmp *(rw,no_root_squash)
啓動rpc、nfs服務
[root@centos ~]# service rpcbind start Starting rpcbind: [ OK ] [root@centos ~]# service nfs start Starting NFS services: [ OK ] Starting NFS mountd: [ OK ] Starting NFS daemon: [ OK ]
查看開放端口
[root@centos ~]# netstat -plunt | grep -E '(rpc|nfs)' tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 6023/rpcbind tcp 0 0 0.0.0.0:52528 0.0.0.0:* LISTEN 6069/rpc.mountd tcp 0 0 0.0.0.0:54929 0.0.0.0:* LISTEN 6069/rpc.mountd tcp 0 0 0.0.0.0:34879 0.0.0.0:* LISTEN 6069/rpc.mountd tcp 0 0 :::35502 :::* LISTEN 6069/rpc.mountd tcp 0 0 :::111 :::* LISTEN 6023/rpcbind tcp 0 0 :::60977 :::* LISTEN 6069/rpc.mountd tcp 0 0 :::39008 :::* LISTEN 6069/rpc.mountd udp 0 0 0.0.0.0:37102 0.0.0.0:* 6069/rpc.mountd udp 0 0 0.0.0.0:111 0.0.0.0:* 6023/rpcbind udp 0 0 0.0.0.0:36248 0.0.0.0:* 6069/rpc.mountd udp 0 0 0.0.0.0:57902 0.0.0.0:* 6069/rpc.mountd udp 0 0 0.0.0.0:686 0.0.0.0:* 6023/rpcbind udp 0 0 :::111 :::* 6023/rpcbind udp 0 0 :::34965 :::* 6069/rpc.mountd udp 0 0 :::686 :::* 6023/rpcbind udp 0 0 :::42044 :::* 6069/rpc.mountd udp 0 0 :::36419 :::* 6069/rpc.mountd
查看每個RPC服務的註冊狀況
[root@www ~]# rpcinfo -p [IP|hostname] [root@www ~]# rpcinfo -t|-u IP|hostname 程序名稱 選項與參數: -p :針對某 IP (未寫則預設爲本機) 顯示出所有的 port 與 porgram 的信息; -t :針對某主機的某支程序檢查其 TCP 封包所在的軟件版本; -u :針對某主機的某支程序檢查其 UDP 封包所在的軟件版本;
顯示出目前這部主機的RPC狀態
[root@centos ~]# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100005 1 udp 37102 mountd 100005 1 tcp 34879 mountd 100005 2 udp 57902 mountd 100005 2 tcp 52528 mountd 100005 3 udp 36248 mountd 100005 3 tcp 54929 mountd 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 2 tcp 2049 nfs_acl 100227 3 tcp 2049 nfs_acl 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 2 udp 2049 nfs_acl 100227 3 udp 2049 nfs_acl 100021 1 udp 38908 nlockmgr 100021 3 udp 38908 nlockmgr 100021 4 udp 38908 nlockmgr 100021 1 tcp 56488 nlockmgr 100021 3 tcp 56488 nlockmgr 100021 4 tcp 56488 nlockmgr
檢查nfs這個程序相關軟件版本信息(僅查看TCP)
[root@centos ~]# rpcinfo -t localhost nfs program 100003 version 2 ready and waiting program 100003 version 3 ready and waiting program 100003 version 4 ready and waiting
NFS的聯機查看
[root@www ~]# showmount [-ae] [hostname|IP] 選項與參數: -a :顯示目前主機與客戶端的 NFS 聯機分享的狀態; -e :顯示某部主機的 /etc/exports 所分享的目錄數據。
查看設定好的相關exports分享目錄信息
[root@centos ~]# showmount -e localhost Export list for localhost: /tmp *
當你要掃瞄某一部主機他提供的NFS分享的目錄時,就使用showmount-eIP(或hostname)即可
NFS關於目錄權限設定的數據非常之多,在/etc/exports只是比較特別的權限參數而已,還有很多預設參數呢!這些預設參數在哪?我們可以檢查一下/var/lib/nfs/etab就知道了
[root@centos ~]# tail /var/lib/nfs/etab /tmp *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
重新編輯/etc/exports文件,不需要重啓nfs!如果重新啓動nfs的話,要得再向RPC註冊!我們可以通過exportfs這個指令
[root@www ~]# exportfs [-aruv] 選項與參數: -a :全部掛載(或卸除) /etc/exports 檔案內的設定 -r :重新掛載 /etc/exports 裏面的設定,此外,亦同步更新 /etc/exports 及 /var/lib/nfs/xtab 的內容! -u :卸除某一目錄 -v :在 export 的時候,將分享的目錄顯示到屏幕上!
NFS客戶端的設定
手動掛載NFS服務器分享的資源
所需軟件:
[root@centos ~]# yum install rpcbind
#啓動rpcbind服務 [root@centos ~]# service rpcbind start #查詢服務器提供哪些資源 [root@centos ~]# showmount -e 192.168.246.23 Export list for 192.168.246.23: /tmp *
建立掛載點
[root@centos ~]# mkdir -p /home/nfs/ [root@centos ~]# mount -t nfs 192.168.246.23:/tmp /home/nfs/ [root@centos ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext4 193G 24G 159G 14% / tmpfs tmpfs 1.9G 904K 1.9G 1% /dev/shm /dev/sda1 ext4 194M 48M 137M 26% /boot /dev/sda3 ext4 145G 188M 137G 1% /home 192.168.246.23:/tmp nfs 97G 9.6G 82G 11% /home/nfs
至此,最簡單的NFS掛載共享就完成了!