linux CentOS 6.4 NFS網絡文件系統

一、NFS百科

   NFS,是Network File System的簡寫,即網絡文件系統。網絡文件系統是FreeBSD支持的文件系統中的一種,也被稱爲NFS. NFS允許一個系統在網絡上與他人共享目錄和文件。通過使用NFS,用戶和程序可以像訪問本地文件一樣訪問遠端系統上的文件。(百度百科)

   NFS由SUN公司開發,目前有三個版本,分別爲NFSv2,NFSv3,NFSv4。

   NFSv2是一個老版本,被衆多系統支持,因此兼容性很好。

   NFSv3做了一些改進,其中包括,更快的速度,支持更大的單個文件,更多便於排錯的信息及成果信息反饋,以及對於TCP協議的支持。

   NFSv4提供了有狀態的連接,更容易追蹤連接狀態,增強了安全性。

   CentOS6.x默認使用版本4提供NFS網絡文件系統共享服務。CentOS 6.x系統由rpcbind服務提供RPC協議的支持,目前NFSv4雖然已經不再需要與rpmbind直接交互,但rpm.mount依然是NFSv4所必須的服務。所以,如果在CenOS 6.x 實現NFS共享,需要啓動NFS與rpmbind服務。(所需軟件包括nfs-utils、rpcbind)

   NFS默認監聽在TCP 2049端口。

NFS工作原理圖

wKioL1M-dbei8X1kAAESv4B8Uzk113.jpg

圖示說明:portmap爲CentOS 5.x系列的服務進程,對應CentOS 6.x系列的rpcbind

二、配置文件說明/etc/export

1.每個共享的文件系統需要獨立一行條目

2.配置文件中支持通配符。

3.語法格式

共享路徑 客戶端主機1(權限) 客戶端主機2(權限)---可選

三、客戶端主機權限說明

                NFS選項                 功能描述
ro

只讀

rw讀寫
sync同步寫操作
async異步寫操作
wdelay延遲寫操作
root_squash屏蔽遠程root權限
no_root_squash不屏蔽遠程root權限
all_squash屏蔽所有的遠程用戶權限

權限說明:

1. sync在確保數據真正寫入存儲設備後才返回成功信息。而async是在沒有完全把數據寫入存儲之前就返回成功信息給客戶端,此時的數據實際還存放在內存中。

2. wdelay 決定了先將數據寫入內存,再寫入磁盤,然後將多個寫入請求合併後寫入磁盤。這樣可以減少對磁盤IO的次數,從而優化性能。但有可能造成非正常關閉NFS時丟失數據。

  而no_wdelay恰恰相反。但是該選項與async一起使用時將不會生效。因爲async是基於wdelay實現對客戶端的一種響應功能。

3. NFS默認會屏蔽root用戶的權限,root_squash會自動將root映射到本地匿名賬戶,通過anounuid可以指定匿名賬戶ID,默認ID爲65534,也就是nfsnobody賬戶。

  no_root_squash可以防止上述映射而保留root權限。all_squash可以屏蔽所有賬戶權限,將用戶對NFS的訪問映射爲服務器本地的匿名賬戶。默認情況下,普通賬戶的權限是保留的,也就是沒有進行squash屏蔽操作。

四、實施案例

wKioL1M-XFuhX1r0AAIfm9ou6O8057.jpg

需求:某linux校區需要建立自己的共享文件中心。目錄規劃如下:
    /data/shell 教師專用,用來存放教師資源:shell練習腳本,學生待發作業等.

    /data/soft 學生專用,用來存放學生實驗所需軟件,以及課後習題。

一、實驗環境:

系統版本:CentOS 6.4

NFS Server:192.168.0.96

NFS Client: 192.168.0.97(老師)        192.168.1.33(學生)

教師及學校DMZ區網段:192.168.0.0/24

學生網段:192.168.1.0/24

二、部署

                           NFS Server端部署

1.安裝nfs服務端程序

[root@NFS-Server ~]# yum -y install nfs-utils rpcbind
[root@NFS-Server ~]# rpm -qa|grep nfs-utils
nfs-utils-lib-1.1.5-6.el6.x86_64
nfs-utils-1.2.3-39.el6.x86_64
[root@NFS-Server ~]# rpm -qa|grep -E "nfs-utils|rpcbind"
rpcbind-0.2.0-11.el6.x86_64
nfs-utils-lib-1.1.5-6.el6.x86_64
nfs-utils-1.2.3-39.el6.x86_64
[root@NFS-Server ~]# mkdir -p /data/{shell,soft}

2. 編輯配置文件

[root@NFS-Server ~]# cat /etc/exports
#Teachers source and power
/data/shell 192.168.0.*(rw,no_root_squash,sync)
#Students source and power
/data/soft 192.168.1.*(ro,root_squash,async) 192.168.0.*(rw,no_root_squash,sync)

3. 啓動nfs服務

[root@NFS-Server ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]
[root@NFS-Server ~]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
#注意啓動順序,如果順序反了,會有如下提示
[root@NFS-Server ~]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS mountd:                                       [FAILED]
Starting NFS daemon: rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)
rpc.nfsd: unable to set any sockets for nfsd
                                                           [FAILED]

4. 創建測試資源

[root@NFS-Server ~]# cd /data/soft/
[root@NFS-Server soft]# touch httpd.tar.gz
[root@NFS-Server soft]# cd ../shell/
[root@NFS-Server shell]# touch useradd.sh

                           NFS Client-Teacher端訪問資源

1. 查詢服務端共享信息

[root@NFS-Teacher ~]# showmount -e 192.168.0.96
Export list for 192.168.0.96:
/data/soft  192.168.0.*,192.168.1.*
/data/shell 192.168.0.*

2. 創建本地掛載點,並掛載

[root@NFS-Teacher ~]# mkdir -p /data/{shell,soft}
[root@NFS-Teacher ~]# mount 192.168.0.96:/data/soft /data/soft
[root@NFS-Teacher ~]# mount 192.168.0.96:/data/shell /data/shell
[root@NFS-Teacher ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             9.7G  1.5G  7.7G  17% /
tmpfs                 116M     0  116M   0% /dev/shm
/dev/sda1             194M   26M  159M  14% /boot
192.168.0.96:/data/soft
                      9.7G  4.2G  5.0G  46% /data/soft
192.168.0.96:/data/shell
                      9.7G  4.2G  5.0G  46% /data/shell

3. 查看本地是否存在測試資源

[root@NFS-Teacher ~]# ls /data/*/*
/data/shell/useradd.sh  /data/soft/httpd.tar.gz

4. 測試權限匹配問題

[root@NFS-Teacher ~]# cd /data/soft/
[root@NFS-Teacher soft]# touch nginx.tar.gz
[root@NFS-Teacher soft]# touch ../shell/nginx_status.sh
[root@NFS-Teacher soft]# ls /data/*/*
/data/shell/nginx_status.sh  /data/shell/useradd.sh  /data/soft/httpd.tar.gz  /data/soft/nginx.tar.gz


5.實現開機自動掛載/etc/fstab(不建議你這樣做,因爲如果寫到fstab裏,而NFS服務器端或者因爲網絡問題連接異常,可能導致無法開機。)

[root@NFS-Teacher soft]# grep -Ev "^#|^$" /etc/fstab
UUID=d20dea81-455b-4d96-a986-9282054d2885 /                       ext4    defaults        1 1
UUID=34dcffb0-1454-458e-879c-3aeaf9d6c83a /boot                   ext4    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
192.168.0.96:/data/shell /data/shell            nfs     defaults        0 0
192.168.0.96:/data/soft  /data/soft             nfs     defaults        0 0

上述的掛載方法最好可以寫

[root@localhost ~]# mkdir /data/{shell,soft}
[root@localhost ~]# mount 192.168.0.96:/data/soft /data/soft
[root@localhost soft]# mount 192.168.0.96:/data/shell /data/shell
mount: 192.168.0.96:/data/shell failed, reason given by server: Permission denied

到rc.local裏,這樣更爲方便

[root@NFS-Teacher soft]# grep -Ev "^#|^$" /etc/rc.local
touch /var/lock/subsys/local
mount 192.168.0.96:/data/soft /data/soft
mount 192.168.0.96:/data/shell /data/shell

                               NFS Client-Student端訪問資源

1. 查詢服務端共享信息

[root@localhost ~]# showmount -e 192.168.0.96
Export list for 192.168.0.96:
/data/soft  192.168.0.*,192.168.1.*
/data/shell 192.168.0.*

2. 創建本地掛載點,並掛載

[root@localhost ~]# mkdir /data/{shell,soft}
[root@localhost ~]# mount 192.168.0.96:/data/soft /data/soft
[root@localhost soft]# mount 192.168.0.96:/data/shell /data/shell
mount: 192.168.0.96:/data/shell failed, reason given by server: Permission denied

# 報錯原因分析:NFS服務端exports文件中,shell僅僅共享到教師網段192.168.0.0/24,因此會提示Permission Deny信息。

# 另外需要注意的是:如果你的客戶端是centos5.x系列,那麼需要提前開啓portmap服務,否則會提示如下錯誤:

[root@localhost ~]# mount 192.168.0.96:/data/soft /data/soft
mount.nfs: Input/output error

3. 測試權限

[root@localhost soft]# touch update.sh
touch: cannot touch `update.sh': Read-only file system

# 報錯原因分析:exports中定義了ro只讀權限,因此客戶端只有不具備write權限。上述報錯爲正常現象


至此,NFS整個搭建流程結束。

有些時候我們可能遇到這樣的情況,就是某個掛載點目錄已經不需要了,需要卸載,但是出現如下情況:

[root@localhost ~]# umount /data/soft/
umount: /data/soft: device is busy
umount: /data/soft: device is busy

解決方法如下:

第一種:
[root@localhost ~]# umount /data/soft/
umount: /data/soft: device is busy
解決方法:
[root@localhost ~]# fuser  -m -v /data/soft/
                     USER        PID ACCESS COMMAND
/data/soft/:         root      13268 ..c.. bash
[root@localhost ~]# kill -9 13268
[root@localhost ~]# umount /data/soft/
第二種:
[root@localhost ~]# fuser -km /data/soft/
/data/soft/:         13448c
 [root@localhost ~]# umount /data/soft/
第三種:
[root@localhost ~]# umount -lf /data/soft/

最犀利的是第三種方法,灰常灰常經典,一條命令解決。在這裏特別感謝“老男孩老師”的傾囊相授!老師的博文地址:http://oldboy.blog.51cto.com

歡迎大家點擊學習老師的技術,更重要的是思想。


另外補充一些NFS的相關命令知識

1. NFS文件系統的掛載

# mount -t nfs -o 選項 $IP:$DIR $LOCALDIR

選項:

  • intr:當服務器宕機時,允許中斷NFS請求

  • nfsvers=version:指定使用哪個版本的NFS協議,version可以是2,3 ,4

  • noacl:關閉ACL,僅與老版本系統兼容時使用

  • nolock:關閉文件鎖機制,僅用來連接老版本NFS服務器

  • noexec:在掛載的文件系統中屏蔽可執行的二進制程序

  • port=num:指定NFS服務器端口號

  • rsize=num:設置最大數據塊大小,調整NFS讀取數據的速度.單位爲字節

  • wsize=num:設置最大數據塊大小,調整NFS寫入數據的速度.單位爲字節

  • tcp:使用tcp協議掛載

  • udp:使用udp協議掛載

2. NFS服務相關的幾個命令

1)、exportfs 命令

   -r   重新讀取/etc/exports

   -a   全部共享或者全部取消共享

   -u   取消共享,與-a一起使用可以取消全部共享文件系統

   -v   顯示詳細信息

2)、nfsstat  查看NFS共享狀態

   -s,--server  默認顯示服務器端與客戶端狀態,使用該參數後將僅顯示服務器端狀態

   -c,--client  僅顯示客戶端狀態

   -n,--nfs     僅顯示NFS狀態,默認顯示NFS與RPC狀態

   -n           n爲數字2,3,4,僅顯示NFS版本爲n的狀態細細ni

   -m           顯示掛載信息

   -l           以列表形式顯示信息    

3) rpcinfo -p localhost 查詢nfs與rpc間通信狀態 其餘選項可以不記

3. 每次rpcbind重啓之後,nfs服務必須重啓



本文參考了百度百科,《linux運維之道》,請尊重技術人員版權遠,每次聲明出自哪兒,這樣讓人家原作者心裏也舒服,畢竟他傳授過你知識,算的上是一位前輩,一位老師了。

如有不明白的地方,歡迎留言一起探討,本人也是很菜的一隻鳥兒。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章