1. 程式人生 > >ubuntu下mini2440 NFS掛載

ubuntu下mini2440 NFS掛載

網路檔案系統(NFS)

一、NFS簡介

1、NFS就是Network File System的縮寫,它的最大功能就是可以通過網路讓不同的機器,不同的作業系統彼此共享檔案(share files)——可以通過NFS掛載遠端主機的目錄,訪問該目錄就像訪問本地目錄一樣,所以也可以簡單的將它看作一個檔案伺服器(File Server)。

注意:一般而言,使用NFS服務能夠方便地使各unix-like系統之間實現共享,但如果需要在unix-like和windows系統之間共享,那就得使用samba了。

2、NFS是通過網路進行資料傳輸,那麼NFS使用哪些埠呢,答案是……不知道,因為NFS傳輸資料時使用的埠是隨機的,唯一的限制就是小於1024,客戶端怎麼知道伺服器使用的是哪個埠,此時就要用到遠端過程呼叫RPC。

其實,NFS執行在SUN的RPC(Remote Procedure Call,遠端過程呼叫)基礎上,RPC定義了一種與系統無關的方法來實現程序間通訊,由此,NFS Server也可以看作是RPC Server。正 因為NFS是一個RPC服務程式,所以在使用它之前,先要對映好埠——通過portmap設定。比如:某個NFS Client發起NFS服務請求時,它需要先得到一個埠(port),所以它先通過portmap得到port number(不僅是NFS,所有的RPC服務程式啟動之前,都需要先設定好portmap)。

注意:在啟動RPC服務(比如NFS)之前,需要先啟動portmap服務。

3、NFS允許系統將其目錄和檔案共享給網路上的其他系統。通過NFS,使用者和應用程式可以訪問遠端系統上的檔案,就像它們是本地檔案一樣。那麼NFS最值得注意的優點有:
(1)本地工作站可以使用更少的磁碟空間,因為常用資料可以被儲存在一臺機器上,並讓網路上的其他機器可以訪問它。
(2)不需要為使用者在每臺網絡機器上放一個使用者目錄,因為使用者目錄可以在NFS伺服器上設定並使其在整個網路上可用。
(3)儲存裝置如軟盤、光碟機及USB裝置可以被網路上其它機器使用,這可能可以減少網路上移動裝置的數量。

二、與NFS相關的幾個檔案和命令

1、/etc/exports
對NFS服務的訪問是由exports來批准,它枚舉了若干有權訪問NFS伺服器上檔案系統的主機名。

2、/sbin/exportfs
維護NFS的資源共享,可以通過它重新設定/etc/exports的共享目錄,解除安裝NFS Server共享的目錄或者重新共享等。

3、/usr/sbin/showmount 
上面的檔案主要用在NFS Server端,而showmount則主要用在Client端,showmount可以用來檢視NFS共享的目錄資源。

4、/var/lib/nfs/xtab
NFS的記錄文件:通過它可以檢視有哪些Client連線到NFS主機的記錄。

下面這幾個並不直接負責NFS,實際上它們是負責所有的RPC。

5、/etc/default/portmap
實際上,portmap負責對映所有的RPC服務埠,它的內容非常非常之簡單。

6、/etc/hosts.deny
設定拒絕portmap服務的主機,即禁止訪問的客戶端IP列表。

7、/etc/hosts.allow
設定允許portmap服務的主機,即允許訪問的客戶端IP列表。

三、NFS安裝

在主機上安裝NFS服務軟體,因為Debian/Ubuntu上預設是沒有安裝的。

1、安裝埠對映器portmap(可選)
$ sudo apt-get install portmap

2、在終端提示符後鍵入以下命令安裝NFS伺服器
$ sudo apt-get install nfs-kernel-server

3、安裝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步)。

四、NFS配置

1、配置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)”。

2、配置/etc/hosts.deny
禁止任何host(主機)能和你的NFS伺服器進行NFS連線。在該檔案中加入:

### NFS DAEMONS
portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL

3、配置/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

4、配置/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

五、啟動和停止NFS服務

1、啟動NFS的方法和啟動其他伺服器的方法類似,首先需要啟動portmap和NFS這兩個服務,並且portmap服務一定要先於NFS服務啟動。
$ sudo /etc/init.d/portmap start
$ sudo /etc/init.d/nfs-kernel-server start

2、停止NFS服務
在停止NFS服務的時候,需要先停止NFS服務再停止portmap服務,如果系統中還有其他服務需要使用portmap服務,則可以不停止portmap服務。
$ sudo /etc/init.d/nfs-kernel-server stop
$ sudo /etc/init.d/portmap stop

3、重新啟動portmap和NFS服務
$ sudo /etc/init.d/portmap restart
$ sudo /etc/init.d/nfs-kernel-server restart

4、檢查portmap和NFS服務狀態
$ sudo /etc/init.d/portmap status(不知原文是否有誤,我的ubuntu上portmap貌似沒status這個命令引數)
$ sudo /etc/init.d/nfs-kernel-server status

5、設定自動啟動NFS服務

(1)檢查NFS的執行級別:
$ sudo chkconfig --list portmap      (我的電腦也沒chconfig這個工具,不過沒多大關係,如果有問題再回頭)
$ sudo chkconfig --list nfs-kernel-server

(2)在實際使用中,如果每次開啟計算機之後都手工啟動NFS服務是非常麻煩的,此時可以設定系統在指定的執行級別自動啟動portmap和NFS服務。
$ sudo chkconfig --level 235 portmap on  (由於沒有chkconfig工具,所以我就用services-admin(也就是圖形介面的“系統─>“服務”)來代替,至於level就不管了,用預設設定)
$ sudo chkconfig --level 235 nfs-kernel-server on

六、NFS客戶端配置(NFS測試)

1、在NFS伺服器啟動後,還需要檢查Linux伺服器的防火牆設定(一般需要關閉防火牆服務),確保沒有遮蔽 NFS使用的埠和允許通訊的主機,主要是檢查Linux伺服器iptables、ipchains等選項的設定,以及/etc/hosts.deny, /etc/hosts.allow檔案。通常都是在內部區域網中進行開發,再安裝系統時最好不要安裝防火牆等網路安全軟體,以方便使用時的配置。

如果你有防火牆,請確保32771、111和2049埠保持開放。

2、手動掛載
使用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目錄中沒有檔案或子目錄。

3、自動掛載

(1)另一個掛載其他機器的NFS共享的方式就是在/etc/fstab檔案中新增一行,該行必須指明NFS伺服器的主機名、伺服器輸出的目錄名以及掛載NFS共享的本機目錄,同時必須是根使用者才能修改/etc/fstab檔案(目標板上可能沒有fstab,需要自己建立一個)。

格式(參考PC上的fstab):host_ip:/nfs_path /target_path nfs rsize=8192,wsize=8192,timeo=14,intr,nolock  0   0

注意:可以根據實際情況修改NFS伺服器共享資料夾"servername.mydomain.com:/usr/local/pub"和在本機的掛載點"/pub",同時掛載點/pub在客戶端機器上必須存在。

(2)NFS常見掛載引數:

intr 允許通知中斷一個NFS呼叫。當伺服器沒有應答需要放棄的時候有用處。

timeo 如果超時,客戶端等待的時間,以十分之一秒計算
retrans 超時嘗試的次數
bg 後臺掛載(很有用)
hard 如果server端沒有響應,那麼客戶端一直嘗試掛載
rsize 讀塊大小
wsize 寫塊大小

4、使用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

5、可以執行df命令檢視是否掛載成功:
$ sudo df

取消掛載的命令如下:
$ sudo umount /mnt/root_nfs

七、目標板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命令。

上面說的檔案鎖具體是什麼原因,目前還沒有找到更好的解決辦法。不過,如果主機防火牆有設定時,也可能導致目標板無法正常訪問。