有人的地方就有江湖,IT界也不例外。
在過去幾十年里,IT江湖從來都是門派林立,紛爭不斷。如果按照Operating System (下面簡稱OS), 大概可以分Windows派,類Unix派,還有蘋果派(有沒有勾起您的食欲?)。這幾大門派信徒眾多,教規(guī)又各不相同,所以經(jīng)常造成矛盾。比如說,你要共享一個(gè)文件系統(tǒng),Windows派喜歡用CIFS訪問,類Unix派習(xí)慣用NFS訪問,近年來如日中天的蘋果派們則用AFP。為了伺候好這些門派,NAS就需要支持多種共享協(xié)議。本文要介紹的,就是類Unix習(xí)慣使用的NFS。
NFS的全稱是Network File System,即網(wǎng)絡(luò)文件系統(tǒng)。它使一臺電腦可以通過網(wǎng)絡(luò)訪問另外一臺電腦上的共享,使用起來就如同本地文件系統(tǒng)一樣方便。我在大學(xué)里就共享過一整個(gè)文件系統(tǒng),過幾天就有校友在上面放了很多小電影,還經(jīng)常更新??梢姽蚕聿粌H是奉獻(xiàn),有時(shí)候還有收獲,感謝共享協(xié)議的開發(fā)者們!
NFS的開發(fā)者就是曾經(jīng)名震江湖的SUN公司(看名字好像是日月神教的分支),它已經(jīng)在三年前被甲骨文收入門下。SUN把NFS的第一個(gè)版本NFSv1藏在深閨,就像古墓里的小龍女,從不露面。等到在江湖上開始流行NFS,已經(jīng)是第二版NFSv2了。NFSv2很好用,但是問題也不少,比如它不支持大于2GB的文件,但這在90年代之前還不是大問題。令人費(fèi)解的是,雖然NFSv3在1995年就面世了,但到今天還有人堅(jiān)持用NFSv2。我直到寫《IT裝B指南》時(shí)才恍然大悟:用老版本的都是IT貴族啊,配NFSv4的只能算初級iBer。
其實(shí)NFS可以工作在任何OS上。只不過因?yàn)殚T派之別,一般只在類Unix環(huán)境中使用。目前廣泛應(yīng)用的版本還是NFSv3,我們有機(jī)會再另文討論NFSv4。下圖展示了多臺客戶端通過NFS對NAS的訪問。
NAS在這里充當(dāng)了NFS服務(wù)器的角色,而Linux,Solaris和AIX則是NFS客戶機(jī)。NFS的功能很多,不同的功能對應(yīng)著不同的daemon。比如一定要有的nfsd和mountd,還有可選的lockd和statd。
每個(gè)daemon都需要占用一些端口,但有些daemon是可選的,也許用戶根本不會啟用它們。所以,NFS并沒有給每個(gè)NFS daemon保留固定端口(除了nfsd)。而是在系統(tǒng)啟動(dòng)時(shí)給需要啟用的NFS daemon分配端口,然后把這些端口號告訴RPC daemon。RPC daemon的端口號是固定的111,每個(gè)NFS客戶機(jī)都知道怎么聯(lián)系它。當(dāng)客戶機(jī)需要連接NFS的某個(gè)daemon時(shí),就不得不先咨詢RPC daemon,獲得該NFS daemon對應(yīng)的端口號,然后再發(fā)送NFS請求。
我第一次看到RPC daemon的工作原理,就想起交大管浴室的老頭。他的固定地址是門房(相當(dāng)于端口111),每個(gè)要洗澡的學(xué)生(NFS客戶機(jī))都知道怎么找到他,他會給你一個(gè)帶號碼的鑰匙(端口號),有了這個(gè)號碼,你就可以找到相應(yīng)的格子(NFS daemon)放衣服了。
很少有人會對自己的共享不加限制,像我一樣收獲小電影的畢竟是少數(shù),大多數(shù)人收獲的是惡作劇。NFS通過限制客戶機(jī)(比如IP地址, hostname等)訪問來實(shí)現(xiàn)安全控制。下表列舉了一些NFS服務(wù)器端的參數(shù):
這些配置只能限制一整臺客戶機(jī),無法限制到具體用戶。比如某臺客戶機(jī)被限制為rw,那該機(jī)的所有用戶都可能有讀寫權(quán)限。這顯然是不夠安全的,但NFS協(xié)議本身又無法識別具體用戶的權(quán)限。為了解決這個(gè)問題,NFS服務(wù)器端利用本地權(quán)限(rwxrwxrwx,以及owner和group),結(jié)合客戶端的UID和GID來確定客戶端權(quán)限。這個(gè)機(jī)制要求NFS客戶機(jī)上的User-UID-Group必須都能在服務(wù)器上找到,否則容易造成混亂。個(gè)人認(rèn)為NIS是一個(gè)很好的選擇,我們有機(jī)會再另文討論。
NFS服務(wù)器上的共享創(chuàng)建好了之后,客戶端就可以掛載(mount)了。掛載的參數(shù)很多,我們只介紹對性能影響較大的幾個(gè):
掛載之后,我們就可以使用該共享了。我在lab里掛載了一個(gè)文件系統(tǒng)(/paddy_fs_01),然后讀取其中一個(gè)文件(abc.txt)。命令如下:
[root@NISclient ~]# mount 10.32.106.25:/paddy_fs_01 paddy_fs_01
[root@NISclient ~]# cp paddy_fs_01/abc.txt abc.txt
為了更好的說明NFS的工作原理,我把全過程抓了包。把其中不重要的包過濾掉之后,我們可以這樣解讀(下列序號與截圖中的包號相對應(yīng)):
1. 客戶機(jī):RPC,請問nfsd的端口號是多少呀?
2. 服務(wù)器:是2049。
3. 客戶機(jī):那我測試一下2049通不通。
4. 服務(wù)器:收到了,是通的。
5. 客戶機(jī):RPC,請問mountd的端口號是多少呀?
6. 服務(wù)器:是1234。
7. 客戶機(jī):那我測試一下1234通不通。
8. 服務(wù)器:收到了,是通的。
9. 客戶機(jī):我要掛載 /paddy_fs_01。
10.服務(wù)器:(根據(jù)該共享的配置,這臺客戶機(jī)有掛載權(quán)限,所以)你的請求被批準(zhǔn)了。
11.客戶機(jī):我測試一下掛上了沒有。
12.服務(wù)器:掛上了啦。
13.客戶機(jī):我想看看這個(gè)文件系統(tǒng)的屬性。
14.服務(wù)器:給,就這些。
...掛載結(jié)束,讀abc.txt開始:
17. 客戶機(jī):我要訪問 /paddy_fs_01。
18. 服務(wù)器:來吧,(根據(jù)你的UID)你有讀,查詢,更改,擴(kuò)展和刪除的權(quán)利。
19. 客戶機(jī):我想看看有哪些子目錄。
20. 服務(wù)器:看,就這些。
21. 客戶機(jī):我想看看abc.txt的屬性。
22. 服務(wù)器:File Mode等屬性都在這了。
23. 客戶機(jī):我還想再看看。
24. 服務(wù)器:再給你一次好了。
25. 客戶機(jī):我想訪問abc.txt。
26. 服務(wù)器:你有權(quán)限的,訪問吧。
27. 客戶機(jī):我要讀abc.txt,從0開始讀16384字節(jié)。
28. 服務(wù)器:給。
29. 客戶機(jī):我要讀abc.txt,從16384開始讀32768字節(jié)。
(被過濾掉的包,服務(wù)器傳輸32768字節(jié)給客戶機(jī)。)
30. 客戶機(jī):我要讀abc.txt,從49152開始讀32606字節(jié)。
(被過濾掉的包,服務(wù)器傳輸32606字節(jié)給客戶機(jī)。)