Network File System(NFS)網絡檔案系統是由Sun公司開發的一種通過網絡方式共享檔案系統的通用共享解決方案。目前NFS有三個版本NFSv2、NFSv3、NFSv4。NFSv2是個古老的版本但卻被廣大的作業系統所支援,這樣它的相容性會更好,NFSv3擁有更多的特色,包括更快的速度、更大的單個檔案大小、更多便于排錯的錯誤及成功資訊、對TCP協定的支援等,NFSv4提供了有狀态的連接配接,更容易追蹤連接配接狀态、增強了安全特性,CentOS 6.3版本預設使用版本4提供NFS網絡檔案系統共享服務,NFS監聽在TCP的2049端口。
所需軟體:nfs-utils、rpcbind。
NFS伺服器通過讀取/etc/exports配置檔案決定哪些用戶端可以通路哪些NFS共享檔案系統,該檔案的文法格式如下:
空白行将被忽略
以#符号開頭的内容為注釋
配置檔案中可以通過\符号轉義換行
每個共享的檔案系統需要獨立一行條目
用戶端主機清單需要使用空格隔開
配置檔案中支援通配符
一條完整的共享條目結構如下,用戶端可以是一個網段、單台主機或主機名:
共享路徑 用戶端主機(選項)
我們也可以為多個客戶主機設定不同的通路選項,結構如下:
共享路徑 用戶端主機1(選項) 用戶端主機2 (選項) …
最簡單的NFS配置可以僅給定一個共享路徑與一個用戶端主機而不指定選項,因為沒有選項NFS将使用預設設定,預設屬性為ro,sync,wdelay,root_squash。具體NFS屬性及其對應含義見表4-1,檢視exports的幫助文檔可以找到很多伺服器配置模版。
表4-1
NFS選項
功能描述
含義描述
ro
隻讀共享
rw
可讀可寫共享
sync
同步寫操作
async
異步寫操作
wdelay
延遲寫操作
root_squash
屏蔽遠端root權限
no_root_squash
不屏蔽遠端root權限
all_squash
屏蔽所有遠端使用者權限
以上選項中ro與rw比較容易了解,用來定義用戶端通路共享時可以獲得的權限是隻讀通路還是可讀寫通路。計算機對資料進行修改會先将修改的内容寫入快速的記憶體,随後才會慢慢寫入慢速的硬碟裝置中,async選項允許NFS伺服器在沒有完全把資料寫入硬碟前就傳回成功消息會用戶端,而此時資料實際還存放在記憶體中,但用戶端顯示資料已經寫入成功,該選項可以優化NFS性能,但有可能非正常關閉NFS時導緻的資料丢失情況,sync選項将確定在資料真正寫入儲存設備後才會傳回成功資訊。wdelay延遲寫入也就是說先将資料寫入記憶體,這樣可以将多個寫入請求合并後再寫入硬碟,這樣可以減少對硬碟IO的次數進而優化性能,與此相反的選項是no_wdelay但該選項與async選項一起使用時不生效,因為async就是基于wdelay對用戶端的回應功能。預設情況下NFS會自動屏蔽root使用者的權限,root_squash使得用戶端使用root帳号通路NFS時預設會而将root映射本地為匿名帳号,通過anonuid可以指定匿名帳号ID,預設anonuid為65534也就是nfsnobody帳号,使用no_root_squash可以防止這種轉換而保留root權限,all_squash選項則可以屏蔽所有賬戶權限,将所用使用者對NFS的通路自動映射為匿名賬戶,預設普通帳号的權限是保留的。
下面通過案例實際示範NFS伺服器的搭建過程,服務架構見圖4-1,共享/var/web/與/var/cloud目錄,在該案例中172.16.0.0/16網段内的所有主機均可以異步可讀可寫通路web目錄,任何主機都可以同步隻讀通路/var/cloud目錄,且不屏蔽root使用者對cloud目錄的通路權限。
<a target="_blank" href="http://blog.51cto.com/attachment/201303/005016564.png"></a>
圖4-1
[root@nfsserver ~]# yum -y install nfs-utils rpcbind
[root@nfsserver ~]# rpm -qa |grep nfs-utils
nfs-utils-lib-devel-1.1.5-4.el6.x86_64
nfs-utils-1.2.3-26.el6.x86_64
nfs-utils-lib-1.1.5-4.el6.x86_64
[root@nfsserver ~]# rpm -qa |grep rpcbind
rpcbind-0.2.0-9.el6.x86_64
[root@nfsserver ~]# useradd -u 1003 jerry
[root@nfsserver ~]# mkdir /var/{web,cloud}
[root@nfsserver ~]# chmod a+w /var/web
[root@nfsserver ~]# cat /etc/exports
/var/web/ 172.16.0.20(rw,async,no_root_squash)
/var/cloud/ *(ro,sync)
[root@nfsserver ~]# /etc/init.d/rpcbind restart
[root@nfsserver ~]# /etc/init.d/nfs restart
[root@nfsserver ~]# chkconfig rpcbind on
[root@nfsserver ~]# chkconfig nfs on
用戶端可以通過showmount指令檢視伺服器共享資訊,通過mount挂載NFS共享,mount挂載屬性有很多為我們提供了足夠多的挂載特性。
Client1挂載使用nfsserver共享目錄/var/web至本機/var/web目錄,該共享目錄可以讀寫,且root帳号不會被映射為匿名帳号(root的權限會被保留):
[root@client /]# showmount -e 172.16.0.254
Export list for 192.168.0.254:
/var/cloud *
/home *
/var/web 172.16.0.20
[root@client1 ~]# mkdir /var/web
[root@client1 ~]# useradd -u 1003 jerry
[root@client1 ~]# mount 172.16.0.254:/var/web /var/web #手動挂載
[root@client1 ~]# echo #設定開機自動挂載
>“172.16.0.254:/var/web /var/web nfs defaults 0 0” >> /etc/fstab
[root@client1 ~]# chmod a+w /var/web #給所有使用者可寫權限
[root@client1 web]# cd /var/web ; touch root.txt
[root@centos6 /]# ll /var/web/
total 0
-rw-r--r--. 1 root root 0 Mar 10 08:20 root.txt
[root@client1 web]# su - jerry
[root@client1 ~]# cd /var/web/
[root@client1 web]# touch jerry.txt
[root@client1 web]# ls -l
-rw-r--r--. 1 nfsnobody nfsnobody 0 Mar 9 23:12 root.txt #root被映射為nfsnobody
-rw-rw-r--. 1 jerry jerry 0 Mar 9 23:21 jerry.txt #jerry為正常使用者權限
Client2挂載使用nfsserver共享目錄/var/cloud至本機/var/cloud目錄,該目錄為隻讀共享,預設root權限會自動映射為nfsnobody帳号,普通帳号權限将保留:
[root@client2 ~]# mkdir /var/cloud
[root@client2 ~]# useradd -u 1003 jerry
[root@client2 ~]# mount 172.16.0.254:/var/cloud /var/cloud
[root@client2 ~]# echo #設定開機自動挂載
>“172.16.0.254:/var/cloud /var/cloud nfs defaults 0 0” >> /etc/fstab
[root@client2 ~]# cd /cloud/
[root@client2 cloud]# touch root.txt #提示該檔案系統隻讀
touch: cannot touch `root.txt': Read-only file system
詳細剖析權限問題,由于共享資料實際是存儲在NFS伺服器上,是以所有的操作實際是以伺服器本機的賬戶進行的,隻是伺服器會根據不同的情況将遠端用戶端的通路賬戶轉換為不同的伺服器本機賬戶:
l 用戶端使用普通使用者連接配接伺服器時,預設如果用戶端使用的賬戶UID在伺服器上也有相同的賬戶UID,則伺服器将使用伺服器本機上該UID帳号進行讀寫操作,然而如果用戶端通路伺服器所使用的賬戶UID在伺服器上沒有,則伺服器自動将帳号轉換為nobody帳号。此外如果服務端對共享屬性配置了all_squash選項,則伺服器會根據anonuid選項的值,将所有賬戶自動轉換為匿名帳号。
l 用戶端使用root連接配接伺服器時,如果預設會将root轉換為伺服器上的nfsnobody帳号,如果服務端對共享屬性配置了no_root_squash選項,則伺服器會将遠端root賬戶轉換為本機root帳号進行讀寫操作。
本文轉自丁丁曆險51CTO部落格,原文連結:http://blog.51cto.com/manual/1151551,如需轉載請自行聯系原作者