NFS配置详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NFS配置详解相关的知识,希望对你有一定的参考价值。

  1. NFS服务介绍

????????? 1.1 什么是NFS?

???????? NFS是Network File System的缩写。中文意思是网络文件系统。它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或者目录。NFS客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点)。从NFS客户端的机器本地看,NFS服务器共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。

??????? NFS网络文件系统很想windows系统的网络共享、安全功能、网络驱动器映射,这也和linux系统里的samba服务类似。只不过一般情况,windows网络共享服务或者samaba服务于办公局域网共享。互联网中小网站架构后端常用NFS作为数据共享,如果是大型网站,那么可能还会用到更复杂的分布式文件系统,例如:Moosefs(mfs)、glusterfs,FastDFS。

1.2NFS应用场景

???????? 在企业集群架构的工作场景,NFS网络文件系统一般用来存储共享视频、图片、附件等静态资源文件,一般是把网络用户上传的文件都放在NFS共享里,例如:BBS产品的图片、附件、头像,注意网站BBS程序不要放在NFS共享里,然后前端所有的节点访问这些静态资源时都会读取NFS存储上的资源。NFS是当前互联网架构中最常见的数据存储服务之一,特别是中小网站公司应用频率最高。大公司或者门户除了使用NFS外,还可能会使用更复杂的分布文件系统Moosefs(mfs),glusterfs,FastDFS等。

1.3架构图


????????????? 技术分享图片

1.4 企业生产集群为什么需要共享存储角色

???????? 这里通过图解给大家集群架构需要共享存储服务的理由:例如:A用户传图片到Web1服务器,然后让B用户访问这张图片,结果B用户访问的请求分发到了Web2,因为Web2上没有这张图片,结果无法看到A用户上传的图片,如果此时有一个共享存储,A用户上传图片无论发到Web1还是Web2上,最终都存储到共享存储上,此时B用户访问图片时,无论分发到Web1,还时Web2上,最终也都会去贡献存储上去访问,这样就可以访问到资源了。这个共享存储的位置可以通过开源软件和商业硬件实现,互联网中小型集群架构会用普通PC服务器和NFS文件系统实现。

当没有NFS共享存储,用户访问图片的情况:

??????????? 技术分享图片

??????????? 有NFS共享存储,用户访图片的情况

?????????? 技术分享图片

2 NFS系统原理介绍:

2.1 NFS原理图

???????????? 技术分享图片

2.2 RPC服务

???????? NFS本身的服务没有提供文件传输的协议,但是NFS却能让我们进行文件的共享,其中的原因是NFS使用RPC协议。所以用到NFS的地方都需要启动RPC服务,不论是服务器端还是客户端,NFS和RPC的关系我们可以用下边这张图来理解。

????????? 技术分享图片

3 NFS部署环境准备

3.1 NFS服务部署服务器准备

??????????? 技术分享图片

3.2 检查模拟环境

[[email protected] ~]# cat /etc/redhat-release

CentOS release 6.6 (Final)

[[email protected] nfs]# uname -r

2.6.32-504.el6.x86_64

[[email protected] nfs]# uname -i

x86_64

3.3 修改服务器端客户端名字等信息

??? 3.3.1 nfs服务器端

?????????? [[email protected] ~]# hostname nfs-server

?????????? [[email protected] ~]# cat /etc/sysconfig/network

?????????? NETWORKING=yes????????????????????????????????????????

?????????? HOSTNAME=nfs-server????

?????????? [[email protected] ~]# cat /etc/hosts

?????????? 192.168.196.130 nfs-server

??? 3.3.2 nfs客户端

????????? [[email protected] ~]# hostname lamp01

????????? [[email protected] ~]# cat /etc/sysconfig/network

????????? NETWORKING=yes

????????? HOSTNAME=lamp01

????????? [[email protected] ~]# cat /etc/hosts

???????? 192.168.196.131 lamp01

????????? [[email protected] ~]# hostname lamp02

????????? [[email protected] ~]# cat /etc/sysconfig/network

????????? NETWORKING=yes

????????? HOSTNAME=lamp02

????????? [[email protected] ~]# cat /etc/hosts

????????? 192.168.196.128 lamp02

4 NFS SERVER端配置

4.1 NFS软件列表

要部署NFS服务,需要安装下面的软件包:

    • nfs-utils:NFS服务的主程序
    • nfs-utils-lib :NFS以来的库
    • rpcbind:Centos6.X下面RPC的主程序(CentOs5.X下面为portmap)

4.2 检查软件是否安装

??????? [[email protected] ~]# rpm -qa nfs-utils rpcbind

4.3 安装软件:

?????? [[email protected] ~]# yum install nfs-utils rpcbind

4.4 配置rpcbind

????? 我们配置NFS服务器的时候需要先配置好rpcbind,并且启动时候也要先启动rpcbind

???? 4.4.1 查看nfs-ser的运行状态(rpcbind)

???????????? [[email protected] ~]# /etc/init.d/rpcbind status

??? 4.4.2 启动rpcbind程序

??????????? [[email protected] ~]# /etc/init.d/rpcbind restart

4.4.3 将启动命令放置到/etc/rc.local开机启动脚本中

4.4.4 检查开机自启动(rpcbind)

[[email protected] ~]# chkconfig --list rpcbind

rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off

技术分享图片

4.4.5 设置开机自启动

[[email protected] ~]# chkconfig rpcbind on

4.4.6 检查rpcbind是否运行

[[email protected] ~]# /etc/init.d/rpcbind status

4.5 配置nfs主程序

4.5.1 查看nfs运行状态

[[email protected] ~]# /etc/init.d/nfs status

4.5.2 启动nfs主程序

[[email protected] ~]# /etc/init.d/rpcbind restart

注意:要保证rpcbind比nfs先启动,这里我们需要知道通过

[[email protected] ~]# less /etc/init.d/nfs和[[email protected] ~]# less /etc/init.d/rpcbind可以发现,就可以确定开机启动过程中他们启动的顺序。

4.5.3 将启动命令放置到/etc/rc.local开机启动脚本中

4.5.4 检查开机自启动(nfs)

[[email protected] ~]# chkconfig --list nfs

nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:of

4.5.5 设置开机自启动

[[email protected] ~]# chkconfig nfs on

4.5.6 检查nfs是否运行

[[email protected] ~]# /etc/init.d/nfs status

4.6 检查输出rpc信息

[[email protected] ~]# rpcinfo -p

4.7 配置NFS配置文件

4.7.1 NFS服务配置文件

NFS服务的默认配置文件路径为:/etc/exports,并且默认是空的。

[[email protected] ~]# ll /etc/exports

-rw-r--r--. 1 root root 0 Jan 12 2010 /etc/exports

4.8 配置文件格式

4.8.1 书写格式有两种

? NFS共享的目录 NFS客户端地址1(参数1,参数2……) 客户端地址2(参数1,参数2……)

? NFS共享的目录 NFS客户端地址(参数1,参数2……)

4.8.2 我们可以通过man exports查看帮助,man手册中有举例

[[email protected] ~]# man exports

技术分享图片

这里给出一种配置文件举例

技术分享图片

4.9 格式参数说明:

4.9.1 NFS共享的目录即就是NFS——SERVER端要共享的目录,这里是用data举例(首先准备共享的目录必须存在),

4.9.2 客户端地址我们可以用指定Ip的主机,指定子网中的所有主机、指定域名的主机、指定域名的所有主机、所有主机。具体我们来看下边表格。

方式

举例

指定Ip的主机

192.168.196.131

指定子网中的所有主机

192.168.196.0/24

192.168.196.*

192.168.196.0/192.168.196.0/24

(以上三种任意一个即可)

指定域名的主机

01.xiao_k.com

指定域名的所有主机

*.xiao_k.com

所有主机

*

4.9.3 参数用于指定访问权限等主要有三类,参数是可选的,具体看下边表格。

? 指定用户访问权限:

参数

作用

rw

设置共享目录读写权限

ro

设置共享目录只读权限

补充:只有这两种读写控制权限权限。

? 用户映射选项

参数

作用

root_squash

对于访问NFS Server共享目录的用户如果是root的话,则它的权限将被压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody帐号身份。Map requests from uid gid 0 to the anonymous uidgid.

no_root_squash

访问NFS Server共享目录的用户如果是root的话,它对该共享目录具有root权限。这个配置原本为无盘客户端准备的。用户应避免使用!Turn off root squashing. This option is mainly useful for

diskless clients

all_squash

不管访问NFSServer共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody帐号身份。在早期多个NFS客户端同时读写NFS Server数据时,这个参数很有用

no_all_squash

与all_squash取反(默认设置)

anonuid=xxx

将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx)

anongid=xxx

将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx)

? 其他选项

选项

作用

secure

限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置)

insecure

允许客户端从大于1024的tcp/ip端口连接服务器

sync

将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性。请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回。数据安全不会丢,缺点,性能比不启用该参数要差。

async

将数据先保存在内存缓冲区中,必要时才写入磁盘。请求或写入数据时,先返回请求,再将数据写入到内存缓存和硬盘中,即异步写入数据。此参数可以提升NFS性能,但是会降低数据的安全。因此,一般情况下建议不用,如果NFS处于瓶颈状态,并且允许数据丢失的话可以打开此参数提升NFS性能。

wdelay

检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置)

no_wdelay

若有写操作则立即执行,应与sync配合使用

subtree

若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置)

no_subtree

即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率

补充:以上就是选项,其中标红的是常用的。配置过程中可以组合使用,生产中常见使用如下配置:

技术分享图片

技术分享图片

4.10 检查配置文件语法是否正确

[[email protected] ~]# exportfs -rv

exporting 192.168.196.0/24:/data

4.11 配置文件权限信息:

配置完成后我们可以在下边文件中查看共享目录的信息

[[email protected] ~]# cat /var/lib/nfs/etab

技术分享图片

到这里NFS服务器端就配置成功了,我们这里就可以测试一下是否配置成功。

5 NFS CLIENT端配置

5.1 NFS软件列表

要部署NFS服务,客户端也需要需要安装下面的软件包:

? nfs-utils:NFS服务的主程序

? nfs-utils-lib :NFS以来的库

rpcbind:Centos6.X下面RPC的主程序(CentOs5.X下面为portmap)

5.2 NFS客户端的nfs和rpcbind服务配置过程和SERVER端过程一样。

这里不做具体阐述。

到这里我们的客户端已经启动了rpcbind服务(客户端不需要启动nfs服务,但是需要安装)。

5.3 检查rpcbind是否启动

[[email protected] ~]# /etc/init.d/rpcbind status

rpcbind (pid 1204) is running...

5.4 显示NFS服务器的安装信息

[[email protected] ~]# showmount -e 192.168.196.130

Export list for 192.168.196.130:

/data 192.168.196.0/24

5.5 NFS客户端挂载

5.5.1 挂载的格式

技术分享图片

5.5.2 建立挂载目录

[[email protected] ~]# mkdir -p /mnt/nfs

5.5.3 挂载

[[email protected] ~]# mount -t nfs 192.168.196.130:/data /mnt/nfs/

5.5.4 检查是否挂载成功

[[email protected] ~]# df -h

技术分享图片

[[email protected] ~]# mount

技术分享图片

5.5.5 将挂载信息写入/etc/rc.local脚本

[[email protected] ~]# cat /etc/rc.local

技术分享图片

到这里我们的NFS服务就配置完毕。

6 测试配置结果

6.1 检查客户端向nfs目录下写入文件是否可以。

到这里我们的配置还没有完成。我们在测试过程中会发现按照上边的权限,客户端不能向文件中写入内容。这里我们还需要配置一些文件。

7 补充配置(在NFS服务器SERVER端

7.1 配置说明

按照上边写的的NFS服务器端给的配置文件,我们只指定了读写权限、同步权限、和用户匿名映射权限。我们来看配置文件:

技术分享图片

查看配置参数的用户映射信息参数作用,我们就会知道,我们不管客户端使用什么身份访问就会将权限压缩为匿名用户劝降访问,也就是配置文件uid为65534的用户和gid为65534的用户组权限访问。所以就需要把该共享目录的属组改为65534的用户,甚至属组也改为65534。

7.2 配置

7.2.1 查看data的信息

[[email protected] nfs]# ls -ld /data

技术分享图片

7.2.2 查看这个用户是谁?

[[email protected] nfs]# grep 65534 /etc/passwd

技术分享图片

7.2.3 更改共享目录的属组

[[email protected] nfs]# chown -R nfsnobody /data

7.2.4 检查配置结果

[[email protected] nfs]# ls -ld /data

技术分享图片

到这里,就可以使用了。

8 常见配置错误

8.1 客户端没有装nfs/rpcbind程序

8.2 服务器端没有启动服务

8.3 客户端/服务器端防火墙没有关闭。

NFS服务一般用于内网,所以关闭掉防火墙没有多大影响,性能有很大提升。

8.4 服务器端启动顺序不正确(rpcbind必须比nfs启动早)。

8.5 排错思路:

8.5.1 ping 服务器ip是否通,不通检查是否与服务器在同一个局域网,自己网络是否配置好。

8.5.2 ping通的,telnet 服务器ip 端口号(111)检查端口是否开。

技术分享图片

出现上边信息说明正确。否则检查端口号。

如果信息正确,还是挂载失败,检查防火墙患有selinux是否关闭。

9 NFS优化

9.1 硬件优化

配置NFS配置服务器时尽可能的选择:

sas/ssd硬盘,买多块,raid0/raid10。网络吞吐量要大,至少千兆(多块bond)

9.2 NFS服务器端配置

[[email protected] ~]# cat /etc/exports

/data 192.168.196.0/24(rw,sync,all_squash)

9.3 NFS客户端挂载:risise、wsize、noatime、nodirtime、nosuid、noxexc、soft(hard,intr)

[[email protected]~]#mount -t nfs -o nosuid,noexec,noatime,nodiratime,rsize=131072,wsize=131072 192.168.196.130:/data /mnt/nfs

[[email protected] ~]# mount -t nfs -o noatime,nodiratime,rsize=131072,wsize=131072 192.168.196.130:/data /mnt/nfs

[[email protected] ~]# mount -t nfs -o noatime,nodiratime 192.168.196.130:/data /mnt/nfs

9.4 有关NFS服务的所有服务器内核优化

技术分享图片

10 补充

10.1 NFS客户端可写的服务端配置条件

当多个NFS客户端以NFS方式写入修改服务器端的文件系统时,需要具有以下个权限:

a) NFS服务器/etc/exports设置需要开放可写入的权限,即服务端的共享权限

b)?? NFS服务器实际要共享的NFS目录权限具有可写入w的权限,即服务端本地目录的安全权限,

c) 每台机器都对应存在和nfs默认配置UID的相同UID 65534的nfsnobody用户(确保所有客户端的访问权限统一,否则每个机器需要同时建立相同用UID的用户,并覆盖NFS的默认配置)。

当满足上述三个条件,多个NFS客户端才能具有互相写入,互相修改其他主机写入文件的权限,这在开篇讲解过的大规模集群环境,作为集群共享存储时尤为注意。

到这步为止,NFS服务端一个NFS共享目录/data共享给10.0.0.0/24 内主机可读写就配置完了。下面还需要在客户端主机挂载服务端共享的/data,才可以在客户端真正读写到该共享目录。

10.2 NFS与挂载优化

10.2.1 挂载的格式

技术分享图片

10.2.2 mount优化

下边是mount -o参数对照表

参数

参数意义

系统默认值

suid

nsuid

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

suid

rw

ro

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

rw

dev

nodev

是否可以保留装置文件的特殊功能?一般来说只有dev才具有特殊装置,因此可以选择nodev

dev

exec

nexec

是否具有执行文件的权限?如果想要挂载的仅是普通资源数据区(例如:图片、附件),那么可以选择nexec

exec

user

nouser

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

nouser

auto

noauto

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

auto

rsize

wsize

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

CentOs5.x默认:rsize-1024

wsize:1024

CentOs6.x:默认rszie:131072

wsize:131072

10.2.3 NFS客户端mount挂载优化

某网友问:在企业生产环境中,NFS客户端挂载有没有必要加参数,比如加noexec、nosuid、nodev. bg、soft. rsize、 wsize 等参数, 我看书上说建议挂,rsize,wsize 这两个是缓存参数,是否也建议加呢?老师你在生产环境中是怎么做的?
解答:这个问题属于mount挂载优化内容(有些参数也适合其它文件系统),一般来.说要适当加挂载参效,但是,最好是做好测试,用数据来说话,到底是挂我还是不挂载。

10.2.3.1 有关系统安全挂载参数选项

在企业工作场景,一般来说,NFS服务器共享的只是普通静态数据(图片、附件、视频), 不需要执行suid、exec 等权限,挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来讲增加了安全性,例如:很多×××篡改站点文件都是由上传入口上传的程序到存储目录,然后执行的。 因此在挂载的时候,用下面的命令很有必要:

安全挂载参数:

[[email protected] ~]# mount -t nfs -o nosuid,noexec,noatime,rw 192.168.196.130:/data /mnt/nfs

通过mount -o指定挂载参数和在/etc/fstab里指定挂载参数效果时一样的。网络文件系统和本地文件系统效果是一样的。

10.2.3.2 mount 挂载性能优化参数选项

? 禁止更新目录及文件时间挫挂载

[[email protected] ~]# mount -t nfs -o noatime,nodiratime 192.168.196.130:/data /mnt/nfs

? 安全加优化的挂载方式

[[email protected]~]#mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 192.168.196.130:/data /mnt/nfs

? 默认挂载方式

[[email protected]~]#mount -t nfs 192.168.196.130:/data /mnt/nfs

注意:以具体业务需要实际测试选择挂载参数

10.2.4 NFS内核优化相关建议

NFS内核优化相关建议

优化说明:

技术分享图片

上述文件对应的具体的优化命令:

cat >>/etc/sysctl.conf<<EOF

net.core.wmem_default = 8388608

net.core.remem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

EOF

执行sysctl -p生效

10.2.5 如果卸载的时候提示:umount:/mnt/nfs:device is busy

需要退出挂载目录再进行卸载,或者是NFS Server宕机了,需要强行卸载,则是使用下边命令解决:

[[email protected]~]#umount -lf /mnt/nfs

10.2.6 大型网站NFS网络文件系统替代软件:

分布式文件系统Moosefs(mfs)、glusterfs,FastDFS。

11 NFS系统应用的优缺点说明

11.1 作用

NFS服务可以让不同的客户端挂载使用同一个目录,作为共享存储使用,这样可以保证不同节点客户端数据的一致性,在集群架构环境中经常会用到。如果windows +Linux可以用samba。

11.2 优点

? 简单->容易上手,容易掌握。

? NFS文件系统内数据是在文件内数据是在文件系统之上的,即就是数据看的见。

? 方便->部署快捷,维护简单,可控且满足需求就是最好的。

? 可靠->从软件层面上看,数据可靠性高,经久耐用。数据是在文件系统之上的。

? 稳定->非常稳定

11.3 局限

? 局限性是存在单点故障,如果nfs server宕机了所有客户端都不能访问共享目录。通过负载均衡弥补解决。

? 在大数据并发的场合,NFS效率、性能有限(一般几千万一下PV的网站不是瓶颈,除非网站架构太差,2千万PV/日)。

? 客户端认证时基于ip和主机名的,权限是根据id识别,安全性一般(用于内网则问题不大)。

? NFS数据是明文的,NFS本身对数据完整性不做验证。

? 多台客户机挂载一个NFS服务器时,连接管理维护麻烦(耦合度高)。尤其NFS服务端出问题以后,所有的NFS客户端都挂掉状态(测试环境可以使用autofs自动挂载解决)。

这里涉及到同步(实时等待)和异步(解耦)概念知识,NFS服务系端和客户端来说就是耦合度有些高。系统及程序员架构师的重要职责就是为程序及架构解耦,让网站的扩展性变更好。大中小型网站(2000万PV以下)线上应用,都有用武之地。门户网站也有应用。

以上是关于NFS配置详解的主要内容,如果未能解决你的问题,请参考以下文章

搭建nfs共享存储服务之二nfs服务端配置语法及配置实战详解

nfs原理详解及配置

NFS服务器原理和安装配置详解附案例演练

DRDB安装配置详解+NFS(Mysql)+Heartbeat高可用实例配置-任志远

DRDB安装配置详解+NFS(Mysql)+Heartbeat高可用实例配置-任志远

Linux NFS服务器的安装与配置详解