1. 程式人生 > 實用技巧 >linux上nfs掛載

linux上nfs掛載

環境準備

NFS服務端 CentOS7 192.168.1.11
NFS客戶端 CentOS7 192.168.1.12

安裝NFS與配置

NFS的常用目錄:

/etc/exports        #NFS服務的主要配置檔案
/usr/sbin/exportfs  #NFS服務的管理命令
/usr/sbin/showmount #客戶端的檢視命令
/var/lib/nfs/etab   #記錄NFS分享出來的目錄的完整許可權設定值
/var/lib/nfs/xtab   #記錄曾經登入過的客戶端資訊

服務端

#CentOS系統服務端
yum -y install nfs-utils
yum -y install rpcbind 


將服務加入開機自啟動,並啟動服務:

systemctl enable rpcbind nfs-server
systemctl start rpcbind nfs-server

檢視nfs服務向rpc註冊的埠資訊(當前nfs-server未啟動,所有沒有註冊埠):

[root@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


如果此時啟動nfs,可以發現nfs隨機註冊的埠如下(對於此種情況下,如果未開啟防火牆,隨機埠是沒有問題的,一旦開啟就需要將埠固定下來了):

[root@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
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  37045  nlockmgr
100021    3   udp  37045  nlockmgr
100021    4   udp  37045  nlockmgr
100021    1   tcp  39375  nlockmgr
100021    3   tcp  39375  nlockmgr
100021    4   tcp  39375  nlockmgr


防火牆配置

NFS的防火牆很難設定規則,除了固定的nfs2049、portmapper111之外, 還有很多不固定的埠是由rpc.mountd, rpc.rquotad等服務所開啟的。因此我們需要在/etc/sysconfig/nfs指定特定的埠,這樣每次啟動nfs時,相關服務啟動的埠就會固定,如此即可設定防護牆!

固定nfs服務埠

固定埠nfs 2049、portmapper 111,另外3個服務埠可設定為mountd 892、rpc.statd 662、 nlockmgr 32803、32769

配置:
1.修改/etc/sysconfig/nfs檔案,將下列內容的註釋去掉,如果沒有則新增:

# TCP port rpc.lockd should listen on.
LOCKD_TCPPORT=32803
# UDP port rpc.lockd should listen on.
LOCKD_UDPPORT=32769

# Port rpc.mountd should listen on.
MOUNTD_PORT=892

# Port rpc.statd should listen on.
STATD_PORT=662
# Outgoing port statd should used. The default is port
# is random
STATD_OUTGOING_PORT=2020

埠配置完成後檢視(注意重啟nfs與伺服器):

[root@localhost ~]# rpcinfo -p

CentOS7下配置

編輯檔案 /etc/firewalld/zones/public.xml:

#vim /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="http"/> 
  <service name="https"/> 
  <port protocol="tcp" port="8080"/>
  <port protocol="tcp" port="22"/>
  <port protocol="tcp" port="111"/>
  <port protocol="tcp" port="662"/>
  <port protocol="tcp" port="892"/>
  <port protocol="tcp" port="2049"/>
  <port protocol="tcp" port="32803"/>
  <port protocol="udp" port="111"/>
  <port protocol="udp" port="662"/>
  <port protocol="udp" port="892"/>
  <port protocol="udp" port="2049"/>
  <port protocol="udp" port="32769"/>
</zone>

注意重啟防火牆

建立共享目錄

建立服務端共享目錄,例如:

mkdir /nfs

NFS共享目錄檔案配置

/etc/exports檔案內容:

#vi /etc/exports
/nfs     192.168.1.76(rw,sync,secure,no_root_squash,no_all_squash)

以上配置分為三個部分:

第一部分就是本地要共享出去的目錄。
第二部分為允許訪問的主機(可以是一個IP,一個IP段如192.168.0.0/24、192.168.0.0/255.255.255.0,指定域名的主機www.example.com,指定域中的所有主機.example.com,所有主機)。
第三部分小括號裡面的,為一些許可權選項。許可權說明:

rw :讀寫;
ro :只讀;
sync :同步模式,記憶體中資料時時寫入磁碟
async :不同步,把記憶體中資料定期寫入磁碟中
secure :nfs通過1024以下的安全TCP/IP埠傳送
insecure :nfs通過1024以上的埠傳送
no_root_squash:NFS客戶端連線服務端時如果使用的是root的話,那麼對服務端分享的目錄來說,
            也擁有root許可權。 顯然開啟這項是不安全的
root_squash:當客戶端登陸NFS的身份為root使用者時,將客戶端的root使用者及所屬組都對映為匿名使用者
            或使用者組(預設設定), 通常使用nobody或nfsnobody身份
subtree:若輸出目錄是一個子目錄,則nfs伺服器將檢查其父目錄的許可權(預設設定)。
no_subtree:即使輸出目錄是一個子目錄,nfs伺服器也不檢查其父目錄的許可權,這樣可以提高效率
no_all_squash :無論客戶端登陸NFS的身份為何,都將對映為root使用者(預設設定)
all_squash :不論NFS客戶端連線服務端時使用什麼使用者,對服務端分享的目錄來說都是擁有匿名使用者許可權;
anonuid:匿名使用者的UID值,通常是nobody或nfsnobody,可以在此處自行設定
anongid:匿名使用者的GID值

配置完成後,重新載入nfs配置(exportfs -rv)或重啟nfs服務。

exportfs [-aruv]
引數說明:
-a  全部掛載(或解除安裝)/etc/exports檔案內的設定
-r  重新掛載/etc/exports中的設定,此外同步更新/etc/exports及/var/lib/nfs/xtab中的內容
-u  解除安裝某一目錄
-v  在export時將共享的目錄顯示在螢幕上

例如:

[root@localhost /]# exportfs -rv
exporting 192.168.1.12:/nfs

客戶端

#CentOS系統客戶端
yum -y install nfs-utils

掛載NFS共享目錄

1、檢視showmount -e IP來檢視NFS共享狀態:

[root@localhost /]# showmount -e 192.168.1.11
Export list for 192.168.1.11:
/data 192.168.1.12

2、掛載NFS共享目錄

1)建立服務端共享目錄,例如:

mkdir /test

2)掛載目錄

#臨時掛載,即時生效
mount -t nfs -o nfsvers=3 192.168.1.11:/nfs /test

#配置永久掛載nfs檔案系統,儲存後重啟伺服器即可生效
$ vim /etc/fstab
$ 192.168.1.11:/data /test nfs defaults,nfsvers=3 0 0  

客戶端執行nfsstat -m命令,檢視當前所使用的nfs版本:

[root@localhost ~]# nfsstat -m
/data from 192.168.1.11:/data
 Flags:    rw,relatime,vers=3,rsize=262144,wsize=262144,namlen=255,hard,
 proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.1.60,mountvers=3,
 mountport=892,mountproto=udp,local_lock=none,addr=192.168.1.11

3)檢視掛載是否成功:

[root@localhost /]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 994M     0  964M   0% /dev
tmpfs                   100M  8.4M  962M   1% /run
/dev/mapper/centos-root  6.7G  3.5G  2.2G  53% /
/dev/sda1                497M  118M  350M  24% /boot
192.168.1.11:/nfs       6.2G  4.5G  1.2G  72% /test

常用命令

nfsstat

檢視NFS的執行狀態,對於調整NFS的執行有很大幫助:

nfsstat -s #檢視服務端的情況
nfsstat -c #檢視客戶端的情況

exportfs

啟動了NFS之後又修改了/etc/exports,使用exportfs命令來使改動立刻生效

rpcinfo

檢視rpc執行資訊,可以用於檢測rpc執行情況的工具

例項

例項一

服務端NFS配置:

#vi /etc/exports
/nfs  192.168.1.12(rw,sync,secure,no_root_squash,no_all_squash)

客戶端建立檔案:touch a,客戶端顯示如下:

[root@localhost test]# touch a
[root@localhost test]# ls -al 
total 4
drwxr-xr-x.  2 root root   15 Feb 24 20:52 .
dr-xr-xr-x. 19 root root 4096 Feb 24 20:51 ..
-rw-r--r--.  1 root root    0 Feb 24 20:52 a

服務端”/data”顯示如下:

[root@localhost /]# ls -al /data
total 0
drwxr-xr-x.  2 root root  15 Feb 24 20:52 .
dr-xr-xr-x. 18 root root 236 Feb 19 00:43 ..
-rw-r--r--.  1 root root   0 Feb 24 20:52 a

例項二

服務端NFS配置:

#vi /etc/exports
/data  192.168.1.12(rw,sync,secure,root_squash)

此時服務端”/nfs”的許可權:

[root@localhost /]# ls -al | grep nfs
drwxr-xr-x.   2 root root   15 Feb 24 20:52 nfs   

客戶端建立檔案:touch b,客戶端顯示如下:

[root@localhost test]# touch b
touch: cannot touch 'b': Permission denied

此時客戶端是不能建立,主要是因”/nfs”的許可權:所在組group和其他使用者other的許可權不能寫,需要修改許可權:

[root@localhost /]# chmod go+w /nfs
[root@localhost /]# ls -al | grep nfs
drwxrwxrwx.   2 root root   15 Feb 24 20:52 nfs

客戶端再次建立檔案:touch b,客戶端顯示如下:

[root@localhost test]# touch b
[root@localhost test]# ls -al 
total 4
drwxrwxrwx.  2 root      root        24 Feb 24 21:03 .
dr-xr-xr-x. 19 root      root      4096 Feb 24 20:51 ..
-rw-r--r--.  1 root      root         0 Feb 24 20:52 a
-rw-r--r--.  1 nfsnobody nfsnobody    0 Feb 24 21:03 b

服務端”/nfs”顯示如下:

[root@bogon /]# ls -al /nfs
total 0
drwxrwxrwx.  2 root      root       24 Feb 24 21:03 .
dr-xr-xr-x. 18 root      root      236 Feb 19 00:43 ..
-rw-r--r--.  1 root      root        0 Feb 24 20:52 a
-rw-r--r--.  1 nfsnobody nfsnobody   0 Feb 24 21:03 b

例項三

服務端NFS配置:

建立group和user 
# groupadd -g 1000 jason
# useradd -u 1000 -g jason -M -s /bin/bash jason
設定共享目錄許可權
setfacl -m u:jason:rwx /nfs

#vi /etc/exports
/data  192.168.1.12(rw,sync,secure,all_squash,,anonuid=1000,anongid=1000))

此時服務端”/nfs”的許可權:

[root@localhost /]# ls -al | grep nfs
drwxr-xr-x.   2 root root   15 Feb 25 12:41 data
[root@localhost /]# getfacl /nfs
getfacl: Removing leading '/' from absolute path names
# file: nfs
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

[root@localhost /]# setfacl -m u:jason:rwx  /nfs
[root@localhost /]# getfacl /data
getfacl: Removing leading '/' from absolute path names
# file: nfs
# owner: root
# group: root
user::rwx
user:jason:rwx #多出來一個使用者jason的許可權rwx
group::r-x
mask::rwx
other::r-x

備註:ACL(Access Control List),主要的目的是在提供傳統的 owner,group,others 的 read,write,execute 許可權之外的細部許可權配置
1)、setfacl可以更精確的控制權限的分配
2)、getfacl取得某個檔案/目錄的 ACL 配置專案

客戶端建立檔案:touch a,客戶端顯示如下:

[root@localhost test]# touch a
[root@localhost test]# ls -al
total 4
drwxrwxr-x.  2 root  root    15 Feb 25 12:39 .
dr-xr-xr-x. 19 root  root  4096 Feb 24 20:51 ..
#因客戶端也存在uid和gid為1000的jason,所以使用者和組都顯示為jason,否則顯示1000
-rw-r--r--.  1 jason jason    0 Feb 25 12:39 a 

服務端”/nfs”顯示如下:

[root@localhost nfs]# ls -al
total 0
drwxrwxr-x+  2 root  root   15 Feb 25 12:41 .
dr-xr-xr-x. 18 root  root  236 Feb 19 00:43 ..
-rw-r--r--.  1 jason jason   0 Feb 25 12:41 a