1. 程式人生 > >NFS網路共享介紹與使用

NFS網路共享介紹與使用

什麼是NFS(網路檔案系統)?

         NFS(Network File System)即網路檔案系統,是FreeBSD支援的檔案系統中的一種,它允許網路中的計算機之間通過TCP/IP網路共享資源。它的主要功能是通過網路(一般是區域網)讓不同主機系統之間可以共享檔案或目錄。NFS客戶的(一般是應用伺服器,例如,web)可以通過掛載(mount)的方式將NFS服務端共享的資料目錄掛載到NFS客戶端本地系統中(就是某一個掛載點下)。從NFS客戶端的機器本地看,NFS伺服器端共享的目錄就好像是客戶機自建的磁碟分割槽或目錄一樣,而實際上確是遠端的NFS伺服器的目錄。

       NFS網路檔案系統很像windows系統的網路共享、安全功能、網路驅動器對映,這也和linux系統裡的samba服務類似。只不過一般情況,windows網路共享服務或者samba服務用於辦公區域網共享,網際網路中小型網站叢集架構後端常用NFS作為資料共享,如果是大型網站。那麼有可能還會用到更復雜的分散式 檔案系統,例如,Moosefs(mfs),glusterfs,FastDFS等等。

 

例如:共享/data目錄給192.168.43.0/24整個網段的主機可讀寫。

測試資料如下:

一、NFS服務測試環境環境:

伺服器部署:

centos6.5X86_64       伺服器角色     ip  192.168.43.117

centos6.5X86_64       客戶端角色1   ip  192.168.43.118

centos6.5X86_64       客戶端角色2   ip  192.168.43.119

服務端配置:

配置主機名:

hostname nfs-server     臨時生效

vi /etc/sysconfig/nework  永久生效

 

檢視作業系統及核心版本資訊:

cat /etc/redhat-release   系統版本

uname –r              核心資訊

uname –m             系統位數

我們下查詢一下機器上是否安裝了NFS服務:

rpm –qa nfs-utils rpcbind  如果知道伺服器名字,此命令效率高

rpm –qa|egrep “nfs-utils|recbind”

安裝nfs軟體:centos6.5預設沒有安裝NFS軟體包(centos5預設是會安裝的。)因此我們可以:yum install nfs-utils rpcbind –y 命令來安裝nfs軟體。

rpcinfo –p localhost  //檢視NFS服務向rpc服務註冊的埠資訊,因為沒啟動nfs。

如果rpcbind服務未啟動,執行命令rpcinfo –p localhost檢查時,會報如下錯誤:

解決辦法:執行/etc/init.d/rpcbind start 啟動rpcbind服務即可。

啟動rpcbind服務:

/etc/init.d/rpcbind status    //檢視rpcbind服務狀態

/etc/init.d/rpcbind start    //啟動rpcbind服務

lsof -i :111                     //111埠為rpcbind服務對外提供服務的主埠。

啟動NFS服務:

  啟動順序:rpcbind服務,再啟動nfs服務。

etc/init.d/nfs start          //啟動nfs服務

netstat –lntup|grep 2049   //nfs主埠2049

rpcinfo –p localhost  //檢視NFS服務向rpc服務註冊的埠資訊。發現很多埠和功能的對應。

我們可以把啟動命令放到/etc/rc.lcal檔案裡。當然也可以用chkconfig管理。

下面我們開始操作NFS服務端配置檔案:

NFS服務的預設配置檔案路徑為:/etc/exports且預設是空的。

exports配置檔案格式:

NFS 共享的目錄 NFS客戶端地址(參1,參2…)

NFS 共享的目錄  NFS客戶端地址1(參1,參2…) 客戶端地址2(參1,參2…)

接下來,我們開始配置客戶端1:

如果執行showmunt -e 192.168.43.117命令出現No route to host錯誤提示,多數原因是因為防火牆沒有關導致的。

解決方法:執行service iptables stop命令即可。

NFS客戶端mount掛載的命令:

掛載命令   掛載的格式型別   NFS伺服器提供的共享目錄   NFS客戶端要掛載的目錄

mount             -t nfs                 ip地址:共享目錄                   要掛載的目錄(必須存在)

----------------------------------------------------------------------------------------------------------

mount –t nfs 192.168.43.117:/data /mnt 

df -h  檢視磁碟掛載資訊的情況(也可以用cat /proc/mounts)

此時我們測試一下:

①在共享目錄/data裡建立一個a.txt檔案,並寫入123值a.txt中,然後再客戶端掛載的目錄中看是否有服務端建立的檔案。

②在服務端刪除a.txt檔案,過後再客戶端建立b.log檔案。

服務端:

客戶端:

此時發現無法再客戶端建立檔案:

原因是/data屬主為root,解決方法:修改屬主

在NFS服務端把要共享的NFS目錄賦予預設使用者nfsnobody使用者和使用者組的許可權,
如果不設定會導致NFS客戶端訪問時無法通過NFS本地共享目錄許可權寫入資料,
當然也可以給NFS服務端本地共享目錄許可權,但工作中最好不用,因為777許可權太大了。

使用者和使用者組都是nfsnobody,服務端認為所有的客戶端寫入的檔案和目錄都會被壓縮成預設的uid為65534和nfsnobody使用者。

我們將rpcbind服務和掛載加入開啟啟動項:

到此,nfs客戶端1掛載成功。

注意:
實戰的情況下,客戶端是不用安裝nfs軟體的,centos6.4以前版本;
但是6.5、6.6要是不裝的話有時會有問題。所有我們在做測試的時候,
都裝nfs和rpbind。但是客戶端不用配置nfs和啟動

我們可以用同樣的方法配置客戶端2:

/etc/init.d/rpcbind start

vi /etc/rc.local

/etc/init.d/rpcbind start

mount –t nfs 192.168.43.117:/data /mnt

showmount –e 192.168.43.117

df –h

.......截圖省略

此時在客戶端2上,我們可以建立檔案,也可以管理掛載的目錄檔案:

建立c.txt檔案,並刪除服務端a.txt和客戶端1b.txt檔案。

解除安裝掛載點: umount -t nfs 192.168.43.117:/data /mnt

個人總結:

在工作中,我們配置/etc/exports內容為:/data 10.1.1.0/24(rw,sync,all_squash)

rw:表示讀寫。
ro:表示只讀
sync:請求或寫入資料時,資料同步寫入到NFS Server的硬碟後才返回。

優點:資料安全不會丟;缺點:效能比不啟用該引數要差

async:寫入時資料會先寫到記憶體快取區,直到硬碟有空擋才會再寫入磁碟,
這樣可以提升寫入效率!風險為若伺服器宕機或不正常關機,會損失快取區中
未寫入磁碟的資料

解決辦法:伺服器主機板電池或加UPS不間斷電源

all_squash:不管訪問NFS Server共享目錄的使用者身份如何,它的許可權都將被壓縮成匿名
使用者,同時它的UID和GID都會變成nfsnobody賬號身份。在早期多個NFS客戶端同時讀
寫NFS Server資料時,這個引數很有用
在生產中配置NFS的重要技巧:
1)確保所有客戶端伺服器對NFS共享目錄具備相同的使用者訪問許可權
a、all_squash把所有客戶端都壓縮成固定的匿名使用者(UID相同)。
b、就是anonuid,anongid指定的UID和GID的使用者。
2)所有的客戶端和伺服器端都需要有一個相同的UID和GID的使用者,即nfsnobody(UID必須相同)


例如exports內配置的為:
/data 192.168.43.0/24(rw,sync)
/etc/init.d/nfs reload //在服務端
在客戶端df -h 檢視依舊是掛載狀態,root使用者切到/mnt目錄下,可以建立目錄寄檔案;如果用普通使用者切換到/mnt目錄下,無法建立目錄及檔案。

反之,如果exports內配置為:/data 192.168.43.0/24(rw,sync,all_squash)
既可以在普通使用者下建立目錄及檔案,可讀可寫。並且常見的檔案及目錄屬主及屬組都為nfsnobody。

如果追求極致:可以用如下引數掛載:
mount –t nfs –o bg,hard,intr,rsize=121072,wsize=121072 192.168.43.0:/data /mnt

安全掛載引數:
mount –t nfs –o nosuid,noexec,nodev,rw 192.168.43.117:/data /mnt

nosuid:不希望共享的儲存被執行setuid的功能;
noexec:不希望共享的儲存被執行二進位制檔案;
nodev: 不希望共享的儲存建立的裝置。

通過mount –o 指定掛載引數和在/etc/fstab裡指定掛載引數效果是一樣的,網路檔案系統和本地的檔案系統效果也是一樣的。

有關NFS服務的所有伺服器核心優化:
cat >>/etc/sysctl.conf<<eof
net.core.wmem_default=8388608
net.core.rmem_default=8388608
net.core.rmem_max=16777216
net.core.wmem_max=16777216
eof
執行sysctl –p 生效。

如果解除安裝的時候提示: umount:/mnt:device is busy
解決方法:需要退出掛載目錄再進行解除安裝,或者是否NFS server宕機了,需要強制解除安裝:
mount –lf /mnt
此命令也可以:fuser –km /mnt 不建議用。

nfs效能優化掛載的例子:

①禁止更新目錄及檔案時間戳掛載
mount –t nfs –o noatime,nodiratime 192.168.43.117:/data
②安全加優化的掛載方式
mount –t nfs –o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,
wsize=131072 192.168.43.117:/data /mnt (intr:避免出問題時真個系統被NFS鎖死)
③預設的掛載方式
mount –t nfs 192.168.43.117:/data /mnt

NFS客戶端掛載排錯思路:

首先確認NFS服務端配置和服務是否ok(服務端最後自己掛載自己看是否ok)

確認NFS客戶端showmount是否ok(提示NO route to host關閉防火牆即可)