NFS详解(概念+实验演示)

工作端口111

Eichi_

于 2020-05-03 12:15:29 发布

8956
收藏 50
分类专栏: 服务器运维—Linux 文章标签: linux nfs
版权

服务器运维—Linux
专栏收录该内容
30 篇文章9 订阅
订阅专栏
目录

nfs共享存储 android nfs共享存储端口_shell脚本编程语言

 

 

NFS概念

一、NFS服务介绍

nfs共享存储 android nfs共享存储端口_数据_02

 

 

nfs共享存储 android nfs共享存储端口_客户端_03

 

 

1.1什么是NFS?

NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。

1.2NFS的文件传输

NFS这个服务器的端口开在2049,但由于文件系统非常复杂。因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据的端口是随机选择的,是小于1024的端口;既然是随机的那么客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现了.RPC服务(portmap 或rpcbind服务)

1.3什么是RPC服务?

RPC(Remote Procedure Call)即远程过程调用。RPC 最主要的功能就是在指定每个 NFS 功能所对应的 port number ,并且回报给客户端,让客户端可以连结到正确的port上去

 

 

二、NFS通讯原理

2.1RPC于NFS如何通讯?

由于NFS启用的功能相当多,所以对应的端口不固定,需要RPC来统一管理NFS端口,PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,让客户端可以连接到正常端口上去。

2.2RPC又是如何知道每个NFS功能的端口?

首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。

提示:在启动NFS SERVER之前,首先要启动RPC服务(即portmap服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。

特别注意:一般修改NFS主配置文件后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。具体往下看,后面有操作演示。

 

2.3什么是portmap?

功能:主要是把RPC程序号转化为Internet的端口号。

特点:只在第一次建立连接时候帮助网络应用程序找到正确的port,当双方正确连接时,端口就和应用绑定,portmap就无用。相当于媒婆、中介。

nfs共享存储 android nfs共享存储端口_RPC_04

 

 

nfs共享存储 android nfs共享存储端口_shell脚本编程语言_05

 

 图解通讯过程

 

nfs共享存储 android nfs共享存储端口_RPC_06

 

 

nfs共享存储 android nfs共享存储端口_shell脚本编程语言_07

 

 

1)首先服务器端启动RPC服务,并开启111端口

2)服务器端启动NFS服务,并向RPC注册端口信息

3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口

4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。

5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

nfs共享存储 android nfs共享存储端口_nfs共享存储 android_08

 

 

nfs共享存储 android nfs共享存储端口_数据_09

 

 

 

 

三、NFS的优缺点

3.1优点

a.节省本地存储空间将常用的数据存放在一台服务器可以通过网络访问

b.简单容易上手

c.方便部署非常快速,维护十分简单

3.2缺点

a.局限性容易发生单点故障,及server机宕机了所有客户端都不能访问

b.在高并发下NFS效率/性能有限

c.客户端没用用户认证机制,且数据是通过明文传送,安全性一般(一般建议在局域网内使用)

d.NFS的数据是明文的,对数据完整性不做验证

e.多台机器挂载NFS服务器时,连接管理维护麻烦

四、部署

4.1包安装

nfs-utils:NFS主程序

rpcbind:PRC主程序

 

4.2挂载常用参数

nfs共享存储 android nfs共享存储端口_shell脚本编程语言_10

 

 

nfs共享存储 android nfs共享存储端口_nfs共享存储 android_11

 

 

 

4.2.2 三种挂载方式:

  1. 手动挂载(临时挂载)
  2. 开机自动挂载
  3. autofs挂载(自动挂载)

网络文件系统NFS(1)-基本原理

基本原理

 

  1. 什么是NFS?全称 network file system 网络文件系统,它是通过网络存储和组织文件的一种方法或机制。
  2. 存储的种类三种存储方式:DAS(Direct Attach STorage)、SAN(Storage Area Network)、NAS(Network Attach Storage)三种存储类型:块存储、文件存储、对象存储

块存储

DAS和SAN都是块存储类型:

  • DAS(Direct Attach STorage):是直接连接于主机服务器的一种储存方式,每一台主机服务器有独立的储存设备,每台主机服务器的储存设备无法互通,需要跨主机存取资料时,一般需要一定的配置。通常用在单一网络环境下且数据交换量不大,性能要求不高的环境下。
  • SAN(Storage Area Network):是一种用高速(光纤)网络联接专业主机的一种存储方式,此系统会位于应用服务器的后端,使用高速I/O 连接, 如 SCSI、 Fibre- Channels。一般而言,SAN应用在对网络速度要求高、对数据的可靠性和安全性要求高、对数据共享的性能要求高的应用环境中,特点是代价高,性能好。但是由于SAN系统的价格较高,且可扩展性较差,已不能满足成千上万个CPU规模的系统。

文件存储

NAS产品一般就是文件存储。

NAS(Network Attached Storage),是一套网络存储设备,通常是直接连在网络上并提供数据存取服务,一套 NAS 储存设备就如同一个提供数据文件服务的系统,特点是性价比高。它采用NFS或CIFS命令集访问数据,以文件为传输协议,通过TCP/IP实现网络化存储,可扩展性好。如目前在集群计算中应用较多的NFS文件系统,但由于NAS的协议开销高、带宽低、延迟大,不利于在高性能集群中应用。

对象存储

对象存储最常用的方案,就是多台服务器内置大容量硬盘,再装上对象存储软件,然后再额外搞几台服务器作为管理节点,安装上对象存储管理软件。管理节点可以管理其他服务器对外提供读写访问功能。

之所以出现对象存储这种东西,是为了克服块存储与文件存储各自的缺点,发扬各自的优点。简单来说块存储读写快,不利于共享,文件存储读写慢,利于共享。能否弄一个读写块,利于共享的存储出来呢?于是就有了对象存储。具体内容到后面讲到ceph的时候我们再进一步了解。

  1. NFS工作原理NFS(Network File System)网络文件系统NFS功能,需要很多服务。每个服务都有端口,而且经常变化。如何让客户端找到这些端口呢?就需要一个经纪人(rpc服务)

NFS服务包含的内容:

1、NFS服务(有很多进程和端口),把自己的端口告诉RPC。

2、RPC服务(对外固定端口111)

NFS工作流程见下图:

nfs共享存储 android nfs共享存储端口_shell脚本编程语言_12

步骤详解:

第一步:启动RPC服务,这是NFS依赖的服务,必须先启动。

第二步:启动NFS服务。启动后会告诉RPC服务自己有哪些端口号可用。

第三步:客户端发起NFS服务请求。由于NFS服务的端口号不确定,所以NFS客户端需要先请求RPC服务(固定端口号111),RPC服务收到请求以后,会查询可用的端口号。

第四步:RPC查询到可用端口以后,会返回客户端一个可用的端口号。

第五步:客户端拿到端口号以后,就拿着这个端口号去请求NFS服务,实现数据读写。

我们再来看一个图,更进一步了解一下NFS工作流程(portmap是centos5以前的概念,现在是rpcbind):

nfs共享存储 android nfs共享存储端口_数据_13

优缺点说明

 

优点

  • 节省本地存储空间将常用的数据存放在一台服务器可以通过网络访问
  • 简单容易上手
  • 方便部署非常快速,维护十分简单

缺点

  • 局限性容易发生单点故障,及server机宕机了所有客户端都不能访问
  • 在高并发下NFS效率/性能有限
  • 客户端没用用户认证机制,且数据是通过明文传送,安全性一般(一般建议在局域网内使用)
  • NFS的数据是明文的,对数据完整性不做验证
  • 多台机器挂载NFS服务器时,连接管理维护麻烦(耦合度高)

至此为止,我们了解了NFS的工作流程,下一期我们开始实践。

 

 


 

NFS全面讲解(2)- 安装与配置


 

nfs共享存储 android nfs共享存储端口_数据_14


nfs共享存储 android nfs共享存储端口_数据_15

规划环境

nfs共享存储 android nfs共享存储端口_数据_15

 

nfs共享存储 android nfs共享存储端口_RPC_17

 

nfs共享存储 android nfs共享存储端口_数据_14


nfs共享存储 android nfs共享存储端口_数据_15

安装配置nfs server

nfs共享存储 android nfs共享存储端口_数据_15

 

[root@nfs ~]# yum -y install nfs-utils rpcbind
[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync)

#创建共享目录
[root@nfs ~]# mkdir /data
[root@nfs ~]# chown -R nfsnobody:nfsnobody /data
#启动服务
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl start nfs

# 配置开机自启动
[root@nfs ~]# systemctl enable rpcbind
[root@nfs ~]# systemctl enable nfs

# 列出所有在本机用rpcbind注册的RPC程序。
[root@nfs ~]# rpcinfo -p localhost
   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
    100024    1   udp 40663  status
    100024    1   tcp 53187  status
    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 33584  nlockmgr
    100021    3   udp 33584  nlockmgr
    100021    4   udp 33584  nlockmgr
    100021    1   tcp 42688  nlockmgr
    100021    3   tcp 42688  nlockmgr
    100021    4   tcp 42688  nlockmgr

# 确认服务启动成功且可用
[root@nfs ~]# showmount -e localhost
Export list for localhost:
/data 172.16.1.0/24

/etc/exports讲解

[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync)

解析:

第一个字段:/data,这里是待共享的目录,用来存放共享数据。将来客户端对数据的读写都是从这个目录里获取的。

第二个字段:可以访问的主机的网段。这里是允许172.16.1.0/24网段的主机访问

第三个字段:(注意:和网段之间不能有空格,网段之后直接写小括号)。这里是权限配置字段,详细情况见配置参数、挂载参数详解部分。

上面配置文件的含义:把服务器上的/data目录作为共享目录,为客户端提供数据存储和读写的内容。可以访问本目录的客户端包括172.16.1.0/24网段的所有客户端,客户端对该目录有读写的权限(rw),并且客户端写入数据的时候是同步把数据写到硬盘上,而不是仅仅写到缓冲区中。


NFS全面讲解(3)- 配置客户端、配置参数


nfs共享存储 android nfs共享存储端口_数据_15

配置客户端

nfs共享存储 android nfs共享存储端口_数据_15

 

[root@backup backup]# yum -y install nfs-utils rpcbind
[root@backup backup]# showmount -e 172.16.1.21    # 显示nfs上可共享的所有目录
Export list for 172.16.1.21:
/data 172.16.1.0/24

nfs共享存储 android nfs共享存储端口_数据_14


nfs共享存储 android nfs共享存储端口_数据_15

查看效果

nfs共享存储 android nfs共享存储端口_数据_15

 

我们先在本地挂载nfs:

# 把NFS挂载到本地/mnt下
[root@backup backup]# mount -t nfs 172.16.1.21:/data /mnt

查看远端的文件:

# 在服务端创建一个文件并写入内容
[root@nfs data]# echo abc > nfs_file1

# 在客户端查看刚才创建的文件
[root@backup ~]# cat /mnt/nfs_file1
abc # 这不正是我们刚写入的文件内容吗

 

nfs共享存储 android nfs共享存储端口_数据_14


nfs共享存储 android nfs共享存储端口_数据_15

服务进程说明

nfs共享存储 android nfs共享存储端口_数据_15

 

nfs共享存储 android nfs共享存储端口_RPC_29

/etc/exports配置参数讲解

参数

说明

rw、ro(重点)

rw,Read-Write,表示可读、可写权限。ro,Read-Only,表示只读权限

sync(重点)

有I/O操作时,都会同步处理I/O,即把数据同步写入磁盘,这种情况会牺牲一点I/O性能,但是,换来的是掉电后数据的安全性

async(重点)

和sync相反,I/O的操作都是异步处理,写入数据会先写入缓冲区,即不会同步写到磁盘,此参数会提高性能,但会降低数据的安全性,一般情况下,生产环境下不推荐使用,除非对性能要求很高。(解决办法:服务器主板电池或配置UPS)

all_squash(重点)

不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody帐号身份。在早期多个NFS 客户端同时读写NFS Server数据时,这个参数很有用。在生产中配置NFS 的重要技巧: 1) 确保所有客户端服务器对NFS共享目录具备相同的用户访问权限.  a.all_squash 把所有客户端都压缩成固定的匿名用户(UID相同)   b.就是anonuid,anongid 指定的UID和GID的用户。2) 所有的客户端和服务端都需要有一个相同的UID和GID的用户,即nfsnobody(UID必须相同)。

no_all_squash(默认)

访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组

anonuid(重点)

参数以anon*开头即指anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然也可以自行设置这个UID值。但是,UID必须存在于/etc/passwd 中。在多NFS Clients时,如多台Web Server共享一个NFS目录,通过这个参数可以使得不同的NFS Clients写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用,一般默认即可。

no_root_squash

访问NFS Server共享目录的用户如果是root的话,它对该共享目录具有root权限。这个配置原本是为无盘客户端准备的。用户应避免使用。

root_squash

如果访问NFS Server共享目录的用户时root,则它的权限将被压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody账号身份。

 


NFS全面讲解(4)

 

anonuid\anongid详解

 

配置文件中指定映射的用户id(默认是nfsnobody),即修改默认用户为用户指定的用户。

比如:指定NFS共享的匿名用户为www。

[root@nfs ~]# useradd www -u 6666
[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,anonuid=6666,anongid=6666,all_squash)

[root@nfs ~]# systemctl reload nfs
[root@nfs /]# chown -R www:www /data/

NFS的默认配置:

[root@nfs ~]# cat /var/lib/nfs/etab
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=6666,anongid=6666,sec=sys,rw,secure,root_squash,no_all_squash)

 

创建临时共享目录

 

创建临时共享目录就是在不修改nfs配置文件的情况下,新增加一个共享目录供客户端使用。

[root@nfs ~]# mkdir tmp
[root@nfs ~]# exportfs -o rw,sync 172.16.1.0/24:/root/tmp

# 客户端看一下
[root@backup ~]# showmount -e 172.16.1.21
Export list for 172.16.1.21:
/root/tmp     172.16.1.0/24
/data 172.16.1.0/24

下面我们来在客户端挂载这个临时目录:

[root@backup ~]# mount -t nfs 172.16.1.21:/root/tmp /tmp
[root@backup ~]# ls /tmp
ls: cannot open directory /tmp: Permission denied

我们发现上面报错了,提示没有权限。回想一下:我们创建tmp目录的时候是在root的家目录下,创建完成后,其所属的用户和用户组是root,nfs只有nfsnobody的权限,所以我们需要修改一下权限:

# 在服务端修改一下所属组
[root@nfs ~]# chown -R nfsnobody:nfsnobody /root/tmp

# 客户端验证一下是否可以访问了
[root@backup ~]# ls /tmp

课后项目实践:

- 在web01客户端实现挂载NFS

- 给NFS新建共享目录/data_log,允许web01和backup客户端对/data_log可读写

- web01客户端上传图片,backup客户端可以删除web01上传的图片

- NFS下面共享/data2,允许web01客户端访问

 

NFS全面讲解(5)-问题排查


服务端排查


 

  1. 检查相关服务有没有正确启动(nfs rpcbind)

 

[root@nfs data]# systemctl status rpcbind
[root@nfs data]# systemctl status nfs
[root@nfs data]# ps aux | grep rpcbind
rpc 4345  0.0  0.1  69256  1416 ? Ss 04:46   0:00 /sbin/rpcbind -w
root 4463  0.0  0.0 112808   968 pts/1    R+ 05:26   0:00 grep --color=autorpcbind
[root@nfs data]# ps aux | grep nfs
root 4390  0.0  0.0      0     0 ? S< 04:48   0:00 [nfsd4_callbacks]
root 4406  0.0  0.0      0     0 ? S 04:48   0:00 [nfsd]
root 4407  0.0  0.0      0     0 ? S 04:48   0:00 [nfsd]
root 4408  0.0  0.0      0     0 ? S 04:48   0:00 [nfsd]
root 4409  0.0  0.0      0     0 ? S 04:48   0:00 [nfsd]
root 4410  0.0  0.0      0     0 ? S 04:48   0:00 [nfsd]
root 4411  0.0  0.0      0     0 ? S 04:48   0:00 [nfsd]
root 4412  0.0  0.0      0     0 ? S 04:48   0:00 [nfsd]
root 4413  0.0  0.0      0     0 ? S 04:48   0:00 [nfsd]
root 4465  0.0  0.0 112808   964 pts/1    R+ 05:26   0:00 grep --color=autonfs

2. 检查nfs服务有没有相互结合

[root@nfs data]# rpcinfo -p localhost
   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
    100024    1   udp 40663  status
    100024    1   tcp 53187  status
    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 33584  nlockmgr
    100021    3   udp 33584  nlockmgr
    100021    4   udp 33584  nlockmgr
    100021    1   tcp 42688  nlockmgr
    100021    3   tcp 42688  nlockmgr
    100021    4   tcp 42688  nlockmgr

3.检查nfs服务配置文件是否生效

[root@nfs data]# showmount -e localhost
Export list for localhost:
/data 172.16.1.0/24

[root@nfs data]# cat /var/lib/nfs/etab
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)

进行本地挂载测试

mount -t nfs localhost:/data /mnt

 


客户端排查


 

1. 检查网络服务是否正常

# 检查nfs服务端111端口是否可以访问
[root@backup ~]# telnet 172.16.1.21 111
Trying 172.16.1.21...
Connected to 172.16.1.21.
Escape character is '^]'. # 出现这个就说明端口是可以访问的,即服务正常

2. 检查nfs服务有没有相互结合

rpcinfo -p 172.16.1.21

3.进行挂载测试

mount -t nfs 172.16.1.21:/data /mnt

问题1:共享目录挂载很卡原因分析:NFS重启后,立即挂载会出现此问题,因为NFS重启后,拥有一个90s的不可连接时间。配置如下:

[root@nfs data]# cat /etc/sysconfig/nfs
#NFSD_V4_GRACE=90
#NFSD_V4_LEASE=90
#NLM_GRACE_PERIOD=90

问题2:访问网段是否正确:

# 问题
[root@web01 ~]# mount -t nfs 10.0.0.21:/data2 /tmp
mount.nfs: access denied by server while mounting 10.0.0.21:/data2

[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync)
/data2 backup(rw,sync) # 只允许10.0.0.22连接,web01是10.0.0.14,所以无法连接


 

NFS全面讲解(6)-NFS配置文件、挂载参数


nfs共享存储 android nfs共享存储端口_RPC_30

 

nfs共享存储 android nfs共享存储端口_RPC_31

nfs共享存储 android nfs共享存储端口_数据_32

NFS相关文件说明

nfs共享存储 android nfs共享存储端口_数据_33

nfs共享存储 android nfs共享存储端口_客户端_34

 

NFS常用路径

说明

/etc/exports

NFS服务主配置文件,配置NFS具体共享服务的站点,默认内容为空。以行为单位。/data 172.16.1.0/24(rw,sync)

/usr/sbin/exportfs

NFS服务的管理命令。例如:可以加载NFS配置生效,还可以直接配置NFS共享目录,即无需配置/etc/exports实现共享.[root@nfs data]# /usr/sbin/exportfs -rvexporting 172.16.1.0/24:/data        # 加载配置生效,等价优雅重启/etc/init.d/nfs reload 这里有一个服务平滑重启的概念,即超市、银行到了关门时间了,但还是会继续提供服务给已经在门里的人,但是新来的就会被挡在门外了。网站服务平滑重启,是提升用户体验必须要考虑的。exportfs不但可以加载配置生效,也可以通过命令直接共享目录。越过/etc/exportfs,但是重启失效。

/usr/sbin/showmount

常用在客户端,查看NFS配置及挂载结果的命令。配置nfsserver,分别在服务器及客户端查看挂载情况。

/var/lib/nfs/etab

NFS配置文件的完整参数设定的文件(有很多没有配置但是默认就有的NFS参数)。

/proc/mounts

客户端挂载参数,这里包含本机所有的挂载点的挂载相关的参数。我们看一下nfs的挂载情况:[root@backup ~]# grep mnt /proc/mounts172.16.1.21:/data /mnt nfs4 rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.22,local_lock=none,addr=172.16.1.21 0 0

nfs共享存储 android nfs共享存储端口_RPC_31

nfs共享存储 android nfs共享存储端口_数据_32

挂载参数(mount -o)

nfs共享存储 android nfs共享存储端口_数据_33

nfs共享存储 android nfs共享存储端口_客户端_34

 

参数

说明

默认值

fg、bg

当在客户端执行挂载时,可选择是前台(fg)还是在后台(bg)执行。若在前台执行,则mount会持续尝试挂载,直到成功或挂载时间超时为止,若在后台执行,则mount会在后台持续多次进行mount,而不会影响到前台的其他程序操作。如果网络联机不稳定,或是服务器常常需要开关机,建议使用bg比较妥当。

fg

soft、hard

当NFS Client以soft挂载Server时,若网络或Server出现问题,造成Client和Server无法传输资料,Client就会一直尝试,直到timeout后显示错误才停止.若使用soft mount的话,可能会在timeout出现时造成资料丢失,故一般不建议使用。若用hard模式挂载硬盘时,刚好和soft相反,此时Client会一直尝试连线到Server,若Server有回应就继续刚才的操作,若没有回应NFS Client会一直尝试,此时无法umount或kill,所以常常会配合intr使用。这是默认值。

hard

intr、intr+hard

当时用hard挂载的资源timeout后,若有指定intr参数,可以在timeout后把它中断掉,避免出问题时系统整个被NFS锁死,建议使用intr。


rsize、wsize(性能参数)

读出(rsize)与写入(wsize)的区块大小(block size),这个设置值可以影响客户端与服务器端传输数据的缓冲存储量,一般来说,如果在局域网内(LAN),并且客户端与服务器端都具有足够的内存,这个值可以设置大一点,比如说65535(bytes),提升缓冲区块将可提升NFS 文件系统的传输能力。但设置的值也不要太大,最好以网络能够传输的最大值为限。

Centos6 默认值:rsize=131072 wsize=131072

proto=udp

使用UDP协定来传输资料,在LAN中会有比较好的性能。若要跨越Internet的话,使用proto=tcp多一些,传输的数据会有比较好的纠错能力。

proto=tcp

suid、nosuid

当挂载的文件系统上有任何SUID的程序时,只要使用nosuid就能取消设置SUID的功能。

suid

rw、ro

可以指定文件系统是只读(ro)或读写(rw)。

rw

auto、noauto

这个auto指的是“mount -a”时会不会被挂载的项目,如果不需要这个分区随时被挂载,可以设置为noauto

auto

user、nouser

是否允许用户进行文件的挂载与卸载功能,如果要保护文件系统,最好不要提供用户进行挂载与卸载。

nouser

atime(性能优化)

在每一次数据访问时,会同步更新访问文件的inode时间戳,是默认选项。在高并发的情况下,建议通过明确加上noatime,来取消这个默认选项,以达到提升I/O性能,优化I/O的目的。

atime

nodirname(性能优化)

不更新文件系统上的directory inode时间戳,高并发环境,推荐显示应用该选项,可以提高系统I/O性能。

 

注:查看客户端挂载参数

[root@backup ~]# cat /proc/mounts


 

NFS全面讲解(7)-开机自动挂载

文件系统的挂载应该在网络启动以后进行,但是fstab的启动是在网络启动之前进行,我们想要把开机自动挂载放在fstab里面,就需要nfs的挂载在fstab里面等待,等到网络启动之后再进行挂载(相当于fstab里的nfs挂载延后执行),这是就用到了一个服务:remote-fs.target:

[root@backup ~]# systemctl list-unit-files | grep rem
systemd-remount-fs.service                    static  
remote-cryptsetup.target                      disabled
remote-fs-pre.target                          static  
remote-fs.target                              enabled       # 默认开机启动了

[root@backup ~]# systemctl status remote-fs.target
● remote-fs.target - Remote File Systems
   Loaded: loaded (/usr/lib/systemd/system/remote-fs.target; enabled; vendor preset: enabled)
   Active: active since Thu 2022-01-27 00:31:01 CST; 17h ago    # 已经启动了
     Docs: man:systemd.special(7)

Jan 27 00:31:01 backup systemd[1]: Reached target Remote File Systems.

如果上面的remote-fs.target没有启动,就需要先启动这个服务并设置开机启动。然后:

[root@backup ~]# vim /etc/fstab


#
# /etc/fstab
# Created by anaconda on Wed Jan 19 08:24:30 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults        0 0
UUID=6d05ca32-1e8d-4966-955f-dc353450bb56 /boot xfs defaults        0 0
/dev/mapper/centos-swap swap swap defaults        0 0
172.16.1.21:/data                               /tmp nfs defaults,_netdev 0 0

注意:_netdev参数:为了防止nfs没有启动导致出现fstab不断尝试挂载,加上这个参数,当系统联网后再进行挂载操作,以免系统开机时间过长或开机失败。当然,也可以用soft参数,这个请自行测试练习。课后:开机自动挂载还有一个autofs工具,可以自行研究,这里抛砖引玉,不做详细说明,各字段含义请自行学习和使用:

# 在客户端
[root@backup ~]# yum -y install autofs

[root@backup ~]# vim /etc/auto.master
#
# Sample auto.master file
# This is a 'master' automounter map and it has the following format:
# mount-point [map-type[,format]:]map [options]
# For details of the format look at auto.master(5).
#
/misc /etc/auto.misc
/mnt /etc/auto.misc --timeout 90

[root@backup ~]# vim /etc/auto.misc

#
……
#e2floppy -fstype=ext2 :/dev/fd0
#jaz -fstype=ext2 :/dev/sdc1
#removable -fstype=ext2 :/dev/hdd
/data -fstype=nfs 172.16.1.21:/data


 

NFS全面讲解(8)-性能优化

通过一些参数,可以提升NFS性能:

  • atime
    在每一次数据访问时,会同步更新访问文件的inode时间戳,是默认选项。在高并发的情况下,建议通过明确加上noatime,来取消这个默认选项,以达到提升I/O性能,优化I/O的目的。
  • noatime
    访问文件时不更新文件的inode时间戳,高并发环境下,推荐应用该选项,可以提高系统的IO性能。
  • nodiratime
    不更新文件系统上的directory inode时间戳,高并发环境下,推荐应用该选项,可以提高系统的IO性能。

通过内核参数做一些优化:

在/proc/sys/net/core/下有一些参数可以用来优化nfs性能

  • rmem_default: 为TCP socket预留用于接收缓冲的内存默认值(单位:字节)
  • rmem_max: 为TCP socket预留用于接收缓冲的内存最大值(单位:字节)
  • wmem_default: 为TCP socket预留用于发送缓冲的内存默认值(单位:字节)
  • wmem_max: 为TCP socket预留用于发送缓冲的内存最大值(单位:字节)

 

[root@backup ~]# cat >>/etc/sysctl.conf<<EOF
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
EOF
[root@backup ~]# sysctl -p # 立即生效

另外,当系统出现只读时,可以通过如下命令临时解决:

mount -o remount,rw /

常用的挂载性能优化参数

两个工作中常用的优化挂载项实例:

1.禁止更新目录、文件时间戳挂载:

[root@backup ~]# mount -t nfs -o noatime,nodiratime 172.16.1.21:/data /data

2. 安全加优化的挂载方式:

[root@backup ~]# mount -t nfs -o nosuid,noexec,nodev,intr,noatime,nodiratime 172.16.1.21:/data /data

 

课后作业:- NFS共享的匿名用户改为你的名字,使客户端上传的图片的用户都是你的名字,而不是默认的nfsnobody- 在web01和web02服务器上挂载nfs- 给NFS新建共享目录/data_log,允许web01和web02客户端对/data_log可读写- web01客户端上传图片,web02客户端可以删除web01上传的图片- NFS下面共享/data2目录允许web01只读- 实现web01的开机自动挂载