1、NFS簡介html
一、NFS就是Network FileSystem的縮寫,它的最大功能就是能夠經過網絡讓不一樣的機器,不一樣的操做系統彼此共享文件(sharefiles)——能夠經過NFS掛載遠程主機的目錄,訪問該目錄就像訪問本地目錄同樣,因此也能夠簡單的將它看做一個文件服務器(FileServer)。shell
注意:通常而言,使用NFS服務可以方便地使各unix-like系統之間實現共享,但若是須要在unix-like和windows系統之間共享,那就得使用samba了。windows
二、NFS是經過網絡進行數據傳輸,那麼NFS使用哪些端口呢,答案是……不知道,由於NFS傳輸數據時使用的端口是隨機的,惟一的限制就是小於1024,客戶端怎麼知道服務器使用的是哪一個端口,此時就要用到遠程過程調用RPC。安全
其實,NFS運行在SUN的RPC(Remote Procedure Call,遠程過程調用)基礎上,RPC定義了一種與系統無關的方法來實現進程間通訊,由此,NFS Server也能夠看做是RPC Server。正由於NFS是一個RPC服務程序,因此在使用它以前,先要映射好端口——經過portmap設定。好比:某個NFSClient發起NFS服務請求時,它須要先獲得一個端口(port),因此它先經過portmap獲得portnumber(不只是NFS,全部的RPC服務程序啓動以前,都須要先設定好portmap)。服務器
注意:在啓動RPC服務(好比NFS)以前,須要先啓動portmap服務。網絡
三、NFS容許系統將其目錄和文件共享給網絡上的其餘系統。經過NFS,用戶和應用程序能夠訪問遠程系統上的文件,就像它們是本地文件同樣。那麼NFS最值得注意的優勢有:
(1)本地工做站可使用更少的磁盤空間,由於經常使用數據能夠被保存在一臺機器上,並讓網絡上的其餘機器能夠訪問它。
(2)不須要爲用戶在每臺網絡機器上放一個用戶目錄,由於用戶目錄能夠在NFS服務器上設置並使其在整個網絡上可用。
(3)存儲設備如軟盤、光驅及USB設備能夠被網絡上其它機器使用,這可能能夠減小網絡上移動設備的數量。dom
2、與NFS相關的幾個文件和命令async
一、/etc/exports
對NFS服務的訪問是由exports來批准,它枚舉了若干有權訪問NFS服務器上文件系統的主機名。ide
二、/sbin/exportfs
維護NFS的資源共享,能夠經過它從新設定/etc/exports的共享目錄,卸載NFS Server共享的目錄或者從新共享等。oop
三、/usr/sbin/showmount
上面的文件主要用在NFS Server端,而showmount則主要用在Client端,showmount能夠用來查看NFS共享的目錄資源。
四、/var/lib/nfs/xtab
NFS的記錄文檔:經過它能夠查看有哪些Client鏈接到NFS主機的記錄。
下面這幾個並不直接負責NFS,實際上它們是負責全部的RPC。
五、/etc/default/portmap
實際上,portmap負責映射全部的RPC服務端口,它的內容很是很是之簡單。
六、/etc/hosts.deny
設定拒絕portmap服務的主機,即禁止訪問的客戶端IP列表。
七、/etc/hosts.allow
設定容許portmap服務的主機,即容許訪問的客戶端IP列表。
3、NFS安裝
在主機上安裝NFS服務軟件,由於Debian/Ubuntu上默認是沒有安裝的。
一、安裝端口映射器portmap(可選)
$ sudo apt-get install portmap
二、在終端提示符後鍵入如下命令安裝NFS服務器
$ sudo apt-get install nfs-kernel-server
三、安裝NFS客戶端(可選)
$ sudo apt-get install nfs-common
注意:nfs-kernel-server和nfs-common都依賴於portmap。另外,在一些文檔中提出還須要使用apt-get來手動安裝NFS的客戶端nfs-common,以及端口映射器portmap,但其實這是沒有必要的,由於在安裝nfs-kernel-server時,apt會自動把它們安裝好。
這樣,宿主機就至關於NFS Server。一樣地,目標系統做爲NFS的客戶端,須要安裝NFS客戶端程序。若是是Debian/Ubuntu系統,則須要安裝nfs-common(第3步)。
4、NFS配置
一、配置portmap
方法1:編輯/etc/default/portmap,將"-i 127.0.0.1"去掉;
方法2:$ sudo dpkg-reconfigure portmap,出現「正在設定portmap」軟件包設置界面,對Should portmap be bound to the loopback address?選擇「否(No)」。
二、配置/etc/hosts.deny
禁止任何host(主機)能和你的NFS服務器進行NFS鏈接。在該文件中加入:
### NFS DAEMONS
portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL
三、配置/etc/hosts.allow
容許那些你想要的主機和你的NFS服務器創建鏈接。
下列步驟將容許任何IP地址以192.168.1開頭的主機鏈接到NFS服務器上,具體要看你目標板的端口地址,也能夠指定特定的IP地址。在該文件中加入:
### NFS DAEMONS
portmap: 192.168.1.
lockd: 192.168.1.
rquotad: 192.168.1.
mountd: 192.168.1.
statd: 192.168.1.
經過/etc/hosts.deny和/etc/hosts.allow設置對portmap的訪問,採用這兩個配置文件有點相似"mask"的意思。先在/etc/hosts.deny中禁止全部用戶對portmap的訪問,再在/etc/hosts.allow中容許某些用戶對portmap的訪問。
而後重啓portmap daemon:
$ sudo /etc/init.d/portmap restart
四、配置/etc/exports
(1)共享的NFS目錄在/etc/exports中列出,這個文件控制對目錄的共享(NFS掛載目錄及權限由該文件定義),書寫規則是每一個共享爲一行)。
格式:[共享目錄] [主機名或IP](參數,參數...)
第一個參數是要讓客戶機訪問的目錄,第二個是你容許的主機IP,最後的()內是訪問控制方式。
注意:客戶端可使用主機名或者IP地址指定,在主機名中可使用通配符(*),IP地址後也能夠跟掩碼段(/24),但出於安全緣由這種狀況應該儘可能避免。客戶端的說明後可在圓括號中加入一系列參數。很重要的一點,不要在最後一個客戶端聲明的後面留下任何空白或者沒關閉括號,由於空白都被解釋成客戶端的分隔符。
例如我要將/opt/FriendlyARM/mini2440/root_nfs目錄讓用戶的IP共享,則在該文件末尾添加下列語句:
/opt/FriendlyARM/mini2440/root_nfs *(rw,sync,no_root_squash)
其中:
/opt/FriendlyARM/mini2440/root_nfs 表示NFS共享目錄,它能夠做爲開發板的根文件系統經過NFS掛接;
* 表示全部的客戶機均可以掛接此目錄;
rw 表示掛接此目錄的客戶機對該目錄有讀寫的權力;
sync 表示全部數據在請求時寫入共享,即數據同步寫入內存和硬盤;
no_root_squash 表示容許掛接此目錄的客戶機享有該主機的root身份。
注意:能夠用主機名來代替*,儘可能指定主機名以便使那些不想其訪問的系統不能訪問NFS掛載的資源。另外,最好加上sync, 不然$ sudo exportfs -r時會給出警告,sync是NFS的默認選項。
(2)下面是一些NFS共享的經常使用參數:
ro 只讀訪問
rw 讀寫訪問
sync 全部數據在請求時寫入共享
async NFS在寫入數據前能夠相應請求
secure NFS經過1024如下的安全TCP/IP端口發送
insecure NFS經過1024以上的端口發送
wdelay 若是多個用戶要寫入NFS目錄,則歸組寫入(默認)
no_wdelay 若是多個用戶要寫入NFS目錄,則當即寫入,當使用async時,無需此設置
hide 在NFS共享目錄中不共享其子目錄
no_hide 共享NFS目錄的子目錄
subtree_check 若是共享/usr/bin之類的子目錄時,強制NFS檢查父目錄的權限(默認)
no_subtree_check 和上面相對,不檢查父目錄權限
all_squash 共享文件的UID和GID映射匿名用戶anonymous,適合公用目錄
no_all_squash 保留共享文件的UID和GID(默認)
root_squash root用戶的全部請求映射成如anonymous用戶同樣的權限(默認)
no_root_squash root用戶具備根目錄的徹底管理訪問權限
anonuid=xxx 指定NFS服務器/etc/passwd文件中匿名用戶的UID
anongid=xxx 指定NFS服務器/etc/passwd文件中匿名用戶的GID
(3)查看NFS Server的export list:
$ sudo showmount -e
若更改了/etc/exports,運行如下命令進行更新:
$ sudo exportfs -r
而後重啓NFS服務:
$ sudo /etc/init.d/nfs-kernel-server restart
5、啓動和中止NFS服務
一、啓動NFS的方法和啓動其餘服務器的方法相似,首先須要啓動portmap和NFS這兩個服務,而且portmap服務必定要先於NFS服務啓動。
$ sudo /etc/init.d/portmap start
$ sudo /etc/init.d/nfs-kernel-server start
二、中止NFS服務
在中止NFS服務的時候,須要先中止NFS服務再中止portmap服務,若是系統中還有其餘服務須要使用portmap服務,則能夠不中止portmap服務。
$ sudo /etc/init.d/nfs-kernel-server stop
$ sudo /etc/init.d/portmap stop
三、從新啓動portmap和NFS服務
$ sudo /etc/init.d/portmap restart
$ sudo /etc/init.d/nfs-kernel-server restart
四、檢查portmap和NFS服務狀態
$ sudo /etc/init.d/portmap status
$ sudo /etc/init.d/nfs-kernel-server status
五、設置自動啓動NFS服務
(1)檢查NFS的運行級別:
$ sudo chkconfig --list portmap
$ sudo chkconfig --list nfs-kernel-server
(2)在實際使用中,若是每次開啓計算機以後都手工啓動NFS服務是很是麻煩的,此時能夠設置系統在指定的運行級別自動啓動portmap和NFS服務。
$ sudo chkconfig --level 235 portmap on
$ sudo chkconfig --level 235 nfs-kernel-server on
6、NFS客戶端配置(NFS測試)
一、在NFS服務器啓動後,還須要檢查Linux服務器的防火牆設置(通常須要關閉防火牆服務),確保沒有屏蔽NFS使用的端口和容許通訊的主機,主要是檢查Linux服務器iptables、ipchains等選項的設置,以及/etc/hosts.deny,/etc/hosts.allow文件。一般都是在內部局域網中進行開發,再安裝系統時最好不要安裝防火牆等網絡安全軟件,以方便使用時的配置。
若是你有防火牆,請確保3277一、111和2049端口保持開放。
二、手動掛載
使用mount命令來掛載其餘機器共享的NFS目錄。
格式:$ sudo mount [Server IP]:/[share dir] [local mount point]
例如:
$ sudo mount -t nfs [-o nolock] localhost:/opt/FriendlyARM/mini2440/root_nfs /mnt/root_nfs 或
$ sudo mount -t nfs -o nolock 192.168.1.101:/opt/FriendlyARM/mini2440/root_nfs /mnt/root_nfs
其中,localhost能夠是具體的IP地址,同時掛載點/mnt/root_nfs目錄必須已經存在,並且在/mnt/root_nfs目錄中沒有文件或子目錄。
三、自動掛載
(1)另外一個掛載其餘機器的NFS共享的方式就是在/etc/fstab文件中添加一行,該行必須指明NFS服務器的主機名、服務器輸出的目錄名以及掛載NFS共享的本機目錄,同時必須是根用戶才能修改/etc/fstab文件。
格式:server.mydomain.com:/usr/local/pub /pub nfs rsize=8192,wsize=8192,timeo=14,intr
注意:能夠根據實際狀況修改NFS服務器共享文件夾"servername.mydomain.com:/usr/local/pub"和在本機的掛載點"/pub",同時掛載點/pub在客戶端機器上必須存在。
(2)NFS常見掛載參數:
timeo 若是超時,客戶端等待的時間,以十分之一秒計算
retrans 超時嘗試的次數
bg 後臺掛載(頗有用)
hard 若是server端沒有響應,那麼客戶端一直嘗試掛載
rsize 讀塊大小
wsize 寫塊大小
四、使用autofs來掛載NFS
(1)掛載NFS共享的第三種方法是使用autofs,它使用automount守護進程來管理掛載點,只在文件系統被訪問時才動態地掛載。
autofs訪問主映射配置文件/etc/auto.master來決定要定義哪些掛載點,而後使用適用於各個掛載點的參數來啓動automount守護進程。主映射配置中的每一行都定義一個掛載點,一個分開的映射文件定義在該掛載點下要掛載的文件系統。如/etc/auto.misc文件可能會定義/misc目錄中的掛載點,這種關係在/etc/auto.master文件中會被定義。
(2)/etc/auto.master文件中的每一個項目都有3個字段,第1個字段是掛載點;第2個字段是映射文件的位置;第3個字段可選,能夠包括超時數值之類的信息。
例如:要在機器上的/misc/myproject掛載點上掛載遠程機penguin.example.net中的/project52目錄。
在/etc/auto.master文件中添加如下行:
/misc /etc/auto.misc --timeout 60
在/etc/auto.misc文件中添加如下行:
myproject -rw,soft,intr,rsize=8192,wsize=8192 penguin.example.net:/proj52
/etc/auto.misc中的第1個字段是/misc子目錄的名稱,該目錄被automount動態地建立,它不該該在客戶端機器上實際存在;第2個字段包括掛載選項,如rw表明讀寫訪問權,第3個字段是要導出的NFS的位置,包括主機名和目錄。
(3)autofs是一種服務,要啓動這項服務,在shell提示下鍵入如下命令:
$ sudo /sbin/service autofs restart
要查看活躍的掛載點,在shell提示下鍵入如下命令:
$ sudo /sbin/service autofs status
若是在autofs運行時修改了/etc/auto.master配置文件,則必須在shell提示下鍵入如下命令來通知automount守護進程從新載入配置文件:
$ sudo /sbin/service autofs reload
五、能夠運行df命令查看是否掛載成功:
$ sudo df
取消掛載的命令以下:
$ sudo umount /mnt/root_nfs
7、目標板NFS配置操做
主機IP:192.168.1.101
目標板IP:192.168.1.230
將USB轉串口鏈接上,在終端輸入minicom與板子連起,做爲「超級終端」使用。
啓動目標板並連通網絡後,首先查看目標板kernel自身是否支持NFS,在minicom中輸入cat /proc/filesystems命令查看其中是否有NFS一行,若沒有則表示內核不支持NFS,就須要從新編譯和燒寫內核;有則OK,接下來就能夠直接進行mount操做了。
具體命令是:
# mount -t nfs -o nolock 192.168.1.101:/opt/FriendlyARM/mini2440/root_nfs /mnt/root_nfs
無任何提示表示成功,這時能夠進入/mnt/root_nfs目錄,對文件進行cp、mv等操做。
可是若是使用命令mount -t nfs 192.168.1.101:/opt/FriendlyARM/mini2440/root_nfs /mnt/root_nfs,則會有以下的錯誤提示(也就是省去了"-o nolock"):
# mount -t nfs 192.168.1.101:/opt/FriendlyARM/mini2440/root_nfs /mnt/root_nfs
portmap: server localhost not responding, timed out
RPC: failed to contact portmap (errno -5).
portmap: server localhost not responding, timed out
RPC: failed to contact portmap (errno -5).
lockd_up: makesock failed, error=-5
portmap: server localhost not responding, timed out
RPC: failed to contact portmap (errno -5).
這時若是使用ls /mnt/root_nfs命令查看該目錄內容時,你會發現此時NFS確確實實已經掛載成功了。
而後取消掛載的時候會出現以下的錯誤提示:
# umount /mnt/root_nfs/
lockd_down: no lockd running.
而成功取消掛載時沒有任何提示,一樣此時NFS也確實已經取消掛載了。
那麼出現上面錯誤提示的可能緣由是:
nfs mount默認選項包括文件鎖,依賴於portmap提供的動態端口分配功能。
簡單的解決方法:kill文件鎖(lockd)或者使用mount -o nolock命令。
上面說的文件鎖具體是什麼緣由,目前尚未找到更好的解決辦法。不過,若是主機防火牆有設置時,也可能致使目標板沒法正常訪問。
http://www.cnblogs.com/yc_sunniwell/archive/2010/06/30/1768474.html