NFS簡介:
NFS(Network File System)即網絡文件系統,最早是由Sun Microsystems在內部作爲實驗完成開發,是第一個構建於IP協議之上的網絡文件系統,主要功能是通過TCP/IP在不同主機系統之間共享資源(文件或目錄)。
NFS客戶端可以通過掛載的方式將NFS服務器共享的數據目錄掛載到本地,本地NFS的客戶端應用可以透明地讀寫位於遠端NFS服務器上的文件,就像訪問本地文件一樣。
NFS網絡文件系統有點類似Samba服務。samba主要用於在windows和unix之間共享資源,資源包括文件、打印機等等。而NFS一般用於Unix系統之間的資源共享,當然也可以共享到Windows。
爲什麼使用NFS:
硬件存儲本身就很貴的,而隨着公司業務的不斷髮展,網站併發繼續加大時,硬件存儲的擴展升級成本高,成幾何倍的增長,這對於中小型企業來說是一筆不菲的開銷。
所以一般中小型網站就會選擇NFS進行數據共享,如果大型網站很有可能會用到更復雜的分佈式文件系統,例如:MFS(Moosefs)、GlusterFS、FastDFS 等
NFS系統經歷了近30年的發展, 已經是一個非常穩定、可移植、可擴展、高性能 的企業級應用,所以在中小型企業中使用的比較廣泛。
NFS的原理:
在NFS服務器上設置好一個共享目錄/data/server後,具有訪問權限的NFS客戶端都可以將/data/server這個共享目錄掛載到本地的某個掛載點,這個掛載點可以自己隨意指定。
客戶端正確掛載完成後,就可以通過NFS客戶端掛載點所在的目錄查看NFS服務器共享出來的/data/server目錄下的所有數據。在客戶端查看時,這個共享目錄就相當於客戶端本地磁盤上的目錄,幾乎感覺不到有何區別。
根據NFS服務器端設置的權限以及/data/server共享目錄的本地系統權限,只要在指定的NFS客戶端掛載共享目錄, 就可以將數據輕鬆的存取到NFS服務器上的/data/server共享目錄中。
NFS是通過TCP/IP來進行服務端和客戶端之間的數據傳輸,兩者之間要傳輸數據就要有相對應的端口來進行傳輸。
但是這裏有一個問題,就是NFS的端口是不固定的,因爲NFS有很多的功能,而不同的功能都會使用不同的端口,NFS服務在啓動時會隨機選擇端口,所以NFS服務器無法固定端口。
既然NFS服務器的端口不固定,NFS客戶端又怎麼知道服務器端使用的是那個端口呢 ?
所以就需要通過RPC服務來幫忙(Remote Procedure Call,遠程過程調用)簡稱RPC
當NFS啓動後,就會隨機的使用一些端口,然後NFS就會向RPC去註冊這些端口,RPC就會記錄下這些端口,並且RPC會開起111端口,如果客戶端有請求,那服務端的RPC就會將記錄的NFS端口信息告知客戶端。
也就是說RPC的主要功能就是記錄NFS功能所對應的端口號,並且在NFS客戶端請求時將對應的端口信息返給NFS客戶端,從而確保客戶端可以連接到正確的NFS端口,才能實現數據傳輸/數據交互的目的。
在啓動NFS之前,首先要啓動RPC服務,否則NFS就無法向RPC註冊了。另外,如果RPC服務重新其從,原來註冊好的NFS端口就會丟失,因此NFS服務也需要重啓以重新向RPC註冊端口信息。
要特別注意的是,修改了NFS的配置文件之後是不需要重啓的,執行命令 /etc/init.d/nfs reload 或者 exportfs -rv 即可使NFS服務的配置文件/etc/exportfs生效。
無論是NFS客戶端還是NFS服務器端,都需要先啓動RPC服務。
NFS客戶端無需啓動NFS,但是需要啓動RPC服務。
客戶端NFS和服務端NFS通訊過程
1)首先服務器端啓動RPC服務並開啓111端口
2)啓動NFS服務並向RPC註冊端口信息
3)客戶端向服務端的RPC請求服務端的NFS端口
4)服務端的RPC服務反饋NFS端口信息給客戶端。
5)客戶端通過獲取到的NFS端口來建立和服務端的NFS連接並進行數據的傳輸。
NFS服務器端部署
我這裏服務器端系統是 CentOS7,客戶端是CentOS6。
關閉防火牆
[root@localhost ~]# systemctl stop firewalld.service #關閉防火牆
[root@localhost ~]# systemctl disable firewalld.service #禁止防火牆開機啓動
關閉SELinux
[root@localhost ~]# setenforce 0 #臨時關閉
#修改配置文件 vim /etc/selinux/config
SELINUX=disabled
服務端需要的軟件包 nfs-utils rpcbind
nfs-utils 是NFS服務的主程序包
rpcbind 是RPC服務的程序包
centos6和centos7默認沒有安裝nfs(centos5已經默認安裝了), 所以需要我們手動安裝。可以使用 yum -y install nfs-utils rpcbind 命令安裝。
採用yum方式安裝, 只需要安裝 nfs-utils,yum會自動安裝rpcbind。
1.查看系統系信息
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
2.檢查系統是否安裝了nfs
[root@localhost ~]# rpm -qa nfs-utils rpcbind
3.安裝nfs
[root@localhost ~]# yum -y install nfs-utils rpcbind
[root@localhost ~]# rpm -qa nfs-utils rpcbind #如果出現nfs和rpc開頭的兩個軟件包,表示nfs已經安裝好了
rpcbind-0.2.0-47.el7.x86_64
nfs-utils-1.3.0-0.61.el7.x86_64
4.啓動rpc服務
在啓動nfs服務前, 要先啓動rpc
[root@localhost ~]# systemctl start rpcbind #啓動rpc
[root@localhost ~]# systemctl enable rpcbind #將加入開機啓動那個
查看是否啓動成功
[root@localhost ~]# systemctl status rpcbind #查看rpc運行狀態
[root@localhost ~]# systemctl list-unit-files | grep rpcbind # 查看rpc是否加入開機啓動
[root@localhost ~]# rpcinfo -p localhost #查看nfs服務向rpc註冊的端口信息,因爲nfs還沒啓動,所以沒有太多的端口。
[root@localhost ~]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
5.啓動nfs服務
[root@localhost ~]# systemctl start nfs #啓動nfs
[root@localhost ~]# systemctl enable nfs #將nfs加入開機啓動
查看是否啓動成功
[root@localhost ~]# systemctl status nfs #查看服務運行狀態
[root@localhost ~]# systemctl list-unit-files | grep nfs.service #查看是否將nfs服務加入開機運行
[root@localhost ~]# rpcinfo -p localhost #查看nfs服務向rpc註冊的端口信息,和剛纔沒啓動nfs的時相比較,現在監聽了更多的端口。
[root@localhost ~]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 37652 status
100024 1 tcp 45595 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 58685 nlockmgr
100021 3 udp 58685 nlockmgr
100021 4 udp 58685 nlockmgr
100021 1 tcp 41537 nlockmgr
100021 3 tcp 41537 nlockmgr
100021 4 tcp 41537 nlockmgr
所以NFS服務器啓動時最少需要兩個不同的進程,一個是管理nfs客戶端是否能夠登入的rpc.nfsd主進程,另一個用於管理nfs客戶端是否能夠取得對應權限的rpc.mountd進程。
如果還需要管理磁盤配額,則nfs還需要加載rpc.rquotad進程。
[root@localhost ~]# ps -ef | grep rpc
rpc 11095 1 0 02:26 ? 00:00:00 /sbin/rpcbind -w
rpcuser 11160 1 0 02:59 ? 00:00:00 /usr/sbin/rpc.statd
root 11170 2 0 02:59 ? 00:00:00 [rpciod]
root 11174 1 0 02:59 ? 00:00:00 /usr/sbin/rpc.idmapd
root 11180 1 0 02:59 ? 00:00:00 /usr/sbin/rpc.mountd
root 11812 10857 0 03:28 pts/2 00:00:00 grep --color=auto rpc
[root@localhost ~]# ps -ef | grep nfs
root 11185 2 0 02:59 ? 00:00:00 [nfsd4_callbacks]
root 11191 2 0 02:59 ? 00:00:00 [nfsd]
root 11192 2 0 02:59 ? 00:00:00 [nfsd]
root 11193 2 0 02:59 ? 00:00:00 [nfsd]
root 11194 2 0 02:59 ? 00:00:00 [nfsd]
root 11195 2 0 02:59 ? 00:00:00 [nfsd]
root 11196 2 0 02:59 ? 00:00:00 [nfsd]
root 11197 2 0 02:59 ? 00:00:00 [nfsd]
root 11198 2 0 02:59 ? 00:00:00 [nfsd]
root 11814 10857 0 03:30 pts/2 00:00:00 grep --color=auto nfs
NFS 服務的配置文件
NFS服務的默認配置文件路徑 /etc/exportfs 並且默認是空的,需要用戶自行配置。
/etc/exportfs 文件配置的格式:
NFS共享目錄 NFS客戶端地址1 (參數1,參數2,只讀還是可寫) NFS客戶端地址2 (參數1,參數2,......)
參數說明:
NFS共享目錄:是服務器端的本地目錄,是我們想要共享給網絡上其他主機使用的目錄。假如我要共享的是/data/server目錄,那麼此選項可以就直接寫/data/server
NFS客戶端地址:客戶端地址能夠設置一個網段,也可以設置爲單個主機,
參數:如讀寫權限(rw,同步更新sync,壓縮來訪賬戶all_squash,壓縮後的匿名賬號anonuid=uid,anongid=gid等等..)
生產環境常見配置實例:
配置實例1: /data/server 192.168.1.11(rw,sync)
###括號前不能有空格 rw表示可讀寫,sync表示同步更新到磁盤,同步將內存內的文件寫入到磁盤空間,保證數據不丟失,但會影響性能。
配置實例2:/data/server 192.168.1.11/24(rw,sync,all_squash,anonuid=65534,anongid=65534)
###生產環境中常用的一種配置,適合多客戶端共享一個NFS目錄。all_squash 也就是說不管客戶端是以什麼樣的身份來進行訪問的,都會被壓縮成爲all_squash後面所接的用戶和羣組身份。這邊用anonuid、anongid編號來表示。
配置實例3:/data/server 192.168.1.11/24(ro)
###表示只能讀權限
NFS權限設置
NFS配置權限設置,即/etc/exports文件配置格式中小括號()裏的參數集。
rw 表示可讀寫
ro Read-only表示只能讀權限
sync 寫入數據時數據同步寫入到NFS server的硬盤中後纔會返回,數據安全不會丟失。
async 寫入數據時先寫到內存緩衝區,直到硬盤有空檔時纔會再寫到磁盤,這樣可以提升寫入效率,但是如果服務器宕機,緩衝區的數據沒來得及寫入到磁盤,這些數據將會丟失。
no_root_squas 訪問nfs server共享目錄的用戶如果是root的話,它對該目錄具有root權限。這個配置原本爲無盤用戶準備的。(正常情況應避免使用!)
root_squash 對於訪問NFS server共享目錄的用戶,如果是root的話會被壓縮成爲nobody用戶身份。
all_squash 不管訪問nfs server共享目錄的用戶身份如何包括root,它的權限都將被壓縮成爲匿名用戶,同時他們的udi和gid都會變成nobody或nfsnobody賬戶的uid,gid。在多個nfs客戶端同時讀寫nfs server數據時,這個參數很有用***可以確保大家寫入的數據的權限是一樣的。
但不同系統有可能匿名用戶的uid,gid不同。因爲此處我們需要服務端和客戶端之間的用戶是一樣的。比如說:服務端指定匿名用戶的UID爲65534,那麼客戶端也一定要存在65534這個賬號纔可以
anonuid anonuid就是匿名的uid和gid。說明客戶端以什麼權限來訪問服務端,在默認情況下是nfsnobody。uid65534.
anongid 同anongid,就是把uid換成gid而已。
客戶端來訪問的用戶
客戶端訪問服務端默認是使用nfsnobody這個用戶來進行訪問的。uid和gid爲65534。服務器默認共享時,也是加上了all_squash這個參數。
並制定anonuid爲65534(也就是nfsnobayd用戶)。當然如果系統中nfsnobody是其他的uid,那麼就有可能造成訪問權限出現問題。
所以最好我們可以通過一設置一個用戶來訪問,統一UID、GID。
查看客戶端掛載情況
有兩個重要的文件/var/lib/nfs/etab、/var/lib/nfs/rmtab這兩個文件就能夠查看服務器上共享了什麼目錄,到底有多少客戶端掛載了共享,能查看到客戶端掛載的具體信息。
1、/var/lib/nfs/etab這個文件能看到服務器上共享了哪些目錄,執行哪些人可以使用,並且設定的參數爲何。
2、/var/lib/nfs/rmtab這個文件就是能夠查看到共享目錄被掛載的情況。
NFS配置實例
實例:共享/data/server目錄給192.168.1.11
[root@localhost ~]# mkdir -p /data/server #創建共享目錄
[root@localhost ~]# ll -d /data/server/
drwxr-xr-x 2 root root 6 Mar 13 15:12 /data/server/ #注意現在共享的目錄的權限爲只有root纔有寫權限。
[root@localhost ~]# chown nfsnobody.nfsnobody /data/server/ #更改目錄所屬主和所屬組。
[root@localhost ~]# ll -d /data/server/
drwxr-xr-x 2 nfsnobody nfsnobody 6 Mar 13 15:12 /data/server/ #現在nfsnobody用戶有讀寫權限了。
添加NFS配置文件
[root@localhost ~]# cat /etc/exports
# Shared /data/server directory to 192.168.1.11
/data/server 192.168.1.11(rw,sync)
[root@localhost ~]# systemctl reload nfs #重新加載nfs
[root@localhost ~]# showmount -e localhost #服務器本地確認是否共享正常
Export list for localhost:
/data/server 192.168.1.11
並且客戶端往服務端去寫文件的用戶身份是nfsnobody、nfsnobody UID=65534。那麼也就是說客戶端需要通過兩層的權限來控制的。NFS配置文件—>共享目錄文件的權限。
查看NFS服務的版本
服務器端
[root@localhost server]# nfsstat -s | grep Server
Server rpc stats:
Server nfs v4:
Server nfs v4 operations:
現在就是讓客戶端來進行掛載就可以了。
--------------------------------------------------------
NFS客戶端
我這裏客戶端是CentOS6
NFS客戶端只需要啓動rpc服務即可。
關閉防火牆
[root@localhost ~]# /etc/init.d/iptables stop #關閉防火牆
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
[root@localhost ~]# chkconfig iptables off #禁止防火牆開機啓動
關閉SELinu
[root@localhost ~]# setenforce 0 #臨時關閉
#修改配置文件 vim /etc/selinux/config
SELINUX=disabled
1.查看系統系信息
[root@localhost ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
2.檢查系統是否安裝了rpc
[root@localhost ~]# rpm -qa nfs-utils rpcbind
3.安裝rpc
[root@localhost ~]# yum -y install nfs-utils rpcbind
[root@localhost ~]# rpm -qa nfs-utils rpcbind #如果出現nfs和rpc開頭的兩個軟件包,表示nfs已經安裝好了
nfs-utils-1.2.3-78.el6_10.1.x86_64
rpcbind-0.2.0-16.el6.x86_64
4.啓動rpc服務
在啓動nfs服務前, 要先啓動rpc
[root@localhost ~]# /etc/init.d/rpcbind start #啓動rpc
Starting rpcbind: [ OK ]
[root@localhost ~]# chkconfig rpcbind on #將rpc加入開機啓動那個
[root@localhost ~]# chkconfig --list | grep rpcbind #查看rpc是否加入開機啓動
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
查看是否啓動成功
[root@localhost ~]# /etc/init.d/rpcbind status
rpcbind (pid 2310) is running...
[root@localhost ~]# netstat -anput | grep rpc
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2310/rpcbind
tcp 0 0 :::111 :::* LISTEN 2310/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 2310/rpcbind
udp 0 0 0.0.0.0:789 0.0.0.0:* 2310/rpcbind
udp 0 0 :::111 :::* 2310/rpcbind
udp 0 0 :::789 :::* 2310/rpcbind
[root@localhost ~]# rpcinfo -p localhost #查看nfs服務想rpc註冊的端口信息,客戶端只啓動rpc服務即可。
[root@localhost ~]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
NFS客戶端掛載
查看服務器端的共享信息
[root@localhost ~]# showmount -e 192.168.1.21
Export list for 192.168.1.21:
/data/server 192.168.1.11
掛載服務器共享出來的目錄
[root@localhost ~]# mkdir /data/client # 要先創建掛載點
[root@localhost ~]# mount -t nfs 192.168.1.21:/data/server /data/client #把共享目錄掛載到本地
#mount 命令格式如下:
mount -t 類型 device localedir(本地目錄)
以上這個命令device=192.168.1.21:/data/server 類型爲nfs
查看磁盤情況
[root@localhost ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
ext4 19G 831M 17G 5% /
tmpfs tmpfs 523M 0 523M 0% /dev/shm
/dev/sda1 ext4 500M 29M 445M 7% /boot
192.168.1.21:/data/server
nfs 19G 1.2G 18G 7% /data/client
查看掛載情況
[root@localhost client]# mount -l
/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)
192.168.1.21:/data/server on /data/client type nfs (rw,vers=4,addr=192.168.1.21,clientaddr=192.168.1.11)
查看更詳細的掛載信息 cat /proc/mounts
[root@localhost client]# cat /proc/mounts
rootfs / rootfs rw 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
devtmpfs /dev devtmpfs rw,relatime,size=499224k,nr_inodes=124806,mode=755 0 0
devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /dev/shm tmpfs rw,relatime 0 0
/dev/mapper/VolGroup-lv_root / ext4 rw,relatime,barrier=1,data=ordered 0 0
/proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0
/dev/sda1 /boot ext4 rw,relatime,barrier=1,data=ordered 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0
192.168.1.21:/data/server /data/client nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.11,minorversion=0,local_lock=none,addr=192.168.1.21 0 0
測試
1.在nfs服務器端, 進入/data/server共享目錄, 創建test-nfs.txt文件
[root@localhost server]# pwd
/data/server
[root@localhost server]# touch test-nfs.txt
2.在nfs客戶端,進入/data/client掛載目錄,創建test-nfs222.txt文件
[root@localhost client]# pwd
/data/client
[root@localhost client]# touch test-nfs222.txt
[root@localhost client]# ls
test-nfs222.txt test-nfs.txt
[root@localhost client]# ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 14 2019 test-nfs222.txt
-rw-r--r-- 1 root root 0 Mar 14 2019 test-nfs.txt
test-nfs.txt 是在服務器端以root創建的,所以權限是root。
test-nfs222.txt 是在客戶端以root創建的,但是文件的權限被壓縮成nfsnobody用戶了。
[root@localhost server]# cat /etc/exports
# Shared /data/server directory to 192.168.1.11
/data/server 192.168.1.11(rw,sync)
[root@localhost server]# showmount -e localhost
Export list for localhost:
/data/server 192.168.1.11
[root@localhost server]# cat /var/lib/nfs/etab
/data/server 192.168.1.11(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
從/var/lib/nfs/etab 這個文件中我們可以看到, 在共享的時候即使我們只指定了rw和rsync這兩參數, nfs也會默認有很多參數。其中就有all_squash,這個參數在客戶端的作用就是不管你用什麼用戶創建的文件,都會被強制壓縮成nfsnobody。
客戶端NFS掛載參數
我們客戶端掛載NFS也可以設置很多參數的,-o 後面的參數。
客戶端掛載可以設置:不可執行、讀寫權限、斷開後RPC呼叫方式、讀寫區塊大小等。
一般來說當nfs服務器提供的只是普通數據(圖片html,css,jss,視頻等)應該不需要執行suid,exec等權限,
由於是共享目錄不存在設備所以也不存在掛載設備dev,因此在客戶端掛載的時候,可以加上給你這幾個命令掛載。
mount –t nfs -o nosuid,noexec,nodev,rw 192.168.1.21:/data/server /data/client
可使用掛載參數:
suid 允許設置suid
nosuid 不允許在共享文件系統中設置suid ,默認是suid
rw 讀寫權限
ro 只讀
dev 保留設備文件的特殊功能
nodev 不保留(一般來說只有/dev纔會有特殊的設備文件,因此可以選在nodev),默認是dev
exec 允許執行任何二進制文件
noexec 不允許在共享文件系統中直接執行任何二進制文件,默認是exec
user 允許用戶擁有文件的掛載與卸載的功能
nouser 不允許用戶擁有文件的掛載與卸載功能(如果要保護文件系統,最好不要爲用戶提供掛載與卸載的功能),默認是nouser
auto 這個auto指的是"mount -a"時會不會自動掛載的項目,
noauto 不自動掛載,默認是auto
針對一些高併發的情況,還有一些可以進行優化的參數:
fg
bg
當執行掛載時,該掛載行爲是在前臺(fg)還是在後臺(bg)執行。若在前臺執行,則mount會持續嘗試鏈接,直到成功或time out爲止。
若爲在後臺執行,則mount會在後臺持續多次進行mount,而不會影響到前臺的程序操作。
如果網絡聯機不穩定,或是服務器常常需要開關機。建議使用bg比較妥當。默認爲fg
soft
hard
使用掛載時會使用RPC呼叫。如果是hard的情況,那麼當兩者之間有任何一臺主機離線,那RPC會持續呼叫,直到對方恢復聯機爲止。
而soft,只是在RPC time out後重復呼叫。而非持續呼叫。因此係統的延遲會不這麼明顯,如果服務器經常開開關關的話,建議使用soft。
在生產環境中推薦使用hard,intr這樣的方式來掛載。默認爲hard
intr
當使用hard方式掛載時,若加上intr參數,則RPC的持續呼叫是可以被中斷的
rsize
wsize
讀出(rsize)和寫入(wsize)的區塊大小。這個設置值可以影響客戶端與服務器端傳輸數據的緩衝存儲容量。
一般來說,如果在局域網內(LAN),並且客戶端與服務器都具有足夠的內存,這個值可以設置大一點,比如說32768,提升緩衝區塊將可提升NFS文件系統的傳輸能力。
但設置的值也不要太大,最好是實現網絡能夠傳輸的最大值爲限。默認rsize=1024,wsize=1024
proto=udp
使用UDP協議來傳輸數據,在內網中會有較好的性能,但是在Internet的話,使用proto=tpc傳輸的數據會有較好的糾錯能力。默認是proto=tcp
NFS客戶端如何掛載才最佳
命令格式如下:mount –t nfs –o nosuid,noexec,nodev,rw,hard,intr,rsize=32768,wsize=32768 192.168.1.21:/data/server /data/client
1) noexec,nosuid,nodev,因爲共享存放的是簡單資料,不需要suid位不需要執行,沒有設備文件。
2) hard,intr,bg 當NFS鏈接斷了之後會一直去監測服務端的NFS服務直到恢復之後重新連接。
3) rsize=32768 wsize=32768 調優NFS傳輸的區塊大小。
4) 基本參數:rw 讀寫權限。
如何設置開機自動掛載
1.通過把 mount –t nfs 192.168.1.21:/data/server /data/client 這條命令寫到/etc/rc.local中,讓它開機就執行。
2.在/etc/fstab(系統開機啓動分區加載項)添加我們的NFS配置:
192.168.1.21:/data/serve /data/client nfs defaults 1 1
但在生產環境中,對於共享的NFS目錄,一般不會配置到/etc/fstab裏。
因爲在客戶端主機重啓時如果由於網絡等原因連接不上nfs server時,就會導致客戶機無法啓動的厄運發生。
有兩種方式實現開機自動掛載,但這裏建議採用第一種,如果因爲網絡原因沒有連接到NFSserver那麼第二中有可能會導致系統無法啓動的故障。
如果卸載時提示:"umount.nfs: /data/client: device is busy",需要退出掛載目錄再進行卸載,如果NFS 服務器宕機了,則需要強制卸載,可執行命令:umount -lf /data/client
強制卸載:umount –lf /data/client
NFS客戶端掛載優化:
1.有關係統安全掛載參數選項
在企業工作場景,一般來說,NFS服務器共享的只是普通靜態數據(圖片、附件、視煩),不需要執行suid、exec等權限,
掛載的這個文件系統只能作爲數據存取之用,無法執行程序,對於客戶端來講增加了安全性,例如:很多***篡改站點文件都是由上傳入口上傳的程序到存儲目錄,然後執行的。
因此在掛載的時候,用下面的命令很有必要
mount -t nfs -o nosuid, noexec ,node, rw 10.0.0.7:/data /mnt
通過 mount -o 指定掛載參數與在 /etc/fstab裏指定掛載參數的效果是一樣的。網絡文件系統和本地的文件系統效果也是一樣的。
2.mount掛載性能優化參數選項
下面介紹幾個在企業生產環境下,NFS性能優化掛載的例子
1)禁止更新目錄及文件時間戳掛載,命令如下:
mount -t nfs -o noatime,nodiratime 10.0.0.7:/data /mnt
2)安全加優化的掛載方式如下
mount -t nfs -o nosud,noexec,node,noatime,noduratime,intr,rsize=131072,wsize=131072 10.0.0.7:/data /mnt
3)默認的掛載方式如下
mount -t nfs 10.0.0.7:/data /mnt
WSIZE和RSIZE的大小最好是1024的倍數,對於NFSv2來說,8192是RSIZE和 WSIZE的最大數值,如果使用的是NFSv3,則可以嘗試設置32768,如果是NFSv4可以到65536或更大。
如果在客戶端掛載時使用了這兩個參數,可以讓客戶端在讀取和寫入數據時,一次性讀寫更多的數據包,這可以提升訪問性能和效率。
除此之外,還有 noatime,mxtiratimc 性能優化選項,
這兩個選項是說在讀寫磁盤的時候不更新文件和目錄的時間戮(即不更新文件系統中文件對應 inode 信息),這樣就可以減少和磁盤系統的交互,提升讀取和寫入磁盤的效率,
因爲磁盤是機械的,每次讀寫都會消耗磁盤I/O,而更新文件時間戳對於工作數據必要性不大,最大問題是增加了訪問磁I/O的次數,拖慢系統性能。
以下是NFS網絡文件系統優化掛載的參數建議:
在CentOS6 x86_64服努器端和客戶端環境下,可使用如下命令參數:
mount-t nf -o noatimc,nodiratime,nosuid,noexec,nodev,rsize=131072,wsize=131072 10.0.0.7:/data /mnt
經過實際測試,CentOS6 x86_64默認的掛載參數性能還是不錯的。 mount -t nfs 10.0.0.7:/data /mnt
注意:非性能的參數越多,速度可能會越慢。根據具體的業務需要以及實際測試效果選擇掛載參數。
3.NFS內核優化建議
/proc/sys/net/core/rmem_default:該文件指定了接收套接宇緩衝區大小的默認值(以宇節爲單位),默認設置:124928,
/proc/sys/net/core/rmem_max:該文件指定了接收套接字緩衝區大小的最大值(以宇節爲單位),默認設置:124928,
/proc/sys/net/core/wmem_default:該文件指定了發送套接字綬衝區大小的默認值(以字節單位),默認設置:124928
/proc/sys/net/core/wmem_max:該文件指定了發送套接字簧沖區大小的最大值(以字節單位),默認設置:124928
4.企業生產場景NFS共享存儲優化小結
硬件:sas/ssd磁盤,買多塊, raid0/raid10。網卡吞吐量要大,至少幹兆(多塊bond)。
NFS服務端配置:/data 10.0.0.7(rw,sync,all_squash,anguid=65534,anongid=65534)
NFS客戶端掛載優化配置命令:
mount -t nfs -o nosuid,noexec,nodev,noatmme,nodiratime,rsize=131072,wsize=131072 10.0.0.7:/data /mnt兼顧安全性能
大型網站NFS網絡文件系統的替代軟件爲 分佈式文件系統Moosefs(mfs)、GlusterFS、FastDFS。
NFS優缺點
NFS優點:
1、簡單容易掌握
2、方便快速部署簡單維護容易
3、從軟件層面上看,數據可靠性高,穩定性強。
NFS侷限:
1、侷限性是存在單點故障,如果NFSserver宕機了所有客戶端都不能訪問共享目錄,#####我們可以通過rsync來進行數據的同步。或者是通過負載均衡的高可用方案。######
2、在高併發的場合,NFS效率性能有限(一般幾千萬以下pv的網站不是瓶頸,除非網站架構太差。)
3、服務器共享文件的客戶端認證是基於IP和主機名的安全性一般(但用於內網則問題不大)
4、NFS數據是明文的,對數據完整性不做驗證(一般是存放於內網,提供內網的服務器使用。所以安全性相對不是一個問題)
5、多機器掛載服務器時,連接管理維護麻煩。尤其NFS服務端出問題後,所有客戶端都掛掉狀態(可使用autofs自動掛載解決。)
生產應用場景
中小型網站(2000萬pv以下)線上應用,都有用武之地。門戶網站也會有其他方面的應用,
因爲門戶網站的併發量是超級的大。所以有更加會用專業的存儲來做這件事情。
-------------------------------完結-----------------------------------