1. 程式人生 > >Linux下搭建NFS服務

Linux下搭建NFS服務

一,簡介

NFS是Network File System的縮寫,中文稱為網路檔案系統,由sun 公司所發展出來,主要功能是通過網路(一個區域網)讓不同的主機系統之間可以共享檔案或目錄,NFS的客戶端(一般為應用伺服器,例如web)可以通過掛載(mount)的方式將NFS伺服器共享的資料目錄掛載到NFS客戶端本地系統中(就是某一個關在點下),從客戶端本地看,NFS伺服器端共享目錄就好像是客戶端自己的磁碟分割槽或者目錄一樣,而實際上卻是遠端的NFS伺服器的目錄。
NFS網路檔案系統很像Windows系統的網路共享、安全功能、網路驅動器對映,這也和linux的samba服務類似,只不過一般情況下,Windows網路共享服務或samba服務使用者辦公區域網共享,而網際網路中小型網站叢集架構後端常用NFS進行資料共享,若是大型網站,那麼有可能還會用到更復雜的分散式檔案系統Moosefs(mfs)、GlusterFS。 

因為 NFS 支援的功能相當的多,而不同的功能都會使用不同的程式來啟動, 每啟動一個功能就會啟用一些埠來傳輸資料,因此, NFS 的功能所對應的端口才沒有固定住, 而是隨機取用一些未被使用的小於 1024 的埠口來作為傳輸之用。但如此一來又造成客戶端想要連上伺服器時的困擾, 因為客戶端得要知道伺服器端的相關埠口才能夠聯機吧!

此時我們就得需要遠端過程呼叫 (RPC) 的服務啦!RPC 最主要的功能就是在指定每個 NFS 功能所對應的 port number ,並且回報給客戶端,讓客戶端可以連結到正確的埠口上去。 那 RPC 又是如何知道每個 NFS 的埠口呢?這是因為當伺服器在啟動 NFS 時會隨機取用數個埠口,並主動的向 RPC 註冊,因此 RPC 可以知道每個埠口對應的 NFS 功能,然後 RPC 又是固定使用 port 111 來監聽客戶端的需求並回報客戶端正確的埠口, 所以當然可以讓 NFS 的啟動更為輕鬆愉快了!

所以要注意,要啟動 NFS 之前,RPC 就要先啟動了,否則 NFS 會無法向 RPC 註冊。 另外,RPC 若重新啟動時,原本註冊的資料會不見,因此 RPC 重新啟動後,它管理的所有服務都需要重新啟動來重新向 RPC 註冊。

 

當客戶端有 NFS 檔案存取需求時,他會如何向伺服器端要求資料呢?

  1. 客戶端會向伺服器端的 RPC (port 111) 發出 NFS 檔案存取功能的詢問要求;
  2. 伺服器端找到對應的已註冊的 NFS daemon 埠口後,會回報給客戶端;
  3. 客戶端了解正確的埠口後,就可以直接與 NFS daemon 來聯機。

由於 NFS 的各項功能都必須要向 RPC 來註冊,如此一來 RPC 才能瞭解 NFS 這個服務的各項功能之 port number, PID, NFS 在伺服器所監聽的 IP 等等,而客戶端才能夠透過 RPC 的詢問找到正確對應的埠口。 也就是說,NFS 必須要有 RPC 存在時才能成功的提供服務,因此我們稱 NFS 為 RPC server 的一種。事實上,有很多這樣的伺服器都是向 RPC 註冊的,舉例來說,NIS (Network Information Service) 也是 RPC server 的一種

 

二,環境前的準備:兩臺伺服器測試

server IP  192.168.0.97 

系統版本:

[[email protected] ~]# uname -r
2.6.32-431.el6.x86_64

[[email protected] ~]# hostname
nfs01

client IP  192.168.0.121

系統版本:

[[email protected] ~]# uname -r
2.6.32-431.el6.x86_64

[[email protected] ~]# hostname
nfs02

 

三,安裝nfs服務 server端

1.檢視是否安裝

[[email protected] ~]#  rpm -qa | grep nfs

[[email protected] ~]#  rpm -qa | grep rpcbind

2.安裝rpcbind和nfs軟體及檢查

[[email protected] ~]# yum -y install nfs-utils rpcbind

[[email protected] ~]#  rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-16.el6.x86_64
nfs-utils-1.2.3-78.el6.x86_64

[[email protected] ~]#  id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)

3.啟動nfs相關服務及啟動rpcbinf服務並檢查

啟動 

[[email protected] ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]

 檢查 

[[email protected] ~]# /etc/init.d/rpcbind status
rpcbind (pid  7674) is running... 檢視rpc埠 [[email protected] ~]# netstat -tnulp|grep rpc
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      7674/rpcbind       
tcp        0      0 :::111                      :::*                        LISTEN      7674/rpcbind       
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               7674/rpcbind       
udp        0      0 0.0.0.0:641                 0.0.0.0:*                               7674/rpcbind       
udp        0      0 :::111                      :::*                                    7674/rpcbind       
udp        0      0 :::641                      :::*                                    7674/rpcbind        檢視埠對映情況: [[email protected] ~]#  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 注意:在未啟動nfs服務時,不能看到nfs埠的對映情況   啟動nfs服務並進行檢查 [[email protected] ~]# /etc/init.d/nfs start Starting NFS services:                                     [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ] 檢視埠對映情況:
[[email protected] ~]#  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  53090  mountd
    100005    1   tcp  47431  mountd
    100005    2   udp  38644  mountd
    100005    2   tcp  36040  mountd
    100005    3   udp  60435  mountd
    100005    3   tcp  54783  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  36742  nlockmgr
    100021    3   udp  36742  nlockmgr
    100021    4   udp  36742  nlockmgr
    100021    1   tcp  59477  nlockmgr
    100021    3   tcp  59477  nlockmgr
    100021    4   tcp  59477  nlockmgr 新增到開機啟動中並檢查 [[email protected] ~]#  echo "/etc/init.d/rpcbind start" >>/etc/rc.local
[[email protected] ~]#  echo "/etc/init.d/nfs start" >>/etc/rc.local
[[email protected] ~]# cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff. touch /var/lock/subsys/local
/etc/init.d/rpcbind start
/etc/init.d/nfs start   四,建立共享目錄測試並配置nfs服務的配置檔案/etc/exports 建立共享目錄 [[email protected] ~]# mkdir /data [[email protected] ~]# ll -d /data/
drwxr-xr-x 2 root root 4096 Dec  8 07:09 /data/ 更改目錄許可權 [[email protected] ~]# chown -R nfsnobody.nfsnobody /data/
[[email protected] ~]# ll -d /data/
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec  8 07:09 /data/ 預設情況下該配置檔案是空的: [[email protected] ~]# cat /etc/exports
[[email protected] ~]# ll -h /etc/exports
-rw-r--r--. 1 root root 0 Jan 12 2010 /etc/exports
編輯該配置檔案:
 [[email protected] ~]# vim /etc/exports /data    192.168.0.0/24(rw,sync) 重新載入nfs服務 [[email protected] ~]# /etc/init.d/nfs reload 檢查有許可權掛載的伺服器是否能夠掛載 [[email protected] ~]# showmount -e 192.168.0.97或者showmount   -e   locahost
Export list for 192.168.0.97:
/data 192.168.0.0/24
也可以進行本機伺服器測試 [[email protected] ~]# mount -t nfs 192.168.0.97:/data /mnt
[[email protected] ~]# df -h
Filesystem          Size  Used Avail Use% Mounted on
/dev/sda3            18G 1003M   16G   6% /
tmpfs               491M     0  491M   0% /dev/shm
/dev/sda1           194M   27M  158M  15% /boot
/dev/sr0            4.2G  4.2G     0 100% /yum
192.168.0.97:/data   18G 1003M   16G   6% /mnt  

 NFS配置引數許可權,具體如下表

引數名稱 引數用途
rw(熟記) 表示可讀寫許可權
sync(熟記) 請求或寫入資料時,資料同步寫入到NFS Server的硬碟後才返回,優點:資料安全不會丟,缺點:效能比不啟用該引數要差
async(熟記) 寫入資料時會先寫到記憶體緩衝區,直到硬碟有空檔才會在寫入磁碟,這樣可以提升寫入效率。風險是若伺服器宕機或不正常關機,會損失緩衝區中未寫入硬碟的資料(解決辦法:伺服器主機板電池或UPS不間斷電源)
all_squash(熟記) 不管訪問NFS Server共享目錄的使用者身份如何,它的許可權都將被壓縮為匿名使用者,同時它的UID和GID都會變成nfsnobody賬號身份,在早期多個NFS客戶端同時讀寫NFS Server資料時,這個引數很有用,在生產環境中配置NFS的重要技巧:1)確保所有客戶端伺服器對NFS共享目錄具備相同的使用者訪問許可權,all_squash把所有客戶端都壓縮成匿名使用者(UID相同),就是anonuid,anongid指定的UID和GID相同,2)所有的客戶端和伺服器端都需要有一個相同的UID和GID的使用者,nfsnodoby(UID必須相同)
anonuid(熟記) 引數以anon*開頭即值anonymous匿名使用者,這個使用者的UID設定值通常為nfsnobody的UID值,當然我們也可以自行設定這個UID值。但是,UID必須存在於/etc/passwd中。在多個NFS Clients時,如多臺web server共享一個NFS目錄時,通過這個引數可以使得不同的NFS Clients寫入的資料對所有NFS Clients保持同樣的使用者許可權,即為配置的匿名UID對應使用者許可權,這個引數很有用。一般預設就好
anongid(熟記) 同anonuid,區別是把uid(使用者id)換成gid(組id)
ro 表示只讀許可權
  五,nfs客戶端的配置 安裝並檢查 [[email protected] ~]# yum install nfs-utils [[email protected] ~]# rpm -qa  nfs-utils nfs-utils-1.2.3-39.el6.x86_64 檢查能否訪問服務端 [[email protected] mnt]# showmount -e 192.168.0.97
Export list for 192.168.0.97:
/data 192.168.0.0/24 掛載nfs共享目錄 [[email protected] ~]# mount -t nfs 192.168.0.97:/data /mnt/
[[email protected] ~]# df -h
Filesystem                      Size  Used Avail Use% Mounted on
/dev/mapper/vg_centos6-lv_root   18G  2.8G   14G  17% /
tmpfs                           491M     0  491M   0% /dev/shm
/dev/sda1                       485M   34M  426M   8% /boot
/dev/sr0                        3.6G  3.6G     0 100% /yum
192.168.0.97:/data               18G 1003M   16G   6% /mnt 檢視 [[email protected] ~]# mount
/dev/mapper/vg_centos6-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)
/dev/sda1 on /boot type ext4 (rw)
/dev/sr0 on /yum type iso9660 (ro)
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)
192.168.0.97:/data on /mnt type nfs (rw,vers=4,addr=192.168.0.97,clientaddr=192.168.0.121)