NFS(Network FileSystem)--由Sun公司開發的,用於通過網絡分享文件給其他系統使用。功能:將服務器端的分享目錄掛載到客户端中使用,像使用本地的文件。
NFS使用的端口隨機的,NFS基於RPC服務開啓。
RPC(Remote Rpocedure Call)服務:指定NFS功能對應的端口,並反饋給客户端,讓客户端能正確連接到服務端的端口。服務器啓動NFS時會隨機使用多個端口,並主動向RPC註冊,所以RPC標註了每個端口對應的NFS功能。客户端只要通過111端口(111是RPC固定端口)向服務器申請需要的服務器端口,就可以正確連接使用NFS了。
NFS啓動的基本進程:
1、rpc.nfsd:必要,這是nfs服務提供進程,用於判斷客户端是否能登入服務器端,包括UID判斷;
2、rpc.mountd:必要,管理nfs文件系統,用於讀取/etc/exports設定,並判斷用户端的各種操作權限;
3、rpc.lockd:可選,用於文件的鎖定,防止多個客户端同時對同一文件的寫入。需客户端和服務器端都開啓才生效。
4、rpc.statd:可選,用於檢查文件一致性,當多個客户對同一文件寫入造成數據不一致而嘗試修復該文件。該進程常與rpc.lockd同時使用。該進程也需客户端和服務器端同時開啓。
NFS文件存取權限:
客户端訪問nfs的文件時,服務器端會用户端的使用者UID, GID等身份來嘗試讀取服務器端的文件系統,那麼有以下幾種情形:
(1)NFS服務端有相同的賬號和羣組:這種情況則能直接存取;
(2)客户端的使用者UID與服務器端存在,但賬號名稱不一致:
假設客户端使用用户為dmtsai用户,該用户UID為501,則nfs服務端也有501的用户但名稱為vbird,則服務端用的是vbird賬號來存取文件;
(3)NFS服務器不存在此賬號:
如果用户端的使用者UID在服務器端找不到,則使用匿名用户來訪問,一般UID為65534, centOS則取名為nfsnobody。
(4)使用者身份為root:
默認情況下,如果使用root賬號訪問,則會降為匿名用户訪問。
需要安裝的軟件:
PRC程序:rpcbind,nfs依賴RPC服務,則必須存在rpcbind服務。
NFS程序:nfs-utils,提供rpc.nfsd和rpc.mountd這兩個進程服務和其他説明文件。
安裝:
centos下,使用 yum install nfs-utils 安裝。
檢查有無安裝: rpm -qa | grep nfs 和 rpm -qa | grep rpcbind。
NFS軟件結構:
/etc/exports:nfs的主要設置文件,該文件可能一開始不存在,需手動建立。
/usr/sbin/exportfs:維護nfs分享資源程序,用於修改/etc/exports的目錄分享。
/var/lib/nfs/*tab:有兩個文件, etab記錄nfs分享目錄的完整權限設置;xtab記錄訪問nfs服務器的用户端日誌。
/usr/sbin/showmout:用於客户端,察看分享的目錄資源。
/etc/exports文件結構:
每行為分享的目錄和設置給不同主機的不同權限:
vim /etc/exports
/tmp 192.168.100.0/24(ro) localhost(rw) *.ev.edu.tw(ro.sync)
以上面的內容為例,每行最前面寫明要分享的目錄,注意,是目錄非文件。然後依次分享給三種不同的主機,主機後緊跟的小括號內為權限參數,參數間用逗號間隔,主機名與括號間緊挨無空格。
主機名格式:
(1)可以是完整IP或網域,如上192.168.100.0/24;
(2)可以用主機名稱,但必須在/etc/hosts內,或DNS能找到。主機名稱可用星號*或?。
常見權限參數格式:
ro\rw:表示該目錄可讀(ro)或可寫(rw),不過最終能否讀寫還要依賴文件的rwx和身份;
sync\async:sync表示文件同步寫入到內存和硬盤;async則先暫存到內存不立即寫到硬盤;
no_root_squash\root_squash:客户端用root賬號訪問nfs,默認情況為root_squash, 表示會降級為nfsnobody用户訪問nfs,要解開這樣的設定則需使用no_root_squash;
all_squash:不論用什麼使用者訪問nfs,都降為匿名用户(即nobody或(nfsnobody))訪問;
anonuid/anongid:當權限參數有使用到如上*_squash的參數,則可以使用anonuid自定義設定UID值,該值存在於/etc/passwd當中;anongid自定義羣組GID。
例1:讓root用户有root訪問權限
/tmp *(rw,no_root_squash)
上例主機名用*號,代表所有用户訪問/tmp時,都將使用root權限訪問。
例2:同一目錄針對不同範圍開放不同權限
mkdir /home/public
setfacl -m g:vbirdgroup:rwx /home/public
vim /etc/exports
/home/public 192.168.100.0/24(rw) *(ro)
當客户端IP為192.168.100.0/24網段時,則訪問nfs的/home/public目錄有讀寫權限;否則不在此網段的只有只讀權限。
例3:開放匿名登錄
groupadd -g 45 nfsanon
useradd -u 45 -g nfsanon nfsanon
mkidr /home/linux
setfacl -m u:nfsanon:rwx /home/linux
vim /etc/exports
/home/linux *.centos.vbird(rw,all_squash,anonuid=45,anongid=45)
上例在使用通用後綴centos.vbird名稱的主機訪問/home/linux目錄,則改用uid為45,gid45的賬户對其目錄進行讀寫。
修改好/etc/exports文件後,執行exportfs命令重新加載exports文件:
exportfs -arv
-a:全部重加載(或卸載)exports文件的配置;
-r:重新加載
-v:顯示執行後的加載內容
-u:與r參數相反,用於卸載配置
在客户端(或服務器內)使用showmount命令可查看服務器當前分享的目錄:
showmount -e [IP]
-e: 查看某個服務器分享的目錄信息
-a: 查看客户端與某個服務器的連線狀態
防火牆設置:
首先要固定nfs的隨機端口:
vi /etc/sysconfig/nfs
#添加或修改
LOCKD_TCPPORT=41889 #nfs-lock的tcp固定端口
LOCKD_UDPPORT=40220 #nfs-lock的udp固定端口
MOUNTD_PORT=20048 #mountd的固定端口
centos7中,要在/etc/sysctl.conf中添加以下配置:
vi /etc/sysctl.conf
#添加以下配置:
fs.nfs.nlm_tcpport = 41889
fs.nfs.nlm_udpport = 40220
保存後,執行以下命令使以上配置生效。
sysctl -p
重啓nfs相關服務:
systemctl restart rpcbind
systemctl restart nfs-server
systemctl restart nfs-lock
systemctl restart nfs-idmap
用rpcinfo命令查看各服務註冊情況:
rpcinfo -p [localhost|其他IP]
-p : 顯示所有註冊的rpc服務和端口
添加以下規則,允許某Ip可使用Nfs服務:
#以客户端192.168.1.100為例:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="111,2049,20048,41889" protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="111,2049,20048,40220" protocol="udp" accept'
firewall-cmd --reload
#如果以上命令出現invalid port提示錯誤,則可以按服務方式添加:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="nfs" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="rpc-bind" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="mountd" accept'
# 若 nlockmgr 用了固定端口 41889和40220,需單獨添加
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="103.212.48.251" port port="41889" protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="103.212.48.251" port port="40220" protocol="udp" accept'
#查看已添加的富規則:
firewall-cmd --list-rich-rules
#如需要刪除某條富規則,將add-rich-rule改為remove-rich-rule再執行一次
autofs自動掛載服務:
自動掛載服務,能在需要訪問Nfs資源時才會動態掛載,長時間不用時會自動卸載,節省資源。
安裝:
yum install -y autofs
自動配置文件:/etc/auto.master
autofs有兩種映射模式,一種是直接映射,一種是間接映射模式:
|
映射模式
|
核心特點
|
|
|
|
直接映射( |
掛載點是絕對路徑(如 |
|
|
|
間接映射
|
掛載點是父目錄的子路徑(如父目錄 |
|
|
一、間接映射示例:
#將Nfs服務器192.168.0.1下的/home/www目錄掛載到客户端192.168.0.10下的/home/linux/www下:
#auto.master文件:定義父目錄,並用子配置文件定義要掛載的子目錄
/home/linux /etc/subdir/www.misc
#www.misc文件:書寫子目錄
www -rw,bg,soft 192.168.0.1:/home/www
注意:間接映射會讓原本的父目錄被nfs共享機制覆蓋,所以原來的目錄(如上示例/home/linux)中的文件和子目錄將看不到。
二、直接映射示例:
#將Nfs服務器192.168.0.1下的/home/www目錄掛載到客户端192.168.0.10下的/home/linux/www下:
#auto.master文件(第
/- /etc/subdir/www.misc
#www.misc文件:書寫絕對目錄
/home/linux/www -rw,bg,soft 192.168.0.1:/home/www
注意:/-表示 “沒有固定的父掛載目錄”,所有的掛載點都由後續的*.misc文件中的“絕對路徑”來定義。所以直接映射不會掛載父目錄。
手動掛載命令mount:
mount -t nfs -o nosuid,noexec,nodev,rw 192.168.100.254:/home/public /home/nfs/public
#-t: 指定掛載的文件系統類型,這裏用nfs;
#-o: 掛載時需指定的一些必要參數,見下圖。
一些必要的參數:
|
參數
|
參數代表意義
|
預設值
|
|
suid
nosuid
|
對具有suid的執行文件,可以定義其是否能使用suid的權限。
|
suid
|
|
rw
ro
|
設置是否只讀(ro)或可讀寫(rw)。
|
rw
|
|
dev
nodev
|
是否保留設備文件的特殊功能,一般只有/dev目錄才有效。
|
dev
|
|
exec
noexec
|
是否能執行二進制文件的權限。
|
exec
|
|
user
nouser
|
是否允許使用者進行掛載或卸載功能。
|
nouser
|
|
auto
noauto
|
auto 指的是『mount -a』時,是否可自動掛載。
|
auto
|
對於nfs,還有一些額外的有用參數:
|
參數
|
功能
|
預設值
|
|
fg
bg
|
掛載時在地前景還是後置進行. fg代表前景,即會持續嘗試掛載操作,直到成功或超時為止;bg代表後置操作,不會影響前景的程序。如果網絡不穩定或需要常開關機,建議用bg。
|
fg
|
|
soft
hard
|
hard:如果兩機通訊時任一主機下線,則rpc會一直嘗試連線,直到恢復通訊為止;soft: rpc在超時後重複呼叫,但不會一直通訊,系統的延遲不會這麼明顯。如果系統經常開關機,建議用soft.
|
hard
|
|
intr
|
與上方的hard一起用。當使用intr參數,則rpc呼叫過程可被中斷(interrupted)。
|
沒有
|
|
rsize
wsize
|
定義讀區塊(rsize)和寫區塊(wsize)大小 (block size),設定通訊傳輸的緩衝內存。如果服務器有足夠的內存,可將此值設定大些,如 32768 (bytes) 等,提高緩衝傳輸能力!
|
rsize=1024
wsize=1024
|
設定開機即掛載:
可以/etc/rc.d/rc.local文件中添加mount命令。
示例:
vim /etc/rc.d/rc.local
mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 \
192.168.100.254:/home/public /home/nfs/public
注意: 不要在/etc/fstab文件中配置,因為nfs需要網絡服務,而fstab文件在掛載時還未啓動網絡。