NFS
简介
NFS(Network File System)即网络文件系统,是由Sun公司开发的一种通过网络方式共享文件系统的通用共享解决方案。目前NFS有三个版本,分别为:
NFSv2、NFSv3、NFSv4。NFSv2是一个古老的版本,但却被众多的操作系统所支持,这样他的兼容性会更好;NFSv3拥有更多的特点,包括更快的速度、
更大的单个文件大小、更多便于拍错的错误及成功信息、对TCP协议的支持等;NFSv4提供了有状态的连接,更容易追踪连接状态,增强了安全特性。CentOS6.3
版本默认使用版本4提供NFS网络文件系统共享,NFS监听在TCP2048端口
当两台计算机需要通过网络建立连接时,双方主机就一定需要提供一些基本信息,如:IP地址、服务端口号等,当有100台客户端需要访问某台服务器时,服务器
就需要记住这些客户端的IP地址以及相应的端口号等信息,而这些信息是需要程序来管理的。在Linux中,这样的信息可以由某个特定的服务自己来管理,也可以
委托给RPC(Remote Procedure Call)来帮助自己管理。RPC是远程过程调用协议,RPC协议为远程通信程序管理通信双方所需的基本信息,这样NFS服务就可以
专注于如何共享数据,至于通信的连接以及连接的基本信息,则全权委托给RPC处理,CentOS6.3系统由rpcbind服务提供RPC协议支持,目前NFSv4虽然不再需要
与rpcbind直接交互,但rpn.mountd依然是NFSv4所必须的服务。所以要在CentOS6.3上实现NFS共享,需要同时启动NFS与rpcbind服务
所需软件:nfs-utils、rpcbind
NFS配置
NFS服务器通过读取/etc/exports配置文件设定哪些客户端可以访问哪些NFS共享文件系统,该文件的书写原则如下:
- 空白行将被忽略
- 以#开头的内容为注释
- 配置文件中可以通过\转义换行
- 每个共享的文件系统需要独立一行条目
- 客户端主机列表需要使用空格隔开
- 配置文件中支持通配符
一条完整的共享条目语法结构如下,其中,客户端主机可以是一个网段、单台主机或主机名
共享路径 客户端主机(选项)
我们也可以为多个客户端主机设置不同的访问选项,结构如下:
共享路径 客户端主机1(选项) 客户端主机2(选项)...
最简单的NFS配置可以仅给指定一个共享路径和一个客户端主机,而不指定选项,因为没有选项时,NFS使用默认设置,默认属性为ro、sync、wdelay、root_squash。
具体的NFS属性及对应的含义见下表
NFS选项 功能描述
ro 只读共享
rw 可读可写共享
sync 同步写操作
async 异步写操作
wdelay 延迟写操作
root_squash 屏蔽远程root权限
no_root_squash 不屏蔽远程root权限
all_squash 屏蔽所有的远程用户权限
这些选项中,ro、rw比较容易理解,用来定义客户端访问共享时可以获得的权限是只读访问还是可读写访问。计算机对数据进行修改时会先将修改的内容写入快速的内存,
随后才会慢慢写入慢速的硬盘设备中,async选项允许NFS服务器在没有完全把数据写入硬盘前就返回成功消息给客户端,而此时数据实际还存放在内存中,但客户端则
显示数据已经写入成功。注意,此选项仅影响操作消息的返回时间,并不决定如何进行写操作,sync将确保在数据真正写入存储设备后才会返回成功信息。wdelay为延迟
写入选项。也就是说,它决定了现将数据写入内存,再写入硬盘,然后将多个请求合并后写入硬盘,这样可以减少对硬盘I/O的次数,从而优化性能,该选项可以优化NFS
性能但有可能导致非正常关闭NFS时数据丢失的情况发生。与之相反的是no_wdelay,但该选项与async选项一起使用时将不会生效,因为async是基于wdelay实现对客户端
的一种响应功能。默认情况下,NFS会自动屏蔽root用户的权限,root_squash使得客户端使用root访问NFS时,服务器系统默认会自动将root映射为服务器本机的匿名账户
通过anonuid可以指定匿名账户ID,默认anonuid为65534,也就是说nfsnobody账号,使用no_root_squash可以防止这种映射而保留root权限,all_squash选项可以
屏蔽所有的用户权限,将所有的用户对NFS的访问自动映射为服务器本地的匿名账户。默认情况下普通用户的权限是保留的。没有进行squash操作
下面我们通过案例来演示NFS服务器的搭建过程,服务器框架见下图,共享/var/web /var/cloud目录,172.16.0.20可以异步可读写访问web目录,
且不屏蔽root用户对web目录的访问权限,任何主机都可以同步只读访问/var/cloud目录。操作步骤主要包括:安装软件、添加共享账户、创建共享目录、修改权限、设置NFS
共享配置文件以及启动共享服务。

yum -y install nfs-utils rpcbind
rpm -qa | grep nfs-utils
rpm -qa | grep rpcbind
useradd -u 1003 jerry
mkdir /var/{web,cloud}
chmod a+w /var/web
cat /etc/exports

/etc/inid.d/rpcbind start
/etc/init.d/nfs start
chkconfig rpcbind on
chkconfig nfs on
客户端访问NFS共享
客户端可以通过showmount命令查看服务器共享信息,通过mount挂在NFS共享,mount挂载属性有很多,这些属性为我们提供了丰富的挂载特性与功能
client1主机挂载nfsserver共享目录/var/web至本机/var/web目录,该共享目录可以读写,且root账号不会被映射为匿名账号(root权限会被保留):
showmount -e 172.16.0.254

mkdir /var/web
useradd -u 1003 jerry
mount 172.16.0.254:/var/web /var/web #手动挂载
echo "172.16.0.254:/var/web /var/web nfs deafult 0 0" >> /etc/fstab #设置开机自动挂载
chmod a+w /var/web #给所有用户可写权限
cd /var/web;touch root.txt
ll /var/web

client2挂载使用NFS服务器的共享目录/var/cloud至本机/var/cloud目录,该目录为只读共享,默认root权限会自动映射为nfsnobody账号,普通账号权限保留
mkdir /var/cloud
useradd -u 1003 jerry
mount 172.16.0.254:/var/cloud /var/cloud
echo "172.16.0.254:/var/cloud /var/cloud nfs deafult 0 0" >> /etc/fstab #设置开机自动挂载
cd /var/cloud
touch root.txt #提示该文件系统只读

详细剖析权限问题,由于共享数据实际是存储在NFS服务器上的,所以所有的操作实际是以服务器本机的账户进行的,只是服务器会根据不同的情况将远程客户端的访问账户转换为不同的服务器本机账户。
- 客户端使用普通用户连接服务器时,默认情况下,如果客户端使用的账户UID在服务器上也有相同的账户UID,则服务器将使用本机上该UID账号进行读写操作,如果客户端访问服务器所使用的账户
UID不在服务器上,则服务器自动将账户转换为nobody账号。此外,如果服务器端对共享属性配置了all_squash选项,则服务器会根据anonuid选项的值,将所有的账户自动转换为匿名账号。 - 客户端使用root连接服务器时,默认会将root转换为服务器上的nfsnobody账号,如果服务器端对共享属性配置了no_root_squash选项,则服务器会将远程root用户转换为本机root用户进行读写操作
NFS高级设置
1、NFS所需服务
为了在CentOS6.3系统平台上提供NFS服务,该操作系统平台提供了很多有用的服务进程,以下进程在实现NFS共享的过程中需要相互协同工作。
- nfs:NFS服务器主程序
- nfslock:为NFS文件系统提供锁机制
- rpcbind:提供地址与端口注册服务
- rpc.mountd:该进程被NFS服务用来处理NFSv2与NFSv3的mount请求
- rpc.nfsd:动态处理客户端请求
- lockd:lockd是内核线程,在服务器端与客户端运行,用来实现NLM网络协议,允许NFSv2与NFSv3客户端对文件加锁
- rpc.statd:该进程实现网络状态监控(NSM)协议
- rpc.rquotad:该进程提供用户配额信息
- rpc.idmapd:提供NFSv4名称映射,/etc/idmapd.conf必须被配置
2、NFS客户端配置
若要想客户端主机可以访问并使用服务器所提供的共享目录,可通过mount命令挂载NFS共享,格式:
mount -t nfs -o 选项 服务器主机:/服务器共享目录 /本地挂载目录
具体挂载选项如下:
Intr:当服务器down机时允许中断NFS请求
nfsvers=version:指定使用哪个版本的NFS协议,version可以是2、3或4
noacl:关闭ACL,仅与老版本操作系统兼容时使用
nolock:关闭文件锁机制,仅用来连接老版本NFS服务器
noexec:在挂载的文件系统中屏蔽可执行的二进制程序
port=num:指定NFS服务器端口号。默认num为0,此时如果远程NFS进程没有在rpcbind注册端口信息,则使用标准NFS端口号(TCP2049端口)
rsize=num:设置最大数据块大小调整NFS读取数据速度,num单位为字节
wsize=num:设置最大数据块大小调整NFS写入数据速度,num单位为字节
tcp:使用TCP协议挂载
udp:使用UDP协议挂载
3、使用NFS命令工具
NFS软件还未我们提供了很多遍历的命令工具。这些工具可以帮助我们在不重启服务的情况下,应用新的共享设置,查看NFS连接状态,查询实时的端口注册信息
a、exportfs命令
描述:当nfs服务启动时,/usr/sbin/exportfs命令会自动启动并读取/etc/exports文件,通过控制rpc.mountd(如果使用NFSv2或NFSv3)处理挂载请求,
然后rpc.nfsd使文件系统对远程主机可见,手动运行exportfs命令允许root在不重启NFS服务的情况下选择共享或取消部分共享目录。
选项:-r 重新读取/etc/exports文件
-a 全部共享或全部取消共享
-u 取消共享,与-a一起使用可以取消全部共享文件系统
-v 显示详细信息
b、nfsstat命令
描述:查看NFS共享状态
选项:-s,--server 不使用该参数时,默认显示服务器端与客户端状态,使用该参数后将仅显示服务器端状态
-c,--client 仅显示客户端状态
-n,-nfs 仅显示NFS状态,默认显示NFS与RPC信息
-n n为数字2、3或4,仅显示NFS版本为n的状态信息
-m 显示挂载信息
-l 以列表形式显示信息
c、rpcinfo命令
描述:生成RPC信息报表
选项:-m 显示指定主机rpcbind操作信息表
-p 显示指定主机RPC注册信息
-s 显示指定主机所有注册RPC的信息程序,不指定主机时默认显示本机信息
4、在防火墙后端运行NFS
NFS需要向rpcbind动态注册端口信息,这将导致运行在防火墙后端的NFS服务器无法进行防火墙配置,因为端口信息是动态随机生成的,防火墙可以开放某些固定的
端口允许客户端进行连接,但无法设置随机端口规则。允许客户端访问位于防火墙后面的NFS共享需要我们编辑/etc/sysconfig/nfs配置文件,配置固定的端口号。注
意,端口号不可以指定为已经被其他程序使用的,固定的端口配置选项如下
- MOUNTD_PORT=端口号:设置mountd程序端口号
- LOCKD_TCPPORT=端口号:设置tcp的lockd程序端口号
- LOCKD_UDPPORT=端口号:设置udp的lockd程序端口号
- STATD_PORT=端口号:设置rpc.statd程序端口号
配置完固定的端口号之后,还需要对防火墙进行设置,需要为防火墙编写策略允许所有端口的数据通信。此外,还需要为NFS开启TCP与UDP的2049端口,以及TCP
与UDP的111端口,111端口被rpcbind所使用。
常见问题分析
1、权限问题
很多时候,当你在/etc/exports配置文件中设置共享目录为可读写时,却忘记了修改相应系统层面的文件及目录权限,从而导致客户端实际挂载使用时无写权限,系统信息
提示一般为"Permission denied",我们在对配置文件设置权限后一定要记住修改相关目录、文件的权限。
另外,客户端默认使用root访问NFS共享进行读写操作时,服务器会自动把root转换为本机的nfsnobody账号,这会导致root无法进行相应的操作,如果要保留root权限,则
需要在配置文件中添加no_root_squash选项
2、rpcbind问题
在没有启动rpcbind的情况下,启动NFS服务时系统报错:NFS mountd、tpc.rquotad、rpc.nfsd无法启动,因为这些服务器都依赖于rpcbind服务,这样就需要先确保
rpcbind启动后再开启NFS以及相关服务进程。通过rpcinfo -p可以查看基于RPC协议的服务是否成功与rpcbind通信,并注册信息
3、兼容性问题
在工作环境中,当客户端需要使用NFSv3版本挂载以满足兼容性需求时,则需要使用nfsvers选项设置特定的版本信息,并且在/etc/fstab开机自动挂载文件中也需要进行相应
的修改
mount -o nfsvers=3 172.16.0.254:/var/web /var/web
/etc/fstab文件书写格式为:
172.16.0.254:/var/web /var/web nfs defaults,nfsvers=3 0 0
4、挂载错误
系统提示No such file or directory没说明服务器上没有相应的挂载点目录,应检查确定目录名称是否正确。
5、防火墙错误
系统提示mount:mount to NFS server 172.16.0.254em Error:No route to host,这说明nfs服务器的默认端口2049倍防火墙屏蔽,需要修改iptables规则开放2049端口

浙公网安备 33010602011771号