1. 程式人生 > >Linux環境下NFS服務的安裝與配置

Linux環境下NFS服務的安裝與配置

一、幾個概念

  • NFS 就是 Network File System 的縮寫,最早是由 Sun 這家公司所發展出來的。 它最大的功能就是可以透過網路,讓不同的機器、不同的作業系統、可以彼此分享個別的檔案 (share files)。我們可以簡單的將他看做是一個檔案伺服器 (file server) !這個 NFS 伺服器可以讓你的 PC 來將網路遠端的 NFS 伺服器分享的目錄,掛載到本地端的機器當中, 在本地端的機器看起來,那個遠端主機的目錄就好像是自己的一個磁碟分割槽一樣 (partition)!
  • RPC(Remote Procedure Call)——遠端過程呼叫,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通訊程式之間攜帶資訊資料。在OSI網路通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網路分散式多程式在內的應用程式更加容易。NFS 伺服器在啟動的時候就得要向 RPC 註冊,所以 NFS 伺服器也是一種 RPC server 。

二、準備工作

  • 安裝好CentOS7.4Min的具有獨立IP的兩臺或多臺伺服器。本例以2臺機器為例,服務端(提供NFS服務的一端,即資料實際存放端):192.168.237.21,客戶端:192.168.237.22。
  • 架構圖。
    這裡寫圖片描述

三、安裝配置過程

1、服務端和客戶端必須軟體nfs-utils,事實上在安裝nfs-utils的同時,rpcbind作為依賴包被安裝,因此無需再單獨安裝rpcbind。單獨安裝rpcbind時不會同時安裝nfs-utils。

[root@Geeklp-NFS-Server ~]# yum -y install nfs-utils

2、啟動服務端的nfs和rpcbind服務,並將其設定為開機啟動(作為伺服器,應保證服務在每次重啟之後都能迅速提供服務)

[[email protected] ~]# systemctl start nfs
[[email protected] ~]# systemctl enable nfs
[[email protected] ~]# systemctl status nfs
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
   Active: active (exited) since 四 2017
-12-07 17:01:25 CST; 58s ago [[email protected] ~]# systemctl start rpcbind [[email protected] ~]# systemctl enable rpcbind [[email protected] ~]# systemctl status rpcbind ● rpcbind.service - RPC bind service Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled) Active: active (running) since 四 2017-12-07 17:01:25 CST; 3min 26s ago Main PID: 35630 (rpcbind) CGroup: /system.slice/rpcbind.service └─35630 /sbin/rpcbind -w

3、在服務端建立共享目錄。

[root@Geeklp-NFS-Server ~]# mkdir /nfs

4、修改服務端配置檔案
修改服務端配置檔案/etc/exports,增加如下一行:
/nfs 192.168.237.22/24(rw,sync)
5、依次重啟服務端rpcbind、nfs服務

[root@Geeklp-NFS-Server ~]# systemctl restart rpcbind
[root@Geeklp-NFS-Server ~]# systemctl restart nfs

6、 配置服務端防火牆

[root@Geeklp-NFS-Server ~]# firewall-cmd --add-service=nfs --permanent
success
[root@Geeklp-NFS-Server ~]# firewall-cmd --reload
success

7、啟動客戶端nfs服務(客戶端可以不啟動rpcbind服務),掛載服務端nfs目錄。

[root@Geeklp-NFS-Client ~]# systemctl start nfs
[root@Geeklp-NFS-Client ~]# mount -t nfs 192.168.237.21:/nfs /mnt

8、測試。
在客戶端檢視一下掛載情況。

[root@Geeklp-NFS-Client mnt]# df -Th
檔案系統                型別      容量  已用  可用 已用% 掛載點
/dev/mapper/centos-root xfs       8.3G  966M  7.4G   12% /
devtmpfs                devtmpfs  478M     0  478M    0% /dev
tmpfs                   tmpfs     489M     0  489M    0% /dev/shm
tmpfs                   tmpfs     489M  6.8M  482M    2% /run
tmpfs                   tmpfs     489M     0  489M    0% /sys/fs/cgroup
/dev/sda1               xfs       247M  105M  142M   43% /boot
tmpfs                   tmpfs      98M     0   98M    0% /run/user/0
192.168.237.21:/nfs     nfs4       14G  1.2G   13G    9% /mnt

正常掛載,無異常。
在服務端及客戶端分別寫入資料,發現只能在服務端對/nfs目錄進行讀寫,而在客戶端只能讀取。因為都是使用root賬戶進行操作的,在客戶端看到的root是指服務端的root而並非客戶端的root。為了儘快使用、體驗nfs服務,在服務端將/nfs目錄的許可權設定為7,此時就能愉快的體驗nfs帶來的樂趣了。但這並不嚴謹,不是我們想要達到的目標。

四、高階拓展部分

今天不是特別忙,一下子更新了好幾篇博文,難免疏漏,還望諸位多多提出意見或建議。
一到公司,做完日常巡檢,就繼續來完成昨天未完成的任務了。發現了2個問題:
(1)客戶端NFS掛載不上了,報錯:mount.nfs: access denied by server while mounting 192.168.237.21:/nfs
我仔細檢查了一遍防火牆、服務端nfs、rpcbind服務狀態、網路等,都沒有發現任何問題。問題出在哪呢?忽然回憶起來,昨天關機之前改過/etc/exports檔案,把括號內的內容改為了(rwx,sync),去掉x之後依次重啟服務端rpcbind、nfs服務,掛載成功!
(2)客戶端端無需啟動rpcbind及nfs服務即可掛載NFS,但是需要安裝nfs服務。

[root@Geeklp-NFS-Client ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)
   Active: inactive (dead)
[root@Geeklp-NFS-Client ~]# systemctl status nfs
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[root@Geeklp-NFS-Client ~]# umount /mnt
[root@Geeklp-NFS-Client ~]# mount -t nfs 192.168.237.21:/nfs /mnt
[root@Geeklp-NFS-Client ~]# df -Th
檔案系統                型別      容量  已用  可用 已用% 掛載點
/dev/mapper/centos-root xfs       8.3G  966M  7.4G   12% /
devtmpfs                devtmpfs  478M     0  478M    0% /dev
tmpfs                   tmpfs     489M     0  489M    0% /dev/shm
tmpfs                   tmpfs     489M  6.7M  482M    2% /run
tmpfs                   tmpfs     489M     0  489M    0% /sys/fs/cgroup
/dev/sda1               xfs       247M  105M  142M   43% /boot
tmpfs                   tmpfs      98M     0   98M    0% /run/user/0
192.168.237.21:/nfs     nfs4       14G  1.1G   13G    8% /mnt

在客戶端設定開機自動掛載NFS服務:
[[email protected] ~]# echo “/nfs 192.168.237.21:/nfs /mnt nfs defaults 0 0”>>/etc/fstab
移除rpcbind安裝包的時候,nfs也會作為依賴被刪除。單獨刪除nfs-utils時並不會同時刪除rpcbind。nfs-utils不能脫離rpcbind而單獨存在。

[[email protected] ~]# yum -y remove rpcbind
作為依賴被刪除:     nfs-utils.x86_64 1:1.3.0-0.48.el7_4                                                    quota.x86_64 1:4.01-14.el7   

移除rpcbind及nfs安裝包時如果沒有解除安裝NFS,那麼之前掛載的NFS目錄依然可以進行操作。但無法再次被掛載。要想掛載,必須安裝nfs-utils。
扯遠了,言歸正傳,說好在這一節咱們要來聊一聊NFS的高階配置的。以示區分,本次使用的NFS共享目錄為:/NFS-Server。
(一)在服務端新建NFS共享目錄/NFS-Server,在客戶端新建掛載點目錄/NFS-Client。

[root@Geeklp-NFS-Server ~]# mkdir /NFS-Server
[root@Geeklp-NFS-Client ~]# mkdir /NFS-Client

在此,我們先熟悉一下 /etc/exports 配置檔案的語法與引數,為接下來的內容做準備。

[[email protected] ~]# vim /etc/exports
/NFS-Server 192.168.237.22/24(ro) localhost(rw)  *.geeklp.com(ro,sync)                           
  • /NFS-Server:共享目錄
  • 192.168.237.22/24(ro):共享給指定主機的IP,括號內為許可權
  • localhost(rw):可使用主機名
  • *.geeklp.com(ro,sync):可使用域名,並且可以使用萬用字元
    對於括號內的許可權:
引數值 內容說明
rw
ro
該目錄分享的許可權是可擦寫 (read-write) 或只讀 (read-only),但最終能不能讀寫,還是與檔案系統的 rwx及身份有關。
sync
async
sync 代表資料會同步寫入到記憶體與硬碟中,async 則代表資料會先暫存於記憶體當中,而非直接寫入硬碟!
no_root_squash
root_squash
客戶端使用 NFS 檔案系統的賬號若為 root 時,系統該如何判斷這個賬號的身份?預設的情況下,客戶端 root 的身份會由 root_squash 的設定壓縮成 nfsnobody,如此對伺服器的系統會較有保障。但如果你想要開放客戶端使用 root 身份來操作伺服器的檔案系統,那麼這裡就得要開 no_root_squash 才行!
all_squash 不論登入 NFS 的使用者身份為何, 他的身份都會被壓縮成為匿名使用者,通常也就是 nobody(nfsnobody)
anonuid
anongid
anon 意指 anonymous (匿名者) 前面關於 *_squash 提到的匿名使用者的 UID 設定值,通常為 nobody(nfsnobody),但是你可以自行設定這個 UID 的值!當然,這個 UID 必需要存在於你的 /etc/passwd 當中!anonuid 指的是 UID 而 anongid 則是群組的 GID。

(二)幾個應用案例。
1、全面共享NFS目錄,讓誰都能以root許可權來操作共享目錄裡面的內容。

[root@Geeklp-NFS-Server /]echo "/NFS-Server *(rw,no_root_squash)">>/etc/exports
[root@Geeklp-NFS-Server /]# systemctl restart rpcbind
[root@Geeklp-NFS-Server /]# systemctl restart nfs

在客戶端掛載此共享目錄:

[root@Geeklp-NFS-Client ~]# mount -t nfs 192.168.237.21:/NFS-Server /NFS-Client/
[root@Geeklp-NFS-Client /]# echo "Geeklp NFS test">/NFS-Client/a.txt
[root@Geeklp-NFS-Client /]# ls -l NFS-Client/
總用量 4
-rw-r--r--. 1 root root 16 128 14:15 a.txt
[root@Geeklp-NFS-Client /]# cat  NFS-Client/a.txt 
Geeklp NFS test

回去服務端看一下:

[root@Geeklp-NFS-Server /]# ll /NFS-Server/
總用量 4
-rw-r--r--. 1 root root 16 128 14:15 a.txt
[root@Geeklp-NFS-Server /]# cat /NFS-Server/a.txt 
Geeklp NFS test

不用在服務端修改許可權咯!
2、在客戶端解除安裝共享目錄。再將/NFS-Server限定網段為192.168.237.0/24 且加入geeklpgroup的使用者才能夠讀寫,其他來源則只能讀取。 此部分涉及到ACL許可權管理的內容。

[root@Geeklp-NFS-Server /]# groupadd geeklpgroup
[root@Geeklp-NFS-Server /]# setfacl -m g:geeklpgroup:rwx /NFS-Server/

此時在客戶端掛載此NFS共享目錄,能夠正常讀,但是無法寫入資料。在客戶端也新增組geeklpgroup,建立使用者geeklp並將其新增至geeklpgroup內。切換到geeklp使用者,寫入資料成功!

[[email protected]-NFS-Client /]# groupadd geeklpgroup
[[email protected]-NFS-Client NFS-Client]# useradd geeklp -g geeklpgroup
[[email protected]-NFS-Server /]# echo "/NFS-Server 192.168.237.0/24(rw) *(ro)">/etc/exports
[[email protected]-NFS-Server /]# systemctl restart rpcbind
[[email protected]-NFS-Server /]# systemctl restart nfs
[[email protected]-NFS-Client /]# mount -t nfs 192.168.237.21:/NFS-Server /NFS-Client
[[email protected]-NFS-Client NFS-Client]# su geeklp
[[email protected]-NFS-Client NFS-Client]$ touch d.txt
[[email protected]-NFS-Client NFS-Client]$ ll
總用量 0
-rw-r--r--. 1 geeklp geeklpgroup 0 12月  8 15:44 d.txt

如果要指定特定使用者對NFS共享目錄有讀寫執行的許可權,使用ACL許可權管理一樣能實現。
3、讓主機192.168.237.22/24,登入NFS 主機時,可以讀寫NFS共享目錄,並且在讀寫資料的時候都以指定的UID 與 GID來操作。例如指定uid為1001,gid為1002。

[[email protected]-NFS-Server /]# groupdel geeklpgroup
[[email protected]-NFS-Server /]# setfacl -b /NFS-Server
[[email protected]-NFS-Client /]# umount /NFS-Client/
[[email protected]-NFS-Client /]# userdel -r geeklp
[[email protected]-NFS-Client /]# groupdel geeklpgroup
[[email protected]-NFS-Server /]# useradd -u 1001 geeklp-nfs
[[email protected]-NFS-Server /]# groupadd -g 1002 geeklp-nfs-g
[[email protected]-NFS-Server /]# useradd -u 1001 geeklp-nfs
[[email protected]-NFS-Server /]# id geeklp-nfs
uid=1001(geeklp-nfs) gid=1001(geeklp-nfs) 組=1001(geeklp-nfs)
[[email protected]-NFS-Server /]# groupadd -g 1002 geeklp-nfs-g
[[email protected]-NFS-Server /]# echo "/NFS-Server 192.168.237.22/24(rw,all_squash_root,anonuid=1001,anongid=1002)">/etc/exports
[[email protected]-NFS-Server /]# cat /etc/exports
/NFS-Server 192.168.237.22/24(rw,all_squash_root,anonuid=1001,anongid=1002)
[[email protected]-NFS-Server ~]# chown geeklp-nfs /NFS-Server/
[[email protected]-NFS-Server ~]# chgrp geeklp-nfs-g /NFS-Server/
[[email protected]-NFS-Server ~]# systemctl restart rpcbind
[[email protected]-NFS-Server ~]# systemctl restart nfs
[[email protected]-NFS-Client /]# umount /NFS-Client/
[[email protected]-NFS-Client /]# mount -t nfs 192.168.237.21:/NFS-Server /NFS-Client
[[email protected]-NFS-Client NFS-Client]# touch geeklp.txt
[[email protected]-NFS-Client NFS-Client]# ll
總用量 0
-rw-r--r--. 1 1001 1002 0 12月  8 18:23 geeklp.txt

在本例中需要注意的要點是:NFS的共享目錄/NFS-Server的使用者與組必須與/etc/exports中指定的使用者uid和組gid相匹配,否則是無法進行寫操作的。使用者可以屬於exports中指定組,也可以不屬於。
4、一些相關命令詳解
(1)exportfs
如果我們在啟動了NFS之後又修改了/etc/exports,是不是還要重新啟動nfs呢?這個時候我們就可以用exportfs 命令來使改動立刻生效,該命令格式如下:
   # exportfs [-aruv]
  -a 全部掛載或解除安裝 /etc/exports中的內容
  -r 重新讀取/etc/exports 中的資訊 ,並同步更新/etc/exports、/var/lib/nfs/xtab
  -u 解除安裝單一目錄(和-a一起使用為解除安裝所有/etc/exports檔案中的目錄)
  -v 在export的時候,將詳細的資訊輸出到螢幕上。
具體例子:
  # exportfs -au 解除安裝所有共享目錄
  # exportfs -rv 重新共享所有目錄並輸出詳細資訊
(2)nfsstat
檢視NFS的執行狀態。
(3)rpcinfo
檢視rpc執行資訊,可以用於檢測rpc執行情況的工具,利用rpcinfo -p 可以查看出RPC開啟的埠所提供的程式有哪些。
(4)showmount
  -a 顯示已經於客戶端連線上的目錄資訊
  -e IP或者hostname 顯示此IP地址分享出來的目錄
(參考資料:http://jlk.fjfi.cvut.cz/arch/manpages/listing/core/nfs-utils/