NFS(Network File System),即网络文件系统,普遍用于linux文件共享。在虚拟化场景中,也是一种重要的后端存储使用形式。目前NFS有三个版本,分别是NFSv2、NFSv3、NFSv4。V3拥有更多的特点,包括更快的速度、更大的单个文件大小、更多的排错的错误及成功信息,对TCP协议的支持等等。NFSV4提供了有状态的链接,更容易最终链接状态,增强了安全特性。centos7版本默认是使用v4版本提供网络文件系统共享服务,NFS监听在TCP2049。

 一、NFS服务器配置

NFS服务器的通过读取/etc/exports配置文件设定哪些客户端可以访问哪些NFS共享文件系统,该文件的书写原则如下:

    空白行将备忽略

    以#号开头的内容为注释

    配置文件中可以通过\符号进行换行

    每个共享的文件系统需要独立一行条目

    客户端主机列表需要使用空格隔开

    配置文件中支持通配符。

    一条完成的共享目录语法结构如下,其中,客户端主机可以是一个网段、单台主机或主机名

共享路径    客户端主机(选项)

    也可以为多个客户主机社会之不同的访问选项,语法结果如下:

共享路径    客户端1(选项) 客户端2(选项)

最简单的NFS配置可以仅给定一个共享路径与一个客户端主机,而不指定选项,没有选项时,NFS将使用默认设置,默认属性为ro,sync,wdela,no_root_squqash

功能属性如下

NFS选项 功能描述
ro 只读共享
sync 同步写操作
wdelay

延迟写操作

no_root_squash 不屏蔽远程root权限
rw 可读写共享
async 异步写操作
root_sqlush 屏蔽远程root权限
all_squash 屏蔽所有的远程用户权限

async选项 允许NFS服务器在没有完全把数据写入硬盘前就返回成功消息给客户端,而此时数据实际还存放在内存中。

sync选项 将确保在数据真正写入存储设备后才会返回成功消息。

wdelay为延迟写入,决定了先将数据写入内存,在写入硬盘,然后将多个写入请求合并后写入硬盘,可以减少对硬盘IO的次数,优化性能。
root_squash使得用户端使用root账号访问NFS时,服务器系统默认会自定将root映射为服务器本地匿名账号,通过anonuid可以指定匿名账号ID,默认为65534

no_root_squash可以保留root权限

all_squash选项则可以屏蔽所有账户权限,将所有用户对NFS的访问自动映射为服务器本地的匿名账户。

默认情况下是没有进行squash操作


NFS服务器配置,共享目录为/var/web/与/var/cloud,172.31.208.0/24网段的主机均可以读写访问web目录,且不屏蔽对root用户对web目录的访问权限,任何主机都可以同步只读访问/var/cloud目录

配置步骤为安装软件,添加共享账户,创建共享目录,修改权限,设置NFS共享配置文件以及启动共享服务

yum -y install nfs-utils rpcbind
useradd -u 1003 nfs
mkdir /var/{web,cloud}
chmod a+w /var/web
cat <> /etc/exports
> /var/web/ 172.31.208.0/24(rw,async,no_root_squash)
> /var/cloud/ * (ro,sync)
> EOF
systemctl restart nfs
systemctl enable nfs

二、客户端访问NFS共享

    客户端可以通过showmount命令来查看服务器共享信息,通过mount挂载NFS共享

    客户端挂载NFS服务器共享目录/var/web到本机/var/web,该目录可读可写,且root账号不会被映射为匿名账号(root的权限会被保留):

yum install -y nfs-utils
showmount -e 172.31.208.80

image.png

mkdir /var/web
useradd -u 1003 nfs
mount 172.31.208.80:var/web /var/web        #手动挂载
echo \>"172.31.208.80:/var/web /var/web nfs defaults 0 0">>/etc/fstab     #设置开机自动挂载
chmod a+w /var/web                           #给所有用户可读写权限
cd /var/web; touch root.txt                  #NFS目录写入文件
ll /var/web

image.png

su - nfs
cd /var/web
touch nfs.txt
ls -l

image.png


现在客户端挂载NFS服务器共享目录/var/cloud到本机/var/cloud目录,该目录为只读共享,默认root权限会自动映射为nfsnobody账号,普通账号权限将被保留

mkdir /var/cloud
mount 172.31.208.80:/var/cloud/ /var/cloud/
echo \>"172.31.208.80:/var/cloud /var/cloud nfs defaults 0 0">>/etc/fstab     #设置开机自动挂载
cd /var/cloud
touch root.txt                        #提示文件为只读

image.png

权限问题说明:

1)客户端使用普通用户链接服务器时,默认情况下,如果客户端使用的账户UID再服务器上也有相同的用户UID,则服务器将使用服务器本机上的该UID账户进行读写操作,如果客户端访问服务器所使用的账户UID不在服务器上,则服务器自动将账号转换为nobody账号,此外如果服务器对共享配置了all_squash选项,则服务器会根据anonuid选项的值,将所有账户自动转换为匿名账户

2)客户端使用root链接服务器时,默认会将root转换为服务器的上的nfsnobody账号,如果服务器端对共享属性配置了no_root_squash选项,则服务器将会将远程root账户转换为本机root账号进行读写操作

三、NFS高级设置

NFS所需的服务

centos7中提供NFS服务,提供了很多游泳的服务进程

nfs:NFS服务器主程序

nfslock:为NFS文件系统提供锁机制

rpcbind:提供地址与端口注册服务

rpc.mountd:该进程被NFS服务用来处理NFSv2与NFSv3的mount请求

rpc.nfsd:动态处理客户端请求

lockd:内核线程,在服务器端与客户端运行,用来实现NLM网络协议,运行NFSv2和NFSv3客户端对文件加锁

rpc.statd:该进程实现网络状态(NSM)协议

rpc.rquotad:该进程提供用户配额信息

rpc.idmapd:提供NFSv4名称映射,/etc/idmpad.conf必须配置


NFS客户端配置

若想客户端主机可以访问并使用服务器所提供的共享目录,可通过mount命令挂载 NFS共享,格式为

#mount -t nfs -o 选项 服务器主机:/服务器共享目录 /本地挂载目录

具体的挂载选项:

intr:当服务器宕机时允许中断NFS请求

nfserver=version:指定使用哪个版本NFS协议

noacl:关闭acl

nolock:关闭文件锁机制

port=num:指定NFS服务器端口号,默认num为0,此时如果远程NFS进程没有在rpcbind注册端口信息,则使用标准的NFS端口号(TCP 2049)

rsize=num:设置最大数据块大小调整NFS读取数据的速度,num单位为字节

wsize=num:设置最大数据块大小调整NFS写入数据的速度,num单位为字写

tcp:使用TCP挂载协议

udp:使用udp协议挂载


使用NFS命令工具

NFS软件提供了了命令工具

(1)exportfs

NFS启动时,/usr/sbin/exportfs命令会自动启动读取/etc/exports文件,通过控制rpc.mountd处理挂载请求,然后rpc.nfsd使用文件系统对远程主机可见,手动执行exportfs命令允许root在不重启NFS服务的情况下选择共享或者取消部分共享目录

选项 -r 重新读取/etc/exports文件

        -a 全部共享或者全部取消共享

        -u 取消共享,与-a 一起使用可以取消全部共享文件系统

        -v 显示详细信息

image.png

(2)nfsstat

查看NFS共享状态

-s,--server 不使用该参数时,默认显示服务器端与客户端状态,使用该参数后将仅显示服务器端状态

-c,--client仅显示客户端状态

-n,--nfs 仅显示客户端状态

-m 显示挂载信息

-l 列表形式显示信息


(3)rpcinfo

RPC信息报表

-m 显示指定主机rpcbind操作信息表

-p 显示指定主机RPC注册信息

-s 显示指定主机所有注册RPC信息程序,不指定时默认显示本机信息