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
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
su - nfs cd /var/web touch nfs.txt ls -l
现在客户端挂载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 #提示文件为只读
权限问题说明:
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 显示详细信息
(2)nfsstat
查看NFS共享状态
-s,--server 不使用该参数时,默认显示服务器端与客户端状态,使用该参数后将仅显示服务器端状态
-c,--client仅显示客户端状态
-n,--nfs 仅显示客户端状态
-m 显示挂载信息
-l 列表形式显示信息
(3)rpcinfo
RPC信息报表
-m 显示指定主机rpcbind操作信息表
-p 显示指定主机RPC注册信息
-s 显示指定主机所有注册RPC信息程序,不指定时默认显示本机信息