NFS服務原理與應用

一、RPC與NFS:

  RPC稱作Remote Procedure Call Protocol,遠程過程調用協議。RPC可以實現客戶端向遠程主機請求服務(調用函數),而不需要了解底層協議(可以理解是一個框架)。RPC負責處理來自RPC客戶端的請求,其監聽在TCP/UDP的111端口上。

  NFS是RPC協議的一種具體的實現,NFS全稱爲Network File System,網絡文件系統。NFS可以實現類Unix主機之間文件系統的共享。NFS的底層依賴於RPC(可以將NFS理解爲是一個RPC服務器),NFS的端口是不固定的,需要向RPC服務代註冊。

  當NFS客戶端向NFS服務器端通信的時候,客戶端將NFS報文用RPC協議封裝並向RPC服務端發起請求(詢問NFS服務器的端口),RPC服務接收用戶的請求並告知其NFS所監聽的端口。之後客戶端通過RPC協議封裝NFS的報文併發給NFS的端口(此端口是RPC監聽的,所以仍然是連接的RPC),RPC將用戶的請求轉交給NFS程序,由NFS程序調用NFS模塊對報文解析並執行操作。

  NFS依賴於RPC通信,當啓動NFS服務的時候,需要事先啓動RPC服務。

  NFS只能在類Unix系統之間提供文件系統的共享服務,原因在於NFS功能是由內核模塊提供的,所以只能在內核提供了NFS功能的系統上使用。而大多數類Unix系統都具有該功能。


二、配置NFS服務:


1.配置NFS需要先啓動rpc服務,rpc服務程序由rpcbind這個包提供。安裝rpcbind

[root@localhost ~]# yum install -y rpcbind
[root@localhost ~]# rpm -ql rpcbind
/etc/rc.d/init.d/rpcbind    #啓動腳本
/sbin/rpcbind    #rpcbind程序
......

2.啓動rpcbind服務:

[root@localhost ~]# service rpcbind start
Starting rpcbind:                                          [  OK  ]
[root@localhost ~]# ss -ntl
State      Recv-Q Send-Q                  Local Address:Port                    Peer Address:Port 
LISTEN     0      128                                :::111                               :::*     
LISTEN     0      128                                 *:111                                *:*

3.安裝NFS相關程序並啓動,NFS程序由nfs-utils提供:

[root@localhost ~]# yum install -y nfs-utils
[root@localhost ~]# rpm -ql nfs-utils
/etc/nfsmount.conf   #掛載NFS配置
/etc/rc.d/init.d/nfs  #nfs服務腳本,負責處理請求
/etc/rc.d/init.d/nfslock  #nfs鎖服務
/etc/rc.d/init.d/rpcgssd  #rpcgssd
/etc/rc.d/init.d/rpcidmapd  #rpc的ID映射服務
/etc/rc.d/init.d/rpcsvcgssd  #rpcsvcgssd
....
[root@localhost ~]# service nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]

NFS的四個主要服務:

  quotas:限額設置
  mountd:掛載程序,等待用戶使用掛載申請,並驗證客戶來源
  daemon:NFS的主程序
  idmapd:負責NFS服務的id映射

4./etc/exports導出文件:

NFS共享文件系統使用/etc/exports文件導出,其格式:

/Dire(FileSystem)    允許的範圍(屬性)

#####各分支格式####
範圍格式:
   host:單一主機地址,例如localhost、192.168.1.1
   域匹配:例如*.magedu.com
   網絡地址:192.168.10.0/24、192.168.10.0/255.255.255.255

導出屬性:
   rw:讀寫權限
   ro:讀權限
      async:異步寫入
      sync:同步寫入;默認項
      nohide:允許遞歸掛載,就是NFS的/shared目錄中的a目錄掛載了其他的NFS目錄,當其他主機掛載/shared目錄的時候,允許這個主機訪問/shared/a目錄
      root_squash:壓縮root用戶,如果用戶使用的root用戶將NFS掛載在本地的,則把root映射爲來賓用戶;此選項爲默認選項
      no_root_squash:不壓縮root用戶。
      all_squash:將所有用戶映射爲來賓用戶
      anonuid/anongid:設置來賓用戶/組的ID,默認是nobody用戶。由rpcidmapd映射。

5.配置/etc/exports文件:

[root@localhost ~]# vim /etc/exports
/shared 	10.10.10.0/24(rw,no_root_squash,async)

共享/shared這個目錄,安全起見,建議將分區掛載到/shared上,我這裏是實驗環境,就不做此操作了。


6.導出命令:

導出配置使用exportfs命令:
  exportfs [arg]
    -a:處理/etc/exports文件中定義的所有項
    -r:重新導出,一般結合a參數
    -u:取消導出,一般結合a參數
[root@localhost ~]# exportfs -ra   #重新導出所有/etc/exports文件中定義的項

7.查看命令:

查看使用showmount命令:
  showmount [options] [host]
      -e [host]:查看指定NFS服務器共享的文件系統
      -d:只顯示客戶端掛載的文件系統
      -a:以 HostName :Directory 格式顯示所有客戶端掛載信息
[root@localhost ~]# showmount -e localhost  #查看本機共享的文件系統
Export list for localhost:
/shared 10.10.10.0/24    #共享/shared這個目錄,僅允許10.10.10.0/24這個網段掛載使用
[root@localhost ~]#

8.客戶端測試掛載:

[root@client ~]# mount -t nfs 10.10.10.11:/shared /mnt/nfs
[root@client ~]# mount
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
/dev/mapper/VolGroup-lv_home on /home type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
nfsd on /proc/fs/nfsd type nfsd (rw)
10.10.10.11:/shared on /mnt/nfs type nfs (rw,vers=4,addr=10.10.10.11,clientaddr=10.10.10.11)

可以看到已經掛載了,可以使用showmount在服務器上查看一下:



在客戶端的/mnt/nfs中寫入一個b文件,並查看服務器端的/shared目錄:

客戶端寫入:

[root@client nfs]# cp /etc/fstab /mnt/nfs
[root@client nfs]# ls
/etc/fstab
[root@client nfs]

服務器端查看:

[root@localhost ~]# ls /shared/
fstab
[root@localhost ~]# cat /shared/fstab 

#
# /etc/fstab
# Created by anaconda on Sat Dec  5 11:32:13 2015
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root /                       ext4    defaults        1 1
UUID=1a04e551-c2f2-4d1d-8d9a-948e2a2d4be6 /boot                   ext4    defaults        1 2
/dev/mapper/VolGroup-lv_home /home                   ext4    defaults        1 2
/dev/mapper/VolGroup-lv_swap swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
[root@localhost ~]#


9.NFS的啓動配置

  NFS啓動時端口不固定,帶來一些麻煩,可以使用啓動腳本的配置文件(/etc/sysconfig/nfs)。


10.RPC服務管理查看:

可以使用rpcinfo -p命令,顯示所有基於rpc的服務:

[root@localhost ~]# rpcinfo -p
   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
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad
    100005    1   udp  50980  mountd
    100005    1   tcp  59447  mountd
    100005    2   udp  46689  mountd
    100005    2   tcp  34305  mountd
    100005    3   udp  56518  mountd
    100005    3   tcp  47681  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  41169  nlockmgr
    100021    3   udp  41169  nlockmgr
    100021    4   udp  41169  nlockmgr
    100021    1   tcp  34117  nlockmgr
    100021    3   tcp  34117  nlockmgr
    100021    4   tcp  34117  nlockmgr


11.修改/etc/sysconfig/nfs配置文件,將rquotad進程的端口改爲876(默認爲875):

[root@client ~]# rpcinfo -p|grep rquotad
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad
[root@client ~]# vim /etc/sysconfig/nfs
  RQUOTAD_PORT=876

重啓服務已經變爲876端口了:

[root@localhost ~]# service nfs restart
Shutting down NFS daemon:                                  [  OK  ]
Shutting down NFS mountd:                                  [  OK  ]
Shutting down NFS quotas:                                  [  OK  ]
Shutting down NFS services:                                [  OK  ]
Shutting down RPC idmapd:                                  [  OK  ]
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
[root@localhost ~]# rpcinfo -p|grep rquotad
    100011    1   udp    876  rquotad
    100011    2   udp    876  rquotad
    100011    1   tcp    876  rquotad
    100011    2   tcp    876  rquotad
[root@localhost ~]#


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章