嵌入式環境搭建之NFS
Author:tiger-john
Time:2013-08-04
mail:jibo.tiger@gmail.com
Blog:http://blog.csdn.net/tigerjb/article/details/9748561
轉載請註明出處!
[摘要]:本文介紹NFS相關概念,NFS設定檔以及介紹如何設定NFS服務端和用戶端,並檢驗是否設定成功;並對出現的異常進行分析,同時給出一個嵌入式配置執行個體。
一. 網路檔案系統簡介
1.1.What is NFS ?
NFS就是Network FileSystem的縮寫,是由Sun公司發展出來的。其目的是讓linux 機器之間彼此分享文檔。NFS可以讓伺服器端共用的目錄掛載到本地客戶機上,對於本地客戶機器來說,遠程伺服器上的目錄就好像自己的一部分。
1.2 whatis NFS, In embedded development engineer ‘s eyes?
它的功能是把NFS伺服器(即Linux主機)的某個目錄掛載到開發板的檔案系統上。這樣,開發板就可以執行該目錄中的可執行程式。這樣做的優點在於:不用將程式寫入開發板的Flash,減少了對Flash的損害,同時也方便調試。
在嵌入式系統開發中主要用於NFS網路根檔案系統啟動或者網路載入調試應用程式。
1.3 NFS工作原理
NFS是基於客戶/伺服器模式的。NFS伺服器是輸出一組檔案的電腦,而NFS用戶端是訪問檔案的電腦。客戶和伺服器端通過遠端程序呼叫通訊,當客戶主機上的應用程式訪問遠程檔案時,客戶主機核心向遠程NFS伺服器發送一個請求,等待伺服器響應,而NFS伺服器一直處於等待狀態,如果接收到客戶請求,就處理請求並將結果返回給客戶機。NFS伺服器上的目錄如果可以被遠端使用者訪問,就稱為”匯出(export)”;客戶主機訪問伺服器匯出目錄的過程稱為“安裝(mount)”,或者稱為“掛載”,“匯入”等。
特點:
(1)Linux主機之間的共用
(2)開發板和開發主機之間的共用
(3)伺服器可以是虛擬機器,也可是是獨立的Linux伺服器
(4)在伺服器上建立多個賬戶,多人共用,節省資源
(5)可以有獨立的個人目錄,安全可靠。
二.NFS server端的設定
NFS伺服器的配置包括四個主要的步驟:
(1)安裝NFS軟體包
(2)在/etc/exprots檔案中配置NFS伺服器上要匯出的檔案系統或目錄。
(3)啟動NFS服務。
(4)匯出/etc/exports中配置的檔案系統或目錄。
2.1 安裝NFS
(1)在ubuntu下安裝NFS可以通過如下命令:
#sudo apt-get install nfs-kernel-server
(2)NFS的啟動和停止是通過/etc/init.d目錄中的指令檔nfs實現的。
(3)在命令列重啟NFS的命令為/etc/init.d/nfs restart
note:
在啟動NFS伺服器之前,先要啟動rpcbind
#/etc/init.d/rpcbind restart
2.2 配置NFS伺服器
(1)配置NFS主要涉及設定檔/etc/exports,它用於NFS伺服器端,其中列出了NFS伺服器中要匯出的目錄、可以訪問這些目錄的NFS客戶機及其存取權限。
(2) /etc/exports檔案的格式如下:
dir_to_export NFS_client (permissions) [NFS_client (permissions)…]
執行個體:
#vim /etc/exports
/tmp 192.168.100.0/24(ro) localhost(rw) *(ro,sync)[分享目錄] [第一個用戶端(許可權)] [可用主機名稱] [可用萬用字元]
該執行個體表示將將/tmp 分別分享給三個不同的主機或網域。
格式中的輸出目錄和用戶端之間,用戶端與用戶端之間都使用空格分隔,但是用戶端和許可權參數之間不能有空格。當若許可權參數不止一個時,則以逗號(,) 分開。
輸出目錄:dir_to_export是要匯出的檔案系統或目錄名稱,也就是要共用給用戶端使用的目錄。該目錄必須是一個絕對路徑。
用戶端:NFS_client是可以訪問該NFS伺服器的客戶機名稱。客戶機的指定非常靈活,可以是單個主機的IP地址或網域名稱,也可以是某個子網或域中主機等。
選項:該設定主要是許可權(permissions),這是NFS客戶機訪問匯出目錄的存取權限,它的可選值為ro(唯讀)或rw(讀寫)。
note:
關於以上參數的詳細解釋,附件一:exportfs中各元素的詳細說明。
2.3exportfs維護NFS服務的輸出目錄列表
(1)當修改了/etc/exprots檔案的內容後,不需要重新啟動NFS服務,而直接使用命令exportfs就可以使設定其立即生效。
(2)exportfs命令就是用來維護NFS服務的輸出目錄列表的,命令格式如下:
exportfs [options]
-a :全部掛載(或卸載)/etc/exports檔案中的所設定的所有目錄
-r:重新掛載/etc/exports檔案中的設定,並使設定立即生效,而不需要重新啟動NFS服務。
-u:卸載某一目錄
-v:在export的時候,將分享的目錄顯示到螢幕上。
(3)當修改了/etc/exports檔案中的內容後,在命令執行如下命令使其配置立即生效:
# exportfs -rv。
(4)全部卸載共用目錄時,可以使用如下命令:
#exportfs -au
三.NFS用戶端的設定
NFS伺服器通過/etc/expors共用,並用exportfs發布。目錄共用之後,可以用命令shownmount來顯示共用目錄。
NFS用戶端配置需要以下幾個步驟:
(1)編譯核心時,選擇NFS選項。
(2)使用showmount掃描NFS伺服器分享的目錄有哪些,並瞭解我們是否可以使用。
(3)在用戶端建立預計要掛載的掛載點目錄。
(4)利用mount將遠程主機直接掛載到相關目錄。
(5)查看掛載情況
3.1 NFS用戶端的安裝(在核心中支援NFS的配置)
要在目標板上運行nfs,必須編譯核心,使得其支援NFS
File systems netwok file systems<*>nfs file system support<*>provide nfsv3 client support<*>nfs server support
3.2 showmount查看NFS伺服器資訊
在用戶端,要查看NFS伺服器上有哪些共用目錄,可以使用showmount命令。
(1)showmount的命令格式如下:
showmount [-ade] [hostname]
-a:列出所有遠程載入
-d:列出被遠程載入的目錄
-e:列出所有共用的檔案系統
(2)例如:如果NFS伺服器的IP地址為192.168.1.101,可以使用如下命令查看:
#showmount -e192.168.1.101
3.3串連NFS伺服器(mount)
在利用showmount命令得知遠程NFS伺服器上的共用資源後,接下來就是進行實際的掛載操作。
(1)掛載NFS伺服器上的輸出目錄的命令格式如下:
mount -t nfs NFS_server_name :exported-directory mount_point
-t nfs:指定檔案系統類型。
NFS_server_name:是NFS伺服器名稱;
exported_directory:是要共用的目錄;
mount_point:是在原生安裝位置。
(2)執行個體:
例如NFS用戶端把遠程檔案系統tiger上匯出的/share1目錄安裝在自己的檔案系統/mnt/nfs目錄下,以實現共用。
#mount tiger:/share1 /mnt/nfs
(3)將共用目錄掛接進來後,只要鍵入/mnt/nfs就等於進入了遠程主機tiger上的/share1目錄中了。
3.4 檢查是否載入成功
(1)df可以顯示目前系統的盤符,包括掛載的NFS目錄。
(2)另外也可以直接查看掛載之後的目錄,即可以知道掛載是否成功。
3.5 NFS 檔案系統的卸載
使用umount命令
umount /home/think/test
卸載前需要退出當前掛載的目錄,否則提示:
the device is busy!
3.6 NFS開機自動掛載
開機就掛載的掛載點與相關參數是寫入 /etc/fstab 中的,那 NFS 能不能寫入 /etc/fstab 當中呢?不可以!!!分析一下開機的流程,我們可以發現網路的啟動是在本機掛載之後,因此當你利用 /etc/fstab 嘗試掛載 NFS 時,系統由於尚未啟動網路,所以肯定是無法掛載成功的啦!不過,我們可以將其就寫入到 /etc/rc.d/rc.local 即可!
#vim /etc/rc.d/rc.local
開機就掛載的掛載點與相關參數是寫入 /etc/fstab 中的,那 NFS 能不能寫入 /etc/fstab 當中呢?不可以!!!分析一下開機的流程,我們可以發現網路的啟動是在本機掛載之後,因此當你利用 /etc/fstab 嘗試掛載 NFS 時,系統由於尚未啟動網路,所以肯定是無法掛載成功的啦!不過,我們可以將其就寫入到 /etc/rc.d/rc.local 即可!
#vim /etc/rc.d/rc.local
mout -t nfs 192.168.1.100:/home/think//EmbeddedWork /mnt -o nolock
四. Execption
4.1 開發板和主機的網路不通
串連後若網路端了,則出現
nfs:server 192.168.0.12 not responding ,still trying
4.2連線逾時
portmap: server localhost not responding, timed out
解決辦法:
#mount -t nfs -o nolock node1:/public /public
即增加-o nolock參數,原因:
Unfsd doesn't support NLMlocking, and it's causing the lockd daemon to be started (which again requiresthe portmapper to be installed。
4.3 訪問受限
access denied by server while mounting
可能的原因就是防火牆的問題或者是在設定檔中設定的那個IP段範圍設定錯了或者設定小了,如果修改之後還沒有好的話,那就直接使用一個“*”代替之前的 那個整個IP號,雖然不是很安全,但是一定能解決辦法。
4.5 伺服器或用戶端某些服務未啟動
(1)mount: xxxxx failed: System Error:Connection refused
解決方案:
如果使用ping卻發現網路與伺服器都是好的,那麼就是rpcbind沒有開啟。啟動方法:
# /etc/init.d/rpcbind restart.
(2)mout: xxxxx failed:RPCError:Program not registered.
重新啟動了rpcbind服務後,沒有重啟啟動NFS服務。
解決方案:
# /etc/init.d/rpcbind restart.
#/etc/init.d/nfs restart.
五.執行個體
5.1.嵌入式系統的典型設定
(1)嵌入式系統伺服器端設定
由於嵌入式系統都是自己的電腦跟開發板相連來開發,對訪問IP及許可權等都沒有太大的安全考慮,所以設定較為簡單,一般使用如下的配置:
/home/think/EmbeddedWork *(rw,sync,no_root_squash)
表示任意用戶端都可以掛載伺服器/home/think/EmbeddedWork目錄。這樣就不會因為IP設定問題使得開發板不能訪問主機,具備可讀寫的許可權,對於開發板上登陸的root使用者,其擁有和主機root一樣的許可權。
(2)用戶端(開發板)使用如下mount命令進行掛載
#mount -t nfs 192.168.1.100:/home/think//EmbeddedWork /mnt -o nolock
附件一:exportfs中各元素的詳細說明
1.用戶端常用的指定方式 :
用戶端 說明192.168.16.20 指定IP地址的主機192.168.16.0/24(或192.168.16.*) 指定子網中的所有主機pc1.gdvcp.net 指定網域名稱的主機*.gdvcp.net 指定域中的所有主機*(或預設) 所有主機
2.選項用來設定輸出目錄的存取權限,使用者映射等,在/etc/exports檔案中選項,比較多一般可以分成3類
(1)存取權限選項:
用於控制輸出目錄存取權限的選項
存取權限選項 說明ro 設定輸出目錄唯讀rw 設定輸出目錄可讀寫
(2)使用者映射選項:
使用者映射選項 說明all_squash 不論登入 NFS 的使用者身份為何,他的身份都會被壓縮成為匿名使用者,通常也就是nobodyno_all_squash 不將遠端存取的所有普通使用者及所屬使用者組都映射為匿名使用者或使用者組(預設設定)root_squash 將root使用者及所屬使用者組都映射為匿名使用者或使用者組(預設設定)no_root_squash 不將root使用者及所屬使用者組都映射為匿名使用者或使用者組anonuid=xxx 將遠端存取的所有使用者都映射為匿名使用者,並指定該匿名使用者賬戶為本機使用者賬戶(UID=xxx)anongid=xxx 將遠端存取的所有使用者組都映射為匿名使用者組賬戶,並指定該匿名使用者組賬戶為本機使用者組賬戶(GID=xxx)
(3)常用的其他選項
其他選項比較多,可用於對輸出目錄進行更全面的控制
其他選項 說明secure 限制用戶端只能從小於1024的TCP/IP連接埠串連NFS伺服器(預設設定)insecure 允許用戶端從大於1024的TCP/IP連接埠串連NFS伺服器sync 將資料同步寫入記憶體緩衝區與磁碟中,雖然這樣做效率較低,但可以保證資料的一致性async 將資料先儲存在記憶體緩衝區中,必要時才寫入磁碟。wdelay 檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可提高效率(預設設定)no_wdelay 若有寫操作則立即執行,應與sync配合使用subtree_check 若輸出目錄是一個子目錄,則NFS伺服器將檢查其父目錄的許可權(預設設定)no_subtree_check 即使輸出目錄是一個子目錄,NFS伺服器也不檢查其父目錄的許可權,這樣做可提高效率