嵌入式環境搭建之NFS
[摘要]:本文介紹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文件的格式如下:
[cpp]
dir_to_export NFS_client (permissions) [NFS_client (permissions)…]
實例:
#vim /etc/exports
[cpp]
/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
[cpp]
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服務器上的輸出目錄的命令格式如下:
[cpp]
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
[cpp]
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及權限等都沒有太大的安全考慮,所以設置較為簡單,一般使用如下的配置:
[cpp]
/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.客戶端常用的指定方式 :
[cpp]
客戶端 說明
192.168.16.20 指定IP地址的主機
192.168.16.0/24(或192.168.16.*) 指定子網中的所有主機
pc1.gdvcp.net 指定域名的主機
*.gdvcp.net 指定域中的所有主機
*(或缺省) 所有主機
2.選項用來設置輸出目錄的訪問權限,用戶映射等,在/etc/exports文件中選項,比較多一般可以分成3類
(1)訪問權限選項:
用於控制輸出目錄訪問權限的選項
[cpp]
訪問權限選項 說明
ro 設置輸出目錄只讀
rw 設置輸出目錄可讀寫
(2)用戶映射選項:
[cpp]
用戶映射選項 說明
all_squash 不論登入 NFS 的使用者身份為何,他的身份都會被壓縮成為匿名使用者,通常也就是nobody
no_all_squash 不將遠程訪問的所有普通用戶及所屬用戶組都映射為匿名用戶或用戶組(默認設置)
root_squash 將root用戶及所屬用戶組都映射為匿名用戶或用戶組(默認設置)
no_root_squash 不將root用戶及所屬用戶組都映射為匿名用戶或用戶組
anonuid=xxx 將遠程訪問的所有用戶都映射為匿名用戶,並指定該匿名用戶賬戶為本地用戶賬戶(UID=xxx)
anongid=xxx 將遠程訪問的所有用戶組都映射為匿名用戶組賬戶,並指定該匿名用戶組賬戶為本地用戶組賬戶(GID=xxx)
(3)常用的其他選項
其他選項比較多,可用於對輸出目錄進行更全面的控制
[cpp]
其他選項 說明
secure 限制客戶端只能從小於1024的TCP/IP端口連接NFS服務器(默認設置)
insecure 允許客戶端從大於1024的TCP/IP端口連接NFS服務器
sync 將數據同步寫入內存緩沖區與磁盤中,雖然這樣做效率較低,但可以保證數據的一致性
async 將數據先保存在內存緩沖區中,必要時才寫入磁盤。
wdelay 檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可提高效率(默認設置)
no_wdelay 若有寫操作則立即執行,應與sync配合使用
subtree_check 若輸出目錄是一個子目錄,則NFS服務器將檢查其父目錄的權限(默認設置)
no_subtree_check 即使輸出目錄是一個子目錄,NFS服務器也不檢查其父目錄的權限,這樣做可提高效率