NFS設置

ubuntu中設定NFS

NFS 是Network File System的縮寫,即網絡文件系統。一種使用於分散式文件系統的協定,由Sun公司開發,於1984年向外公佈。功能是通過網絡讓不同的機器、不同的操作系統能夠彼此分享個別的數據,讓應用程序在客戶端通過網絡訪問位於服務器磁盤中的數據,是在類Unix系統間實現磁盤文件共享的一種方法。NFS 的基本原則是“容許不同的客戶端及服務端通過一組RPC分享相同的文件系統”,它是獨立於操作系統,容許不同硬件及操作系統的系統共同進行文件的分享。

NFS在文件傳送或信息傳送過程中依賴於RPC協議。RPC,遠程過程調用(Remote Procedure Call) 是能使客戶端執行其他系統中程序的一種機制。NFS本身是沒有提供信息傳輸的協議和功能的,但NFS卻能讓我們通過網絡進行資料的分享,這是因爲NFS使用了一些其它的傳輸協議。而這些傳輸協議用到這個RPC功能的。可以說NFS本身就是使用RPC的一個程序。或者說NFS也是一個RPC SERVER。所以只要用到NFS的地方都要啓動RPC服務,不論是NFSSERVER或者NFS CLIENT。這樣SERVER和CLIENT才能通過RPC來實現PROGRAMPORT的對應。可以這麼理解RPC和NFS的關係:NFS是一個文件系統,而RPC是負責信息的傳輸。

目的:在linux中交叉編譯好的程序放在共享文件裏面,在minicom中執行它。

軟件環境:64位win10,VMware12.5.5下的64位ubuntu16.04,arm-hisiv200-linux-gcc,minicom

硬件環境:開發板,交叉網線,usb轉串口線

上網環境:主機與開發板相連,網絡配置比較麻煩,需要將虛擬機設置爲橋接方式,並且要求主機IP,虛擬機IP以及開發板IP位於同一個網段。要求在三者之間能夠ping通。物理網口被佔用了,而且無線網卡必須禁用,所以就是電腦不能上網了

問題1:搞了半天才發現開發板沒有插網線。。。。。。

問題2:不知道如何查看開發板的ip地址,比較簡單的辦法是根據開發板的ip地址配置主機和虛擬機的id地址。最後才知道開發板的ip地址要在minicom中用ifconfig命令查看。。。。。。

問題3:修改etc/exports的時候,最重要的,要添加的,最後一句話前面有一個#符號,導致添加的最後一句話被註釋掉了,我可能是瞎了,被這個問題耽誤了好幾個小時。。。。。。

先說如何設置三個東東的ip,

1,查看開發板的ip

sudo minicom,進入開發板,ifconfig查看ip

查看ip之後,設置vmware網絡

橋接的基本原理

    配置成橋接網絡連接模式的虛擬機就當作主機所在以太網的一部分,虛擬系統和宿主機器的關係,就像連接在同一個Hub上的兩臺電腦,可以像主機一樣可以訪問以太網中的所有共享資源和網絡連接,可以直接共享主機網絡的互聯網接入線路訪問互聯網。主機與虛擬機之間,以及各虛擬機之間都可以互訪。對應虛擬機就被當成主機所在以太網上的一個獨立物理機來看待,各虛擬機通過默認的VMnet0網卡與主機以太網連接,虛擬機間的虛擬網絡爲VMnet0。這時你的虛擬機就像局域網中的一個獨立的物理機一樣。虛擬機中的操作系統可以PING通別的主機,反過來別的主機也可以PING虛擬機。想讓它們相互通訊,你就需要爲虛擬系統配置IP地址和子網掩碼,否則就無法通信。

1、配置步驟

步驟1:

虛擬機左上角“編輯”-虛擬網絡編輯器-VMnet1-橋接模式-確定

虛擬機-設置-硬件-網絡適配器-自定義VMnet1,如圖

步驟2:

Ubuntu操作系統-右上角網絡的圖標,編輯連接,把原來的都刪掉了,又新增名爲eth0的連接,然後編輯,設置ip地址與開發板和主機在同一網段

3.主機ip設置

更改適配器設置-禁用wlan,啓用以太網-以太網屬性-internet協議版本ipv4

主機IP:192.168.20.10  網關:192.168.20.1 子網掩碼:255.255.255.0

虛擬機IP:192.168.20.9  網關:192.168.20.1 子網掩碼:255.255.255.0

開發板IP:192.168.20.163  網關:192.168.20.1 子網掩碼:255.255.255.0

至此,三者ip設置全部ok,可以ping通

1.安裝Ubuntu nfs

Ubuntu上默認是沒有安裝Ubuntunfs服務器的首先安裝Ubuntu nfs服務器端:sudo apt-get install nfs-kernel-server
在一些文檔中,提出還需要使用apt-get來手動安裝nfs的客戶端nfs-common,以及端口映射器portmap,但其實這是沒有必要的,因爲在安裝nfs-kernel-server時,apt會自動爲我們把它們安裝好。

2、配置/etc/exports

sudo vim  /etc/exports

在/etc/exports文件末尾添加如下一行:

/home/fyp/*(rw,sync,no_root_squash,no_subtree_check)*(rw,sync,no_root_squash)

Esc退出,:wq保存並退出。
Ubuntu nfs允許掛載的目錄及權限在文件/etc/exports中進行了定義。例如,我們要將根目錄下的nfsroot目錄共享出來,那麼我們需要在/etc/exports文件末尾添加如下一行:/nfsroot *(rw,sync,no_root_squash)。其中:/nfsroot是要共享的目錄,*代表允許所有的網絡段訪問,

rw是可讀寫權限,

sync是資料同步寫入內存和硬盤,

no_root_squash是Ubuntu nfs客戶端分享目錄使用者的權限,如果客戶端使用的是root用戶,那麼對於該共享目錄而言,該客戶端就具有root權限。

其它Ubuntu nfs常用的參數有:
ro 只讀訪問
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_squas root用戶具有根目錄的完全管理訪問權限

anonuid=xxx指定nfs服務器/etc/passwd文件中匿名用戶的UID

anongid=xxx指定nfs服務器/etc/passwd文件中匿名用戶的GID

3、Ubuntunfs重啓服務

sudo /etc/init.d/rpcbind restart
sudo /etc/init.d/nfs-kernel-server restart

查詢NFS服務器狀態

# service portmap status

# service nfs status 

啓動nfs失敗,問題:/etc/exports 內容寫錯,而不是它的權限問題

4、測試Ubuntunfs

此時可以運行以下命令來顯示一下共享出來的目錄:
$showmount -e
。查看後可以使用以下命令卸載:
$ sudo umount /home/fyp

5、minicom中啓動

6、修改開發板ip

ifconfig eth0 10.128.4.239 netmask 255.255.248.0

修改默認網關route add default dw 10.128.0.1

事先在minicom中的home目錄下新建好fyp文件夾

mount -t nfs -o nolock 10.128.3.238:/home/fyp /home/fyp

可以運行df命令查看是否掛載成功

補充:

NFS系統守護進程

•nfsd:它是基本的NFS守護進程,主要功能是管理客戶端是否能夠登錄服務器;

•mountd:它是RPC安裝守護進程,主要功能是管理NFS的文件系統。當客戶端順利通過nfsd登錄NFS服務器後,在使用NFS服務所提供的文件前,還必須通過文件使用權限的驗證。它會讀取NFS的配置文件/etc/exports來對比客戶端權限。

•portmap:主要功能是進行端口映射工作。當客戶端嘗試連接並使用RPC服務器提供的服務(如NFS服務)時,portmap會將所管理的與服務對應的端口提供給客戶端,從而使客戶可以通過該端口向服務器請求服務。

一、NFS服務器的配置

NFS服務器的配置相對比較簡單,只需要在相應的配置文件中進行設置,然後啓動NFS服務器即可。

NFS的常用目錄

/etc/exports                       NFS服務的主要配置文件

/usr/sbin/exportfs                  NFS服務的管理命令

/usr/sbin/showmount              客戶端的查看命令

/var/lib/nfs/etab       記錄NFS分享出來的目錄的完整權限設定值

/var/lib/nfs/xtab                      記錄曾經登錄過的客戶端信息 

NFS服務的配置文件爲 /etc/exports,這個文件是NFS的主要配置文件,不過系統並沒有默認值,所以這個文件不一定會存在,可能要使用vim手動建立,然後在文件裏面寫入配置內容。

/etc/exports文件內容格式:

<輸出目錄> [客戶端1 選項(訪問權限,用戶映射,其他)] [客戶端2 選項(訪問權限,用戶映射,其他)]

a. 輸出目錄:輸出目錄是指NFS系統中需要共享給客戶機使用的目錄;

b. 客戶端:客戶端是指網絡中可以訪問這個NFS輸出目錄的計算機

客戶端常用的指定方式

•指定ip地址的主機:192.168.0.200

•指定子網中的所有主機:192.168.0.0/24 192.168.0.0/255.255.255.0

•指定域名的主機:david.bsmart.cn

•指定域中的所有主機:*.bsmart.cn

•所有主機:*

c. 選項:選項用來設置輸出目錄的訪問權限、用戶映射等。

NFS主要有3類選項:

訪問權限選項

•設置輸出目錄只讀:ro

•設置輸出目錄讀寫:rw

用戶映射選項

•all_squash:將遠程訪問的所有普通用戶及所屬組都映射爲匿名用戶或用戶組(nfsnobody);

•no_all_squash:與all_squash取反(默認設置);

•root_squash:將root用戶及所屬組都映射爲匿名用戶或用戶組(默認設置);

•no_root_squash:與rootsquash取反;

•anonuid=xxx:將遠程訪問的所有用戶都映射爲匿名用戶,並指定該用戶爲本地用戶(UID=xxx);

•anongid=xxx:將遠程訪問的所有用戶組都映射爲匿名用戶組賬戶,並指定該匿名用戶組賬戶爲本地用戶組賬戶(GID=xxx);

其它選項

•secure:限制客戶端只能從小於1024的tcp/ip端口連接nfs服務器(默認設置);

•insecure:允許客戶端從大於1024的tcp/ip端口連接服務器;

•sync:將數據同步寫入內存緩衝區與磁盤中,效率低,但可以保證數據的一致性;

•async:將數據先保存在內存緩衝區中,必要時才寫入磁盤;

•wdelay:檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可以提高效率(默認設置);

•no_wdelay:若有寫操作則立即執行,應與sync配合使用;

•subtree:若輸出目錄是一個子目錄,則nfs服務器將檢查其父目錄的權限(默認設置);

•no_subtree:即使輸出目錄是一個子目錄,nfs服務器也不檢查其父目錄的權限,這樣可以提高效率;

二、NFS服務器的啓動與停止

在對exports文件進行了正確的配置後,就可以啓動NFS服務器了。

1、啓動NFS服務器

爲了使NFS服務器能正常工作,需要啓動portmap和nfs兩個服務,並且portmap一定要先於nfs啓動。

3、停止NFS服務器

要停止NFS運行時,需要先停止nfs服務再停止portmap服務,對於系統中有其他服務(如NIS)需要使用時,不需要停止portmap服務

# service nfs stop

# service portmap stop

4、設置NFS服務器的自動啓動狀態

對於實際的應用系統,每次啓動LINUX系統後都手工啓動nfs服務器是不現實的,需要設置系統在指定的運行級別自動啓動portmap和nfs服務。

# chkconfig --list portmap

# chkconfig --list nfs

設置portmap和nfs服務在系統運行級別3和5自動啓動。

# chkconfig --level 35 portmap on

# chkconfig --level 35 nfs on 

三、實例

1將NFSServer 的/home/david/ 共享給192.168.1.0/24網段,權限讀寫。

服務器端文件詳細如下:

# vi /etc/exports

/home/david 192.168.1.0/24(rw)

2重啓portmap和nfs 服務

# service portmap restart

# service nfs restart

# exportfs

3服務器端使用showmount命令查詢NFS的共享狀態

# showmount -e   //默認查看自己共享的服務,前提是要DNS能解析自己,不然容易報錯

# showmount -a//顯示已經與客戶端連接上的目錄信息

4客戶端使用showmount命令查詢NFS的共享狀態

# showmount -e NFS服務器IP

5客戶端掛載NFS服務器中的共享目錄

命令格式

# mount NFS服務器IP:共享目錄 本地掛載點目錄

# mount 192.168.1.108:/home/david/ /tmp/david/

# mount |grep nfs

掛載成功。

查看文件是否和服務器端一致。

6NFS的共享權限和訪問控制

現在我們在/tmp/david/ 裏面建立一個文件,看看權限是什麼

# touch 20130103

這裏出現Permission denied,是因爲NFS 服務器端共享的目錄本身的寫權限沒有開放給其他用戶,在服務器端打開該權限。

# chmod 777 -R /home/david/

再次在客戶端/tmp/david/ 裏面建立一個文件

我用root 用戶建立的文件,變成了nfsnobody 用戶。

NFS有很多默認的參數,打開/var/lib/nfs/etab 查看分享出來的/home/david/ 完整權限設定值。

# cat /var/lib/nfs/etab

默認就有sync,wdelay,hide 等等,no_root_squash 是讓root保持權限,root_squash 是把root映射成nobody,no_all_squash不讓所有用戶保持在掛載目錄中的權限。所以,root建立的文件所有者是nfsnobody。

下面我們使用普通用戶掛載、寫入文件測試。

# su - david

$ cd /tmp/david/

$ touch 2013david

普通用戶寫入文件時就是自己的名字,這也就保證了服務器的安全性。

關於權限的分析

1. 客戶端連接時候,對普通用戶的檢查

a. 如果明確設定了普通用戶被壓縮的身份,那麼此時客戶端用戶的身份轉換爲指定用戶;

b. 如果NFS server上面有同名用戶,那麼此時客戶端登錄賬戶的身份轉換爲NFS server上面的同名用戶;

c. 如果沒有明確指定,也沒有同名用戶,那麼此時 用戶身份被壓縮成nfsnobody;

2. 客戶端連接的時候,對root的檢查

a. 如果設置no_root_squash,那麼此時root用戶的身份被壓縮爲NFS server上面的root;

b. 如果設置了all_squash、anonuid、anongid,此時root身份被壓縮爲指定用戶;

c. 如果沒有明確指定,此時root用戶被壓縮爲nfsnobody;

d. 如果同時指定no_root_squash與all_squash 用戶將被壓縮爲 nfsnobody,如果設置了anonuid、anongid將被壓縮到所指定的用戶與組;

7、卸載已掛載的NFS共享目錄

# umount /tmp/david/

四、啓動自動掛載nfs文件系統

格式:

<server>:</remote/export> </local/directory> nfs <options> 0 0

# vi /etc/fstab

保存退出,重啓系統。

查看/home/david 有沒有自動掛載。

自動掛載成功。

五、相關命令

1、exportfs

如果我們在啓動了NFS之後又修改了/etc/exports,是不是還要重新啓動nfs呢?這個時候我們就可以用exportfs 命令來使改動立刻生效,該命令格式如下:

# exportfs [-aruv]

-a 全部掛載或卸載 /etc/exports中的內容

-r 重新讀取/etc/exports 中的信息 ,並同步更新/etc/exports、/var/lib/nfs/xtab

-u 卸載單一目錄(和-a一起使用爲卸載所有/etc/exports文件中的目錄)

-v 在export的時候,將詳細的信息輸出到屏幕上。

具體例子:

# exportfs -au 卸載所有共享目錄

# exportfs -rv 重新共享所有目錄並輸出詳細信息

2、nfsstat

查看NFS的運行狀態,對於調整NFS的運行有很大幫助。

3、rpcinfo

查看rpc執行信息,可以用於檢測rpc運行情況的工具,利用rpcinfo -p 可以查看出RPC開啓的端口所提供的程序有哪些。

4、showmount

-a 顯示已經於客戶端連接上的目錄信息

-e IP或者hostname 顯示此IP地址分享出來的目錄

5、netstat

可以查看出nfs服務開啓的端口,其中nfs 開啓的是2049,portmap 開啓的是111,其餘則是rpc開啓的。

最後注意兩點,雖然通過權限設置可以讓普通用戶訪問,但是掛載的時候默認情況下只有root可以去掛載,普通用戶可以執行sudo。

NFS server 關機的時候一點要確保NFS服務關閉,沒有客戶端處於連接狀態!通過showmount -a 可以查看,如果有的話用kill killall pkill 來結束,(-9 強制結束)

 

發佈了22 篇原創文章 · 獲贊 94 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章