Linux网络服务之NFS
NFS即网络文件系统,有sun公司开发的一种通过网络方式共享文件系统的通用共享解决方案。目前NFS共有三个版本,NFSV2,NFSV3,NFSV4。
NFSv2是一个古老的版本,但却被众多的操作系统所支持,所以兼容性比较好
NFSv3拥有更快的速度,更大的单个文件大小,更多便于排错的错误及成功的信息,对tcp协议的支持
NFSv4提供有状态的连接,更容易追踪连接状态,增强了安全特性。centos 6.3默认使用NFSv4
NFS监听在tcp 2049端口
NFS所需服务
nfs:NFS主程序
nsflock: 为NFS文件系统提供锁机制
rpcbind:提供地址与端口注册服务 由于主机之间通信时需要提供一些基本信息(ip地址,服务端口),这些信息都需要程序来管理,Linux下可以使用某个特定服务自己来管理,也可以委托给RPC(remote procedure call)来帮助管理。RPC是远程调用协议,RPC协议为远程通信程序管理通信双方的所需的基本信息,这样可以使NFS服务专注于如何提供共享数据,至于通信的的连接以及连接的基本信息,则全权委托给RPC管理,rpc协议是有rpcbind服务支持的,目前NFSv4虽然不需要与rpcbind直接交互,但是rpc.mounted依然是NFSv4所必需的服务。在centos 6中实现NFS共享,需要同时启动NFS和rpcbind服务。
rpmc.mounted:该进程被NFS服务用来处理NFSv2与NFSv3的mount请求
rpc.nfsd: 动态处理客户端请求
locked : locked 是内核线程,在服务器端与客户端运行,用来实现NLM网络协议,允许NFSv2与NFSv2客户端对文件进行加锁。
rpm.statd:该进程实现网络状态监控(NSM)协议
rpmc.rquotad:该进程提供用户配置信息
rpc.idmapd:提供NFSv4名称映射,/etc/idmapd.conf必须被配置
安装所需的软件 :nfs-utils rpcbind
NFS服务配置
NFS服务通过读取/etc/exports配置文件设定哪些客户端可以访问哪些NFS共享文件,文件有书写规则如下:
1.空白行将被忽略
2.以#符号开头的内容为注释
3.每个共享文件需要独立一行条目
4.客户端主机列表需要使用空格隔开
5.配置文件中支持通配符
语法
共享路径 客户端主机(可以是一个网段,单台主机或主机名)(选项)
共享路径 客户端主机1(选项) 客户端主机2(选项)
选项可以不指定,如不指定,NFS默认属性为ro sync wdelay root_squash,查看exports的帮助文档可以找到更多服务器配置模版
NFS选项(属性)示意图
async 选项允许NFS服务服务器在没有完全把数据写入硬盘前就返回成功消息给客户端,而此时数据实际还在存放在内存中,但客户端则显示数据已经写入成功。该消息只影响消息返回时间,并不决定写操作,sync选项将确保在数据真正写入存储设备后才会返回成功信息。
wdelay是先将数据写入内存,然后将多个请求合并后写入硬盘,这样可以减少I/O写入次数,但是服务器非正常关闭会引起数据丢失。以此相反的是no_wdelay,no_wdelay和async同时使用时不生效。
NFS默认屏蔽root用户,root_squash使得客户端使用root帐号访问NFS时,服务器默认自动将root映射为本地匿名帐号,通过anonuid可以制定匿名帐号ID,默认anonuid为65534,也就是nfsnobody帐号,使用no_root_squash可以防止这种映射而保留root权限,all_squash可以屏蔽所有用户权限,将所有的用户对NFS的访问都自动映射为服务器本地匿名账户,默认情况下,普通帐号的权限是保留的,也就是没有进行squash操作。
NFS安装
yum -y install nfs-utils rpcbind 安装
rpm -qa |grep nfs-utils 验证
rpm -qa |grep rpcbind
service nfs start
service rpcbind start
或 启动
/etc/init.d/rpcbind start
/etc/init.d/nfs start
chkconfig rpcbind on
chkconfig nfs on 设置开机启动
/etc/exports 配置
vi /etc/exports
/var/web/ 172.16.0.20(rw,async,no_root_squash)
客户端访问
客户端可以同showmount 命令查看服务器共享信息,通过mount挂载NFS共享,mount挂载属性很多,这些属性为我们提供了丰富的挂载特性和功能。
showmount -e 172.16.0.254
若想让客户端主机可以访问并使用服务器所提供的共享目录,可通过mount命令挂载NFS共享,格式如下
mount -t nfs -o 选项 服务主机:/服务器共享目录 /本地挂载目录
mount 192.168.19.129:/var/cloud /

由于共享数据实际是在NFS服务器上的,所以所有的操作实际是以服务器本机的账户进行的,只是服务器会根据不同的情况将远程客户端的访问账户转换为不同的服务器本机账户。
客户端使用普通用户连接服务器时,默认情况下,如果客户端使用的账户UID在服务器上也有相同的账户UID,则服务器将使用服务器本地上的该UID帐号进行读写操作,如果客户端访问服务器所使用的账户UID不再服务器上,则服务器自动将帐号转换为nobody帐号。如果服务器端对共享属性配置了all_squash选项,则服务器会根据anonuid选项的值,将所有的账户自动转换为匿名帐号。
客户端使用root连接服务器时,默认会将root转换为服务上的nfsnobody账户,如果服务器端对共享属性配置了no_root_squash选项,则服务器会将远程root账户转换为本机root账户进行读写操作。
NFS命令工具可以让我们在不重启服务的情况下,应用新的共享设置,查看NFS连接状态,查询实时的端口注册信息
exportfs命令
当nfs服务启动时,/usr/sbin/exportfs命令会自动启动并读取/etc/export文件,通过控制rpc.mountd(NFSv2或3)处理挂载请求,然后rpc.nfsd使文件系统对远程主机可见,手动运行exportfs命令允许root在不重启NFS服务的情况下选择共享或取消部分共享目录。
exportfs -r 重新读取/etc/exports 文件
-a 全部共享或全部取消共享
-u 取消共享,与-a 一起使用可以取消全部共享文件系统
-v 显示详细信息
nfsstat 查看共享状态
-s,--server 不使用该参数时,默认显示服务端与客户端状态,使用这个参数将显示服务器端状态 (服务器端)
-n,--nfs 仅显示客户端状态 (客户端查询)
-n n为数字2,3或4 仅显示NFS版本为n的状态信息 (客户端,服务器端)
-m 显示挂载信息(客户端)
-l 以列表形式显示信息(客户端服务端)
rpcinfo 生成rpc信息报表
-m 显示指定主机的rpcbind操作信息表(客户端,服务器端)
-p 显示指定主机rpc注册信息(客户端 服务器端)
-s 显示指定主机所有注册rpc的信息程序,不指定主机时默认显示本地信息(客户端,服务器端)
rpcinfo -p 127.0.0.1
rpcinfo -m 127.0.0.1
rpcinfo -s
固定端口和防火墙配置
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所用
常见问题
权限问题:当在/etc/exports配置文件中设置共享目录为可读写时,却忘记了修改相应系统层面的文件及目录权限,从而导致客户端实际挂载使用时无写权限,系统提示信息一般为permission denied,我们在对配置文件设置写权限后一定要记住修改相关目录,文件的权限。
rpcbind的问题
在没有启动rpcbind的情况下,启动nfs服务时系统会报错:NFS mountd rpc.rquotad rpc.nfsd 无法启动,因为这些服务依赖于rpcbind服务,这样需要先确保rpcbind启动后再开启nfs以及相关进程。通过rpcinfo -p可以查看基于RPC协议的服务是否成功与rpcbind通信,并注册信息。
兼容性问题
当客户端需要使用NFSv3版本挂载以满足兼容性要求时,需要使用nfserver选项设置特定的版本信息,并且在/etc/fstab开机自动挂载文件也需要进行相应的修改。
mount -o nfsvers=192.168.19.129:/var/web /var/web
修改/etc/fstab
192.168.19.254:/var/web /var/web nfs defaults,nfsvers=3 0 0
防火墙错误
系统提示mount:mount to NFS server'192.168.19.129em error:no route to host ,这说明nfs服务的默认端口2049被防火墙屏蔽,需要修改iptables开放2049端口

浙公网安备 33010602011771号