一、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工作原理圖
圖示說明: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屏蔽操作。
四、實施案例
需求:某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運維之道》,請尊重技術人員版權遠,每次聲明出自哪兒,這樣讓人家原作者心裏也舒服,畢竟他傳授過你知識,算的上是一位前輩,一位老師了。
如有不明白的地方,歡迎留言一起探討,本人也是很菜的一隻鳥兒。