NFS配置及遠程掛載
NFS簡介
NFS是Network File System的簡寫,即網絡文件系統。NFS最早是由 Sun Microsystems 公司開發,並於1984年推出。NFS 是一種可分散式的網絡文件系統,可以通過網絡(一個局域網)使不同的機器、不同的操作系統,能夠共享目錄和文件,使客戶端能通過網絡訪問並分享文件到位於服務端的磁盤中。NFS的客戶端(一般為應用服務器,例如web)可以通過掛載(mount)的方式將NFS服務器共享的數據目錄掛載到NFS客戶端本地系統中(就是某一個關在點下),從客戶端本地看,NFS服務器端共享目錄就好像是客戶端自己的磁盤分區或者目錄一樣,而實際上卻是遠端的NFS服務器的目錄。
NFS網絡文件系統很像Windows系統的網絡共享、安全功能、網絡驅動器映射,這也和linux的samba服務類似,只不過一般情況下,Windows網絡共享服務或samba服務用戶辦公局域網共享,而互聯網中小型網站集群架構后端常用NFS進行數據共享,若是大型網站,那么有可能還會用到更復雜的分布式文件系統Moosefs(mfs)、GlusterFS。NFS在文件傳送或信息傳送過程中依賴於RPC協議。RPC負責負責信息的傳輸。
一、環境和需求
環境:CentOS 7.5 ,安裝過程中software selection選擇Minimal install;
軟件版本:nfs-utils-1.3.0-0.54.el7.x86_64
共三台主機,每台主機各掛接有一個4TB數據盤,掛載點在/data1;
主機名:HOST1,IP:192.168.1.11
主機名:HOST2,IP:192.168.1.12
主機名:HOST3,IP:192.168.1.13
需求:解決多台服務器之間數據盤的內容相互共享
二、服務器校准時間
1、登陸到服務器后,用命令查看當前時區:
date -R
命令執行結果如下:
Fri, 02 Mar 2019 14:19:41 +0800
如果顯示是+0800,就是北京時間;
2、更改時區的辦法。如果不是北京時間,則用以下方法修改為北京時區:(如果不是root用戶,則加上sudo)
先把時區文件備份,命令執行如下:
mv /etc/localtime /etc/localtime.old
將正確的時區文件鏈接過來:
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
再用命令查看當前時區:
date -R
3 、如果ntp服務並未安裝,則先安裝后再執行上述命令:
yum install -y ntp
4、開啟ntp同步命令:
systemctl enable ntpd
systemctl start ntpd
5、允許同步硬件時間:
在/etc/sysconfig/ntpd最后一行加
SYNC_HWCLOCK=yes
三、服務器的NFS服務端配置
1、檢查nfs軟件是否安裝
sudo rpm -qa | grep nfs-utils
sudo rpm -qa | grep rpcbind
安裝nfs組件,已安裝的跳過;服務端和客戶端需要的環境一樣
sudo yum -y install nfs-utils
sudo yum -y install rpcbind
2、根據需要修改NFS的配置文件 /etc/exports (默認是空文件),此處要注意三台服務器開放的ip限制有區別,除了exports文件外,其他配置完全一樣;
sudo vi /etc/exports
#主機HOST1增加以下一行內容
/data1 192.168.1.12(rw,sync) 192.168.1.13(rw,sync)
sudo vi /etc/exports
#主機HOST2增加以下一行內容
/data1 192.168.1.11(rw,sync) 192.168.1.13(rw,sync)
#主機HOST3增加以下一行內容
/data1 192.168.1.11(rw,sync) 192.168.1.12(rw,sync)
3、配置端口
默認設置中 nfs 端口是2049,portmapper 的端口是111,mountd 端口是20048,status 和 nlockmgr 是隨機端口。如需進行防火牆開放端口的設置,修改如下,否則跳過:
修改 /etc/sysconfig/nfs 文件
sudo vi /etc/sysconfig/nfs
#增加端口配置如下一行,對應 rpc.statd 服務,顯示status
STATD_PORT=2050
因 nfslock 服務會自動開啟 rpc.statd,無需做設置;在rpcinfo -p 映射中,rpc.statd 對應 status ,后續再次修改端口后重啟服務使配置生效的
sudo systemctl restart nfs-lock
修改 /etc/modprobe.d/lockd.conf 文件。Network Lock Manager (NLM),對應是 nlockmgr
sudo vi /etc/modprobe.d/lockd.conf
#增加端口配置如下兩行
options lockd nlm_tcpport=2051
options lockd nlm_udpport=2051
4、開啟NFS服務,設置服務開機自啟動,按順序先 rpcbind 后 nfs
sudo systemctl start rpcbind.service
sudo systemctl start nfs.service
sudo systemctl enable rpcbind.service
sudo systemctl enable nfs.service
或
sudo systemctl start rpcbind nfs-server
sudo systemctl enable rpcbind nfs-server
查看共享是否成功
showmount -e localhost
或用exportfs -arv命令,重新使配置文件生效,並顯示生效內容
sudo exportfs -arv
查看服務對應端口的命令
rpcinfo -p
5、防火牆設置
查看防火牆是否在運行
sudo firewall-cmd --state
顯示 running 則加上放行規則,否則跳過
sudo firewall-cmd --permanent --add-port=111/tcp
sudo firewall-cmd --permanent --add-port=111/udp
sudo firewall-cmd --permanent --add-port=2049-2051/tcp
sudo firewall-cmd --permanent --add-port=2049-2051/udp
sudo firewall-cmd --permanent --add-port=20048/tcp
sudo firewall-cmd --permanent --add-port=20048/udp
sudo firewall-cmd --reload
待驗證
sudo firewall-cmd --add-service=nfs --permanent sudo firewall-cmd --reload
四、服務器的NFS客戶端配置
1、創建掛載目錄(三台客戶端各有不同)
#HOST1的掛載目錄
sudo ln -s /data1 /data1_11
sudo mkdir /data1_12
sudo mkdir /data1_13
#HOST2的掛載目錄
sudo ln -s /data1 /data1_12
sudo mkdir /data1_11
sudo mkdir /data1_13
#HOST3的掛載目錄
sudo ln -s /data1 /data1_13
sudo mkdir /data1_11
sudo mkdir /data1_12
2、客戶端遠程目錄的掛載,將掛載配置寫入fstab文件(三台客戶端各有不同)
sudo vi /etc/fstab
#HOST1的fstab文件加上
192.168.1.12:/data1 /data1_12 nfs defaults 0 0
192.168.1.13:/data1 /data1_13 nfs defaults 0 0
#HOST2的fstab文件加上
192.168.1.11:/data1 /data1_11 nfs defaults 0 0
192.168.1.13:/data1 /data1_13 nfs defaults 0 0
#HOST3的fstab文件加上
192.168.1.11:/data1 /data1_11 nfs defaults 0 0
192.168.1.12:/data1 /data1_12 nfs defaults 0 0
3、在客戶端分別執行,讓修改fstab后的掛載生效,
sudo mount -a
至此,NFS配置已經完成,如打開共享目錄寫入報錯 Permission denied ,請根據需求和安全原則修正對應源目錄寫入的權限(詳見下面補充說明)
五、其他補充說明(安裝過程或完成后檢測用到的命令、知識點)
1、NFS服務需要安裝的軟件包
nfs-utils:nfs服務的主程序,包括rpc.nfsd、rpc.mountd兩個daemons和相關的文檔說明及執行命令文件等
rpcbind:rpc主程序,安裝 nfs-utils 時會自動按依賴安裝上,無需另外安裝
在安裝完 nfs-utils 后會自動創建 nfsnobody 用戶
[root@localhost ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
2、查NFS服務是否在運行
sudo systemctl status rpcbind
sudo systemctl status nfs
3、查看NFS版本
服務器端使用:nfsstat -s
客戶端使用:nfsstat -c
4、查看主機開放的端口
ss命令的使用見:https://www.cnblogs.com/ylnic/p/10065344.html
[wangzhiping@localhost /]$ ss -lutp4
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 *:mountd *:*
udp UNCONN 0 0 127.0.0.1:703 *:*
udp UNCONN 0 0 *:856 *:*
udp UNCONN 0 0 *:nfs *:*
udp UNCONN 0 0 *:av-emb-config *:*
udp UNCONN 0 0 *:epnsdp *:*
udp UNCONN 0 0 *:sunrpc *:*
tcp LISTEN 0 64 *:nfs *:*
tcp LISTEN 0 128 *:av-emb-config *:*
tcp LISTEN 0 64 *:epnsdp *:*
tcp LISTEN 0 128 *:sunrpc *:*
tcp LISTEN 0 128 *:mountd *:*
tcp LISTEN 0 128 *:ssh *:*
tcp LISTEN 0 100 127.0.0.1:smtp *:*
[wangzhiping@localhost /]$ ss -lutp4n
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 *:20048 *:*
udp UNCONN 0 0 127.0.0.1:703 *:*
udp UNCONN 0 0 *:856 *:*
udp UNCONN 0 0 *:2049 *:*
udp UNCONN 0 0 *:2050 *:*
udp UNCONN 0 0 *:2051 *:*
udp UNCONN 0 0 *:111 *:*
tcp LISTEN 0 64 *:2049 *:*
tcp LISTEN 0 128 *:2050 *:*
tcp LISTEN 0 64 *:2051 *:*
tcp LISTEN 0 128 *:111 *:*
tcp LISTEN 0 128 *:20048 *:*
tcp LISTEN 0 128 *:22 *:*
tcp LISTEN 0 100 127.0.0.1:25 *:*
5、查看 rpc 的端口映射
[nfs_user@localhost /]$ rpcinfo -p
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
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
100024 1 udp 2050 status
100024 1 tcp 2050 status
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 2051 nlockmgr
100021 3 udp 2051 nlockmgr
100021 4 udp 2051 nlockmgr
100021 1 tcp 2051 nlockmgr
100021 3 tcp 2051 nlockmgr
100021 4 tcp 2051 nlockmgr
6、NFS的常用目錄
| 文件目錄 | 用途 |
|---|---|
| /etc/exports | NFS服務的主要配置文件,系統並沒有默認值,是空文件,如這個文件不存在,需要自己創建 |
| /usr/sbin/exportfs | NFS服務的管理命令 |
| /usr/sbin/showmount | 客戶端的查看命令 |
| /var/lib/nfs/etab | 記錄NFS分享出來的目錄的完整權限設定值,即服務器配置的參數(包含默認的參數) |
| /var/lib/nfs/xtab | 記錄曾經登錄過的客戶端信息 |
NFS的配置文件:
/etc/exports:NFS配置文件
/var/lib/nfs/*tab:NFS服務器日志放置路徑;etab記錄共享出來的目錄完整權限設置值;xtab記錄曾經連接到此NFS主機的相關客戶端數據
NFS的兩個命令:
/usr/sbin/exportfs:維護NFS共享資源;重新共享/etc/exports變更目錄或將NFS server共享目錄卸載或重新共享
/usr/sbin/showmount:在客戶端查看NFS服務器共享出來的目錄資源
7、NFS的主要配置文件 /etc/exports 的內容格式
<輸出目錄> [客戶端1 選項(訪問權限,用戶映射,其他)] [客戶端2 選項(訪問權限,用戶映射,其他)] a. 輸出目錄: 輸出目錄是指NFS系統中需要共享給客戶機使用的目錄; b. 客戶端: 客戶端是指網絡中可以訪問這個NFS輸出目錄的計算機 客戶端常用的指定方式 指定ip地址的主機:192.168.0.200 指定子網中的所有主機:192.168.0.0/24 192.168.0.0/255.255.255.0 指定域名的主機:david.bsmart.cn 指定域中的所有主機:*.bsmart.cn 所有主機:* c. 選項: 選項用來設置輸出目錄的訪問權限、用戶映射等。 NFS主要有3類選項: 訪問權限選項 設置輸出目錄只讀:ro 設置輸出目錄讀寫:rw 用戶映射選項 all_squash:將遠程訪問的所有普通用戶及所屬組都映射為匿名用戶或用戶組(nfsnobody); no_all_squash:與all_squash取反(默認設置); root_squash:將root用戶及所屬組都映射為匿名用戶或用戶組(默認設置); no_root_squash:與rootsquash取反; anonuid=xxx:將遠程訪問的所有用戶都映射為匿名用戶,並指定該用戶為本地用戶(UID=xxx); anongid=xxx:將遠程訪問的所有用戶組都映射為匿名用戶組賬戶,並指定該匿名用戶組賬戶為本地用戶組賬戶(GID=xxx); 其它選項 secure:限制客戶端只能從小於1024的tcp/ip端口連接nfs服務器(默認設置); insecure:允許客戶端從大於1024的tcp/ip端口連接服務器; sync:將數據同步寫入內存緩沖區與磁盤中,效率低,但可以保證數據的一致性; async:將數據先保存在內存緩沖區中,必要時才寫入磁盤; wdelay:檢查是否有相關的寫操作,如果有則將這些寫操作一起執行,這樣可以提高效率(默認設置); no_wdelay:若有寫操作則立即執行,應與sync配合使用; subtree:若輸出目錄是一個子目錄,則nfs服務器將檢查其父目錄的權限(默認設置); no_subtree:即使輸出目錄是一個子目錄,nfs服務器也不檢查其父目錄的權限,這樣可以提高效率;
例如
/ user01(rw) user02(rw,no_root_squash)
表示共享服務器上的根目錄(/)只有user01和user02兩台主機可以訪問,且有讀寫權限;user01主機用root用戶身份訪問時,將客戶機的root用戶映射成服務器上的匿名用戶(root_squash,該參數為缺省參數),相當於在服務器使用nobody用戶訪問目錄;user02主機用root用戶身份訪問該共享目錄時,不映射root用戶(no_root_squash),即相當於在服務器上用root身份訪問該目錄。在配置文件中,使用了no_root_squash ,所以root用戶不受約束,在 user02 機器上到掛載點下,到共享目錄下,就可以像在本地磁盤使用root用戶一樣,是不受限制的(通常情況下,不限制root用戶的比較多,要注意安全問題)
/root/share/ 192.168.1.2(rw,insecure,sync,all_squash)
表示共享服務器上的/root/share/目錄只有192.168.1.2主機可以訪問,且有讀寫權限;此主機用任何身份訪問時,將客戶機的用戶都映射成服務器上的匿名用戶(all_squash),相當於在服務器上用nobody用戶訪問該目錄(若客戶機要在該共享目錄上保存文件(即寫操作),則服務器上的nobody用戶對該目錄必須有寫的權限)
/home/ylw/ *.test.com (rw,insecure,sync,all_squash)
表示共享/home/ylw/目錄,*.test.com域中所有的主機都可以訪問該目錄,且有讀寫權限
/home/share/ .test.com (ro,sync,all_squash,anonuid=zh3,anongid=wa4)
表示共享目錄/home/share/,*.test.com域中的所有主機都可以訪問,但只有只讀的權限,所有用戶都映射成服務器上的uid為zh3、gid為wa4的用戶
8、exportfs命令詳解
- exportfs命令和nfs-utils這個包一起安裝的
- 例子:
- 假設在第一次配置 nfs 的共享目錄,之后需要新增、更改某些機器或共享的目錄;
- 首先需要更改配置文件,然后重啟NFS服務,但如果遠程客戶端正在使用NFS服務,正在掛載着,如果你需要先停止nfs服務,那遠程的客戶端就會掛起,就會很大的影響,造成服務異常,進程異常,有很大可能導致系統壞掉
- nfs服務不能隨便重啟,要重啟,就需要先去服務器上,把掛載的目錄卸載下來
- 在卸載目錄的時候,若是在當前目錄下去卸載會提示 umount.nfs4: /mnt: device is busy
- 方法一:退出該目錄后,再去卸載
- 方法二:在目錄下卸載的時候,加 -l 選項,表示 lazy 懶惰的意思
- 在卸載目錄后,在重啟nfs服務
- 在卸載目錄的時候,若是在當前目錄下去卸載會提示 umount.nfs4: /mnt: device is busy
- 若是掛載了很多台機器,那么每台機器都需要去卸載,就會很麻煩,降低了工作效率
- 方法:使用exportfs命令,重新加載下
- 方法:使用exportfs命令,重新加載下
- exportfs命令
- -a 全部掛載或者全部卸載,全部掛載或卸載 /etc/exports中的內容
- -r 重新掛載,重新讀取/etc/exports 中的信息 ,並同步更新/etc/exports、/var/lib/nfs/xtab
- -u 卸載某一個目錄,和-a一起使用,是卸載所有/etc/exports文件中的目錄
- -v 顯示共享目錄,在export的時候,將詳細的信息輸出到屏幕上。
例一、在NFS服務端上修改 /etc/exports ,增加某個共享目錄后
/share 192.168.10.0/24(rw,sync,root_squash)
用 exportfs 不用重啟nfs服務,使改動立刻生效
sudo exportfs -arv
其他例子
exportfs -au #卸載所有共享目錄
exportfs -rv #重新共享所有目錄並輸出詳細信息
9、showmount 命令用於查詢NFS服務器
Usage: showmount [-adehv] [--all] [--directories] [--exports] [--no-headers] [--help] [--version] [host] -a或--all 以 host:dir 這樣的格式來顯示客戶主機名和掛載點目錄。 -d或--directories 僅顯示被客戶掛載的目錄名。 -e或--exports 顯示NFS服務器的輸出清單。 -h或--help 顯示幫助信息。 -v或--version 顯示版本信。 --no-headers 禁止輸出描述頭部信息。 顯示NFS客戶端信息 # showmount 顯示指定NFS服務器連接NFS客戶端的信息 # showmount 192.168.1.1 #此ip為nfs服務器的 顯示輸出目錄列表 # showmount -e 顯示指定NFS服務器輸出目錄列表(也稱為共享目錄列表) # showmount -e 192.168.1.1 顯示被掛載的共享目錄 # showmount -d 顯示客戶端信息和共享目錄 # showmount -a 顯示指定NFS服務器的客戶端信息和共享目錄 # showmount -a 192.168.1.1
10、關於權限的分析
1. 客戶端連接時候,對普通用戶的檢查 a. 如果明確設定了普通用戶被壓縮的身份,那么此時客戶端用戶的身份轉換為指定用戶; b. 如果NFS server上面有同名用戶,那么此時客戶端登錄賬戶的身份轉換為NFS server上面的同名用戶; c. 如果沒有明確指定,也沒有同名用戶,那么此時 用戶身份被壓縮成nfsnobody; 2. 客戶端連接的時候,對root的檢查 a. 如果設置no_root_squash,那么此時root用戶的身份被壓縮為NFS server上面的root; b. 如果設置了all_squash、anonuid、anongid,此時root 身份被壓縮為指定用戶; c. 如果沒有明確指定,此時root用戶被壓縮為nfsnobody; d. 如果同時指定no_root_squash與all_squash 用戶將被壓縮為 nfsnobody,如果設置了anonuid、anongid將被壓縮到所指定的用戶與組;
多個NFS客戶端訪問服務器的讀寫文件時必須要有的權限
a、NFS服務器/etc/exports設置需要開放可寫入的權限,即服務端的共享權限
b、NFS服務器實際要共享的NFS目錄權限具有可寫入w的權限,即服務端本地目錄的安全權限
c、每台服務器都對應存在和NFS默認配置UID的相同UID的賬戶nfsnodoby(確保所有所有客戶端的訪問權限統一,否則每台機器都需要同時建立相同UID用戶,並覆蓋NFS的默認用戶配置)
只有滿足上述三個條件,多個NFS客戶端才能具有查看、修改、刪除其他任意NFS客戶端上傳文件的權限,這在大規模的集群環境中最為集群共享存儲時尤為重要
11、客戶端手動掛載
| 掛載命令 | 掛載的格式類型 | NFS服務器提供的共享目錄 | NFS客戶端的掛載點 |
|---|---|---|---|
| mount | -t nfs | 172.16.1.31:/data | /mnt (該目錄必須存在) |
創建掛載點
sudo mkdir /data1_11
掛載NFS,默認情況下只有 root 可以去掛載,普通用戶可以執行sudo
sudo mount -t nfs 192.168.1.11:/data1 /data1_11
掛載成功后,可用如下命令查看
sudo df -Th
如需卸載nfs,命令如下
sudo umount /data1_11
或
sudo umount 192.168.1.11:/data1
12、配置掛載 autofs(待測試確認)
# yum -y install autofs # vi /etc/auto.master #添加一行 /- /etc/auto.mount # vi /etc/auto.mount #添加一行 /data1 -fstype=nfs,rw nfs.st.local:/data1_11 #啟動服務 # systemctl start autofs # systemctl enable autofs
參考:
Red Hat Enterprise Linux fully supports NFS version 4.2 (NFSv4.2) since the Red Hat Enterprise Linux 7.4 release.Following are the features of NFSv4.2 in Red Hat Enterprise Linux 7.5
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-nfs
https://blog.csdn.net/gx_1_11_real/article/details/82622391
http://blog.51cto.com/lzhnb/2086392
https://www.cnblogs.com/st-jun/p/7742560.html
https://blog.csdn.net/wh211212/article/details/52954961
