NFS(Network FileSystem)--由Sun公司開發的,用於通過網絡分享文件給其他系統使用。功能:將服務器端的分享目錄掛載到客户端中使用,像使用本地的文件。

NFS使用的端口隨機的,NFS基於RPC服務開啓。

RPC(Remote Rpocedure Call)服務:指定NFS功能對應的端口,並反饋給客户端,讓客户端能正確連接到服務端的端口。服務器啓動NFS時會隨機使用多個端口,並主動向RPC註冊,所以RPC標註了每個端口對應的NFS功能。客户端只要通過111端口(111是RPC固定端口)向服務器申請需要的服務器端口,就可以正確連接使用NFS了。

使用NFS_linux

 

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有兩種映射模式,一種是直接映射,一種是間接映射模式:

映射模式

核心特點

auto.master 第一列格式

*.misc 文件中的內容格式

直接映射(/-

掛載點是絕對路徑(如 /a/b/c),不依賴父目錄

/-

/絕對掛載點路徑 選項 NFS 服務器:共享路徑

間接映射

掛載點是父目錄的子路徑(如父目錄 /a/b 下的 c

/父目錄路徑(如 /a/b

子目錄名 選項 NFS 服務器:共享路徑

 

一、間接映射示例:

#將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文件在掛載時還未啓動網絡。