天天看點

【網絡檔案共享】02、NFS服務基礎

一、NFS

1、NFS簡介

NFS:Network File System

   NFS協定用于unix/linux系統之間通過網絡進行檔案共享,使用者可以把網絡中NFS伺服器提供的共享目錄挂載到本地檔案目錄中,可以象對本地檔案系統一樣操作NFS檔案系統中的内容。

   NFS協定在核心空間中實作,但需要依賴于使用者空間中的功能;

   NFS不适用于windows,隻用于unix/linux主機之間進行檔案共享;

   NFS是古老的協定了,到了Linux不斷更新和完善,從以前隻支援UDP,現在支援TCP,現在到了V4版本。不過還是不安全,最大的毛病就是不需要身份認證(可以做IP認證,借助Kerberos也可以做身份認證但很麻煩也很少用到),也隻建議在内網用一下;

   NFS的工作機制嚴重依賴于RPC:Remote Procedure Call Protocol 遠端過程調用協定

RPC的工作機制:

   RPC也可以看成一個服務架構,能夠幫其它的程序監聽在套接字上(和xinetd類似),并将程序的服務提供給遠端使用者,

NIS:Network Infomation Service  網絡資訊服務

   也是SUN公司開發的,和kerberos類似也可以實作帳号(使用者ID)映射和集中式使用者認證

LDAP:取代NIS的協定,認證時雖然傳輸也是明文,但可以基于ssl工作

2、RPC服務

   NFS也是C/S架構,NFS的用戶端和服務端都需要依賴于rpcbind,rpcbind監聽UDP和TCP的111端口

檢視本機或遠端主機的rpc服務資訊:

[root@Node5 ~]# rpcinfo
   program version netid     address                service    owner
    100000    4    tcp6      ::.0.111               portmapper superuser
    100000    3    tcp6      ::.0.111               portmapper superuser
    100000    4    udp6      ::.0.111               portmapper superuser
    100000    3    udp6      ::.0.111               portmapper superuser
    100000    4    tcp       0.0.0.0.0.111          portmapper superuser
    100000    3    tcp       0.0.0.0.0.111          portmapper superuser
    100000    2    tcp       0.0.0.0.0.111          portmapper superuser
    100000    4    udp       0.0.0.0.0.111          portmapper superuser
    100000    3    udp       0.0.0.0.0.111          portmapper superuser
    100000    2    udp       0.0.0.0.0.111          portmapper superuser
    100000    4    local     /var/run/rpcbind.sock  portmapper superuser
    100000    3    local     /var/run/rpcbind.sock  portmapper superuser
    100024    1    udp       0.0.0.0.182.117        status     29
    100024    1    tcp       0.0.0.0.178.51         status     29
    100024    1    udp6      ::.147.194             status     29
    100024    1    tcp6      ::.178.119             status     29
    
[root@Node5 ~]# 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
    100024    1   udp  46709  status
    100024    1   tcp  45619  status      

  各基于RPC提供監聽服務的程序,在啟動時要向RPC注冊監聽在某端口上,rpc會從各未使用的端口中挑一個給此程序監聽,即半随機(80端口沒使用時,可能會挑選80給程序監聽)。

三、NFS的實作

1、NFS的安裝

   NFS本身隻提供檔案系統,并不負責驗證用戶端的身份(不驗證使用者的IP和帳戶),也不完成将使用者的ID映射為本機的使用者ID,這些功能需要依賴于各子元件完成。

NFS由核心實作,伺服器端隻需安裝各子元件就可以:

  伺服器端安裝程式:

[root@Node5 ~]# yum install nfs-utils

[root@Node5 ~]# rpm -ql nfs-utils
/etc/nfsmount.conf
/etc/rc.d/init.d/nfs         
/etc/rc.d/init.d/nfslock
/etc/rc.d/init.d/rpcgssd
/etc/rc.d/init.d/rpcidmapd
/etc/rc.d/init.d/rpcsvcgssd
/etc/request-key.d/id_resolver.conf
/etc/sysconfig/nfs
/sbin/mount.nfs
/sbin/mount.nfs4
/sbin/nfs_cache_getent
/sbin/rpc.statd
/sbin/umount.nfs
/sbin/umount.nfs4
/usr/sbin/exportfs
/usr/sbin/mountstats
/usr/sbin/nfsidmap
/usr/sbin/nfsiostat
/usr/sbin/nfsstat
/usr/sbin/rpc.gssd
/usr/sbin/rpc.idmapd
/usr/sbin/rpc.mountd
/usr/sbin/rpc.nfsd
/usr/sbin/rpc.svcgssd
/usr/sbin/rpcdebug
/usr/sbin/showmount
/usr/sbin/sm-notify
/usr/sbin/start-statd
/usr/share/doc/nfs-utils-1.2.3

/var/lib/nfs
/var/lib/nfs/etab
/var/lib/nfs/rmtab
/var/lib/nfs/rpc_pipefs
/var/lib/nfs/statd
/var/lib/nfs/statd/sm
/var/lib/nfs/statd/sm.bak
/var/lib/nfs/state
/var/lib/nfs/v4recovery
/var/lib/nfs/xtab      

啟動nfs服務:

  因為nfs服務依賴于rpcbind配置設定端口是以rpcbind一定要優先于nfs啟動

[root@Node5 ~]# service nfs start
Starting NFS services:                                     [  OK  ]  
    # 主服務程序,檔案讀寫
Starting NFS quotas:                                       [  OK  ]  # 磁盤配額程序
Starting NFS mountd:                                       [  OK  ]
    # 挂載守護程序,負責用戶端來源認證的程序;等待用戶端挂載程序
Starting NFS daemon:                                       [  OK  ]  # 服務端程序
Starting RPC idmapd:                                       [  OK  ]  
    # 使用者ID号映射程序

[root@Node5 ~]# 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
    100024    1   udp  40067  status
    100024    1   tcp  38601  status
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad
    100005    1   udp  36049  mountd
    100005    1   tcp  35121  mountd
    100005    2   udp  34402  mountd
    100005    2   tcp  49542  mountd
    100005    3   udp  60394  mountd
    100005    3   tcp  44809  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  60587  nlockmgr      # 鎖管理器
    100021    3   udp  60587  nlockmgr
    100021    4   udp  60587  nlockmgr
    100021    1   tcp  34744  nlockmgr
    100021    3   tcp  34744  nlockmgr
    100021    4   tcp  34744  nlockmgr
[root@Node5 ~]# ps aux|grep nfs
root      34060  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd4]
root      34061  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd4_callbacks]
root      34062  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34063  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34064  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34065  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34066  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34067  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34068  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34069  0.0  0.0      0     0 ?        S    08:13   0:00 [nfsd]
root      34101  0.0  0.0 103252   828 pts/1    S+   08:15   0:00 grep nfs      

   NFS監聽在UDP和TCP的2049端口,不會發生變化,其它各輔助程序監聽的端口号重新開機會發生變化,也可以修改服務腳本配置檔案中的某參數來實作。

三、nfs的配置

  nfs的共享目錄配置檔案在/etc/exports

1、設定NFS伺服器共享目錄/etc/exports

文法格式:

   檔案系統  用戶端1(檔案系統導出屬性)   用戶端2(檔案系統到處屬性)

 用戶端可以使用的格式:  # 不寫則為全部主機

    IP:192.168.10.4

    Hostname:*.magedu.com

    Network:192.168.10.0/255.255.255.0 或 192.168.10.0/24

 檔案系統導出屬性有: 多各屬性用逗号分隔

    ro:隻讀,預設

    rw:讀寫

    async:異步,預設

    sync:同步,性能差

    root_squash:壓縮root使用者,基于imapd,root使用者通過網絡通路時将映射為nfsnobody使用者,預設屬性

    no_root_squash:不壓縮root使用者,危險,

    all_squash:映射所有使用者,預設映射為nfsnobody,如果沒有啟用這個選項,用戶端建立檔案時,那麼在伺服器端顯示檔案的屬主、屬組和用戶端使用者 UID一樣的使用者,如果沒有該UID則顯示nobody。

    anonuid,anongid:指定匿名使用者映射為該UID和GID,這個指令要和上面的一起使用

    nohide:是否可以交叉使用nfs,不隐藏目錄下的nfs,不安全

    crossmnt:運作交叉使用nfs

showmount:  showmount指令也是由nfs-utils包提供

 -e:在nfs用戶端執行,探查某主機所導出的nfs檔案系統,使用格式:showmount -e Server_IP

 -d:在nfs伺服器端執行,顯示哪個導出的檔案系統已經被至少一個用戶端挂載使用了,測試不顯示

 -a:在nfs伺服器端顯示所有的挂載會話,測試不顯示

[root@Node5 ~]# showmount -e localhost
Export list for localhost:
/data 192.168.10.0/24
[root@Node5 ~]# showmount -d localhost
Directories on localhost:
[root@Node5 ~]# showmount -a localhost
All mount points on localhost:      

例:

  允許192.168.10.0網絡中所有主機以讀寫權限通路/data目錄

[root@Node5 data]# cat /etc/exports
/data 192.168.10.0/24(rw)
[root@Node5 data]# service nfs restart   # 修改配置檔案後需要重新開機,但此時如果有用戶端在讀寫,就會造成丢失      

用戶端挂載使用:

  用戶端也需要安裝nfs-utils

[root@Node4 ~]# mount -t nfs 192.168.10.5:/data /mnt
[root@Node4 ~]# ls /mnt
test1  test_file
[root@Node4 ~]# mount
/dev/sda2 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)
/dev/sda1 on /boot 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)
192.168.10.5:/data on /mnt type nfs (rw,vers=4,addr=192.168.10.5,clientaddr=192.168.10.4)      

exportfs   重新輸出共享目錄格式

 -a:操作所有檔案系統

 -ra:重新導出所有檔案系統

 -ua:取消到處的所有檔案系統

 -v:顯示詳細資訊

開機時自動挂載NFS共享:

寫入/etc/fstab

192.168.10.5:/data /mnt nfs defaults 0 0      
192.168.10.5:/data /mnt nfs defaults,_netdev 0 0