一:概念:
NFS(Network File System)即網絡文件系統,它允許網絡中的計算機之間通過TCP/IP網絡共享資源。在NFS的應用中,本地NFS的客戶端應用可以透明地讀寫位於遠端NFS服務器上的文件,就像訪問本地文件一樣。
最早由sun公司開發,是類unix系統間實現磁盤共享的一種方法。
缺點:
1:nfs屬於本地文件系統,在高並發場景和大存儲量下,需要使用分布式存儲mfs, FastDFS, tfs(taobao)等。
2:客戶端的數據都是通過明文傳送。客戶端沒有用戶認證機制,安全性能一般,所以建議一般在局域網內使用。
3:容易發生單點故障,即server服務器宕機所有的客戶端都不能訪問。
使用場景:web集群中NFS服務器主要用於存儲用戶上傳的信息,方便集群中機器獲取用戶數據。如圖片 附件 頭像 視頻 音頻。
二:工作原理
NFS服務依賴於RPC(Remote Procedure Call)服務。nfsd默認端口2049,實際使用過程中因為需要提供不同的服務,因此NFS啟動時還會隨機調用系統的空閑端口。在centos5.x中默認調用1024以下端口,centos6.x后默認調用的端口號一般較大,30000以上。因為NFS隨機端口的原因所以需要RPC服務來和client端確認傳輸端口等。
因為NFS服務啟動時需要向RPC注冊端口信息,所以RPC要在NFS服務啟動之前啟動。
在NFS server上創建用於共享的目錄/data,client用mount將/data掛載到自己本地一個目錄上,掛載目錄可以和/data名稱不同。將掛載信息寫入本機開機啟動文件里 如 /etc/rc.local
客戶端無需啟動NFS服務,但需要啟動RPC服務。
三:實現
主機 | 角色 | ip |
cnetos6.5 | NFS server | 192.168.1.240 |
centos6.5 | NFS client | 192.168.86.131 |
1:安裝軟件
NFS server需要至少安裝兩個軟件nfs-utils 和rpcbind。客戶端只要安裝rpcbind。
rpm -qa nfs-utils rpcbind
安裝完nfs服務一般會自動生成配置文件exports,如果沒有就自己創建一個 /etc/exports
yum install -y nfs-utils rpcbind cat /etc/exports
創建共享目錄,將文件所有者指定為nfsnobody。nfsnobody用戶在安裝nfs時會自動創建。
如果不指定共享用戶,則nfs系統在分配權限時會以用戶uid為主,客戶端如果用root賬戶會在服務器被自動降級至nfsnobody。
mkdir -p /data/nfs chown -R nfsnobody:nfsnobody /data/nfs
2:server配置文件
格式:共享目錄 指定共享對象(共享參數)
例: /data 192.168.1.0/24(rw,sync)
將 /data 共享給192.168.1.x ,客戶端權限rw
其中共享對象可以用通配符,比如 * 代表所有地址。
配置參數:
rw: 讀寫
ro :只讀
sync:將數據同步寫入內存緩沖區與磁盤中,效率低,但可以保證數據的一致性;
async:是大數據時使用,是先寫到緩存區,必要時再寫到磁盤里。
all_squash:所有訪問用戶都映射為匿名用戶或用戶組;
no_all_squash(默認):訪問用戶先與本機用戶匹配,匹配失敗后再映射為匿名用戶或用戶組;
配置server參數
#nfs dir /data/nfs /data/nfs 192.168.1.0/24(rw) /data/nfs 192.168.86.131(rw)
也可以寫成一行
/data/nfs 192.168.1.0/24(rw) 192.168.86.131(rw,sync)
啟動服務:注意先啟動rpcbind再啟動nfs
[root@localhost data]# service rpcbind start Starting rpcbind: [ OK ] [root@localhost data]# service nfs start Starting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS mountd: [ OK ] Starting NFS daemon: [ OK ] Starting RPC idmapd: [ OK ]
查詢nfs掛載,showmount -e 192.168.1.240 后面可以接ip來查看。
[root@localhost data]# showmount -e Export list for localhost: /data/nfs 192.168.1.0/24,192.168.86.131
NFS服務開啟后,查看共享目錄參數
[root@localhost data]# cat /var/lib/nfs/etab /data/nfs 192.168.86.131(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash) /data/nfs 192.168.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)
讓nfs服務開機啟動
[root@localhost ~]# chkconfig rpcbind on [root@localhost ~]# chkconfig nfs on [root@localhost ~]# chkconfig --list rpcbind rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@localhost ~]# chkconfig --list nfs nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
3:客戶端配置
安裝rpcbind和nfs,啟動rpcbind,nfs可以不啟動。
客戶端掛載nfs共享目錄
mount -t nfs 192.168.1.240:/data/nfs /nfs #掛載nfs server的/data/nfs 到/nfs
[root@centos68 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 9.5G 2.0G 7.1G 22% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 33M 147M 19% /boot
/dev/sdb1 4.8G 11M 4.6G 1% /data
192.168.1.240:/data/nfs
2.9G 2.7G 126M 96% /nfs # nfs掛載信息
注:一般不將nfs掛載信息寫入fstab,因為nfs依賴於rpc服務,rpc服務啟動晚於fstab時會出錯。可以將掛載信息寫入 /etc/rc.local
vim /etc/rc.local #mount nfs_data mount -t nfs 192.168.1.240:/data/www/image/ /data/www/image/ mount -t nfs 192.168.1.240:/data/www/user/ /data/www/user/
關於默認賬戶
nfs客戶端寫數據除了nfs配置文件要有rw權限,對於目錄也要有對應操作權限。
如果/data/nfs目錄沒有給寫入權限,即使exports里設置了rw也是沒有權限寫入的。客戶端默認操作賬戶為nfsnobody。
[root@localhost ~]# cat /var/lib/nfs/etab /data/nfs 192.168.86.131(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash) /data/nfs 192.168.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)
查看/var/lib/nfs/etab其中 anonuid=65534,anongid=65534 為默認賬戶uid,即nfsnobody的默認uid。
查看已掛載設備掛載參數 cat /proc/mounts
[root@localhost ~]# cat /proc/mounts |grep 192 192.168.1.240:/data/nfs /mnt nfs4 rw,noexec,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.240,minorversion=0,local_lock=none,addr=192.168.1.240 0 0
客戶端掛載優化參數
noatime 不更新文件的inode訪問時間戳,文件很多時此參數可以提高效率。
nodiratime 不更新目錄的訪問時間戳,同上。
nosuid 關閉掛載目錄的suid
noexec 不允許執行二進制文件。shell腳本無法直接使用,但是用sh xxx.sh依然可以調用。
rsize 系統每次讀取的最大字節,centos6.5默認131072,此參數過小會影響系統的I/O效率.
wsize 系統每次寫入的最大字節,同上
defaults 使用默認的選項。默認選項為rw、suid、dev、exec、anto nouser與async。
例: mount -o nosuid noexec noatime -t nfs 192.168.1.240:/data/nfs /mnt
卸載掛載點,如果提示 /mnt: device is busy ,可以用lf參數強制卸載
umount -lf /mnt
windows客戶端配置(不常用)
打開windows控制面板,在程序和功能里面啟用 NFS客戶端。
cmd里直接輸入 mount 192.168.1.240:/data/nfs z:
這樣windows下就可以瀏覽nfs共享目錄的內容了,如果需要修改權限,那么還需要修改共享目錄權限。