搭建NFS服務

1、NFS服務簡介centos

  NFS 是Network File System的縮寫,即網絡文件系統。一種使用於分散式文件系統的協定,由Sun公司開發,於1984年向外公佈。功能是經過網絡讓不一樣的機器、不一樣的操做系統可以彼此分享個別的數據,讓應用程序在客戶端經過網絡訪問位於服務器磁盤中的數據,是在類Unix系統間實現磁盤文件共享的一種方法。安全

  NFS 的基本原則是「允許不一樣的客戶端及服務端經過一組RPC分享相同的文件系統」,它是獨立於操做系統,允許不一樣硬件及操做系統的系統共同進行文件的分享。bash

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

2、安裝:網絡

 

NFS的安裝配置:app

centos 5 :async

yum -y install nfs-utils portmaptcp

centos 6(在CentOS 6.3當中,portmap服務由rpcbind負責) :ide

yum -y install nfs-utils rpcbind工具

 

3、服務器端配置:

 

一、建立共享目錄:

 

[root@centos2 /]# mkdir /usr/local/test

 

二、NFS文件配置:

 

[root@centos2 /]# vi /etc/exports

#增長一行:

/usr/local/test/ 192.168.1.226(rw,no_root_squash,no_all_squash,sync)

:x保存退出;

使配置生效:

[root@centos2 /]# exportfs -r

 

注:配置文件說明:

 

/usr/local/test/ 爲共享的目錄,使用絕對路徑。

 

192.168.1.226(rw,no_root_squash,no_all_squash,sync) 爲客戶端的地址及權限,地址能夠是一個網段,一個IP地址或者是一個域名,域名支持通配符,如:*.youxia.com,地址與權限中間沒有空格,權限說明:

 

rw:read-write,可讀寫;

 

ro:read-only,只讀;

 

sync:文件同時寫入硬盤和內存;

 

async:文件暫存於內存,而不是直接寫入內存;

 

no_root_squash:NFS客戶端鏈接服務端時若是使用的是root的話,那麼對服務端分享的目錄來講,也擁有root權限。顯然開啓這項是不安全的。

 

root_squash:NFS客戶端鏈接服務端時若是使用的是root的話,那麼對服務端分享的目錄來講,擁有匿名用戶權限,一般他將使用nobody或nfsnobody身份;

 

all_squash:不論NFS客戶端鏈接服務端時使用什麼用戶,對服務端分享的目錄來講都是擁有匿名用戶權限;

 

anonuid:匿名用戶的UID值,一般是nobody或nfsnobody,能夠在此處自行設定;

 

anongid:匿名用戶的GID值。

 

三、啓動:

 

centos6:

[root@centos2 /]# service rpcbind start

Starting rpcbind: [ OK ]

[root@centos2 /]# service nfs start

Starting NFS services: [ OK ]

Starting NFS quotas: [ OK ]

Starting NFS mountd: [ OK ]

Stopping RPC idmapd: [ OK ]

Starting RPC idmapd: [ OK ]

Starting NFS daemon: [ OK ]

[root@centos2 /]#

centos 5

[root@centos2 /]# service portmap start

[root@centos2 /]# service nfs start

[root@centos2 /]#

4、客戶端掛載:

 

一、建立須要掛載的目錄:

 

[root@localhost ~]# mkdir /usr/local/test

[root@localhost ~]#

 

二、測試掛載:

 

[root@localhost ~]# showmount -e 192.168.1.225

Export list for 192.168.1.225:

/usr/local/test 192.168.1.226

[root@localhost ~]#

若是顯示:rpc mount export: RPC: Unable to receive; errno = No route to host,則須要在服務端關閉防火牆(稍候會詳細說)。

 

三、掛載:

 

[root@localhost ~]# mount -t nfs 192.168.1.225:/usr/local/test /usr/local/test

[root@localhost ~]# mount

/dev/mapper/VolGroup-lv_root on / type ext4 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw)

/dev/sda1 on /boot type ext4 (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

nfsd on /proc/fs/nfsd type nfsd (rw)

192.168.1.225:/usr/local/test on /usr/local/test type nfs (rw,vers=4,addr=192.168.1.225,clientaddr=192.168.1.226)

[root@localhost ~]#

 

若是信息如上顯示則掛載成功!

 

四、測試:

 

客戶端生成一個文件:

[root@centos2 /]# cd /usr/local/test/

[root@centos2 test]# echo "hello nfs test">>test

[root@centos2 test]# ll

total 4

-rw-r--r-- 1 root root 15 Apr 9 13:24 test

[root@centos2 test]#

 

服務端檢查:

 

[root@centos2 /]# cd /usr/local/test/

[root@centos2 test]# ll

total 4

-rw-r--r-- 1 root root 15 Apr 9 13:24 test

[root@centos2 test]#

掛載成功!

 

5、解除掛載:

 

[root@localhost ~]# umount /usr/local/test

[root@localhost ~]# mount

/dev/mapper/VolGroup-lv_root on / type ext4 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw)

/dev/sda1 on /boot type ext4 (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

nfsd on /proc/fs/nfsd type nfsd (rw)

[root@localhost ~]#

若是遇到:umount.nfs: /usr/local/test: device is busy

可能用命令:

 

[root@localhost /]# fuser -m -v /usr/local/test

用戶 進程號 權限 命令

/usr/local/test/: root 2798 ..c.. bash

root 2996 ..c.. su

[root@localhost /]# kill -9 2798

[root@localhost /]# kill -9 2996

[root@localhost /]# umount /usr/local/test

[root@localhost /]#

 

6、服務器端防火牆設置(NFS 開啓防牆配置):

 

一、修改/etc/service,添加如下內容(端口號必須在1024如下,且未被佔用)

 

# Local services

mountd 1011/tcp #rpc.mountd

mountd 1011/udp #rpc.mountd

rquotad 1012/tcp #rpc.rquotad

rquotad 1012/udp #rpc.rquotad

 

二、重起Linux NFS服務

 

service nfs restart

 

三、此時rpc相關端口已經被固定,能夠爲Linux NFS添加防火牆規則

 

#portmap

/sbin/iptables -A INPUT -s 192.168.1.0/254 -p tcp --dport 111 -j ACCEPT

/sbin/iptables -A INPUT -s 192.168.1.0/254 -p udp --dport 111 -j ACCEPT

#nfsd

/sbin/iptables -A INPUT -s 192.168.1.0/254 -p tcp --dport 2049 -j ACCEPT

/sbin/iptables -A INPUT -s 192.168.1.0/254 -p udp --dport 2049 -j ACCEPT

#mountd

/sbin/iptables -A INPUT -s 192.168.1.0/254 -p tcp --dport 1011 -j ACCEPT

/sbin/iptables -A INPUT -s 192.168.1.0/254 -p udp --dport 1011 -j ACCEPT

#rquotad

/sbin/iptables -A INPUT -s 192.168.1.0/254 -p tcp --dport 1012 -j ACCEPT

/sbin/iptables -A INPUT -s 192.168.1.0/254 -p udp --dport 1012 -j ACCEPT

#rpc.statd

/sbin/iptables -A INPUT -s 192.168.1.0/254 -p tcp --dport 32768 -j ACCEPT

/sbin/iptables -A INPUT -s 192.168.1.0/254 -p udp --dport 32768 -j ACCEPT

 

TCP方法成功

 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 1011 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 1012 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 32768 -j ACCEPT

 

客戶端在掛載的時候遇到的一個問題以下,多是網絡不太穩定,NFS默認是用UDP協議,換成TCP協議便可:

mount -t nfs 192.168.1.225:/usr/local/test /usr/local/test -o proto=tcp -o nolock

 

9、相關命令

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

# showmount -e    //默認查看本身共享的服務,前提是要DNS能解析本身,否則容易報錯

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

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

# showmount -e NFS服務器IP

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

命令格式

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

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

# mount |grep nfs

掛載成功。

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

四、NFS的共享權限和訪問控制

如今咱們在/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將被壓縮到所指定的用戶與組;

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

# umount /tmp/david/

啓動自動掛載nfs文件系統

格式:

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

# vi /etc/fstab

保存退出,重啓系統。

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

自動掛載成功。

其餘相關命令:

一、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 從新共享全部目錄並輸出詳細信息

二、nfsstat

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

三、rpcinfo

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

四、showmount

  -a 顯示已經於客戶端鏈接上的目錄信息
  -e IP或者hostname 顯示此IP地址分享出來的目錄

五、netstat

能夠查看出nfs服務開啓的端口,其中nfs 開啓的是2049,portmap 開啓的是111,其他則是rpc開啓的。

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

NFS server 關機的時候一點要確保NFS服務關閉,沒有客戶端處於鏈接狀態!經過showmount -a 能夠查看,若是有的話用kill killall pkill 來結束,(-9 強制結束)

相關文章
相關標籤/搜索