Network File System(NFS)网络文件系统是由Sun公司开发的一种通过网络方式共享文件系统的通用共享解决方案。目前NFS有三个版本NFSv2、NFSv3、NFSv4。NFSv2是个古老的版本但却被广大的操作系统所支持,这样它的兼容性会更好,NFSv3拥有更多的特色,包括更快的速度、更大的单个文件大小、更多便于排错的错误及成功信息、对TCP协议的支持等,NFSv4提供了有状态的连接,更容易追踪连接状态、增强了安全特性,CentOS 6.3版本默认使用版本4提供NFS网络文件系统共享服务,NFS监听在TCP的2049端口。
当两台电脑需要通过网络连接时双方主机就一定需要提供一些基本信息,如:IP地址、服务端口号等,当有100台客户端需要访问某台服务器时,服务器就需要记住这些客户端的IP地址以及相应的端口号等信息,而这些信息的管理是需要程序来管理的,在Linux中这样的信息可以有某个特定服务自己来管理,也可以委托给别人来管理,NFS服务就不会自己管理这些信息,这样的信息NFS会委托给Remote Procedure Call(RPC)来帮助自己管理,RPC是远程过程调用协议,RPC协议为通讯程序之间管理通讯所需基本信息的管理工作,这样NFS服务就可以专注于如果共享数据,至于通讯的连接以及连接的基本信息则全权委托给RPC管理,CentOS 6.3系统有rpcbind[1]服务提供RPC协议的支持,目前NFSv4虽然不再需要直接与rpcbind直接交互,但rpc.mountd依然是NFSv4所必须的服务,所以如果在CentOS 6.3平台上实现NFS共享需要同时启动NFS与rpcbind服务。
所需软件:nfs-utils、rpcbind。
4.1.1 NFS服务器配置
NFS服务器通过读取/etc/exports配置文件决定哪些客户端可以访问哪些NFS共享文件系统,该文件的语法格式如下:
空白行将被忽略
以#符号开头的内容为注释
配置文件中可以通过\符号转义换行
每个共享的文件系统需要独立一行条目
客户端主机列表需要使用空格隔开
配置文件中支持通配符
一条完整的共享条目结构如下,客户端可以是一个网段、单台主机或主机名:
共享路径 客户端主机(选项) |
我们也可以为多个客户主机设置不同的访问选项,结构如下:
共享路径 客户端主机1(选项) 客户端主机2 (选项) … |
最简单的NFS配置可以仅给定一个共享路径与一个客户端主机而不指定选项,因为没有选项NFS将使用默认设置,默认属性为ro,sync,wdelay,root_squash。具体NFS属性及其对应含义见表4-1,查看exports的帮助文档可以找到很多服务器配置模版。
表4-1
NFS选项 |
功能描述 |
NFS选项 |
含义描述 |
ro |
只读共享 |
rw |
可读可写共享 |
sync |
同步写操作 |
async |
异步写操作 |
wdelay |
延迟写操作 |
root_squash |
屏蔽远程root权限 |
no_root_squash |
不屏蔽远程root权限 |
all_squash |
屏蔽所有远程用户权限 |
以上选项中ro与rw比较容易理解,用来定义客户端访问共享时可以获得的权限是只读访问还是可读写访问。计算机对数据进行修改会先将修改的内容写入快速的内存,随后才会慢慢写入慢速的硬盘设备中,async选项允许NFS服务器在没有完全把数据写入硬盘前就返回成功消息会客户端,而此时数据实际还存放在内存中,但客户端显示数据已经写入成功,该选项可以优化NFS性能,但有可能非正常关闭NFS时导致的数据丢失情况,sync选项将确保在数据真正写入存储设备后才会返回成功信息。wdelay延迟写入也就是说先将数据写入内存,这样可以将多个写入请求合并后再写入硬盘,这样可以减少对硬盘IO的次数从而优化性能,与此相反的选项是no_wdelay但该选项与async选项一起使用时不生效,因为async就是基于wdelay对客户端的回应功能。默认情况下NFS会自动屏蔽root用户的权限,root_squash使得客户端使用root帐号访问NFS时默认会而将root映射本地为匿名帐号,通过anonuid可以指定匿名帐号ID,默认anonuid为65534也就是nfsnobody帐号,使用no_root_squash可以防止这种转换而保留root权限,all_squash选项则可以屏蔽所有账户权限,将所用用户对NFS的访问自动映射为匿名账户,默认普通帐号的权限是保留的。
下面通过案例实际演示NFS服务器的搭建过程,服务框架见图4-1,共享/var/web/与/var/cloud目录,在该案例中172.16.0.0/16网段内的所有主机均可以异步可读可写访问web目录,任何主机都可以同步只读访问/var/cloud目录,且不屏蔽root用户对cloud目录的访问权限。
图4-1
- [root@nfsserver ~]# yum -y install nfs-utils rpcbind
- [root@nfsserver ~]# rpm -qa |grep nfs-utils
- nfs-utils-lib-devel-1.1.5-4.el6.x86_64
- nfs-utils-1.2.3-26.el6.x86_64
- nfs-utils-lib-1.1.5-4.el6.x86_64
- [root@nfsserver ~]# rpm -qa |grep rpcbind
- rpcbind-0.2.0-9.el6.x86_64
- [root@nfsserver ~]# useradd -u 1003 jerry
- [root@nfsserver ~]# mkdir /var/{web,cloud}
- [root@nfsserver ~]# chmod a+w /var/web
- [root@nfsserver ~]# cat /etc/exports
- /var/web/ 172.16.0.20(rw,async,no_root_squash)
- /var/cloud/ *(ro,sync)
- [root@nfsserver ~]# /etc/init.d/rpcbind restart
- [root@nfsserver ~]# /etc/init.d/nfs restart
- [root@nfsserver ~]# chkconfig rpcbind on
- [root@nfsserver ~]# chkconfig nfs on
4.1.2 客户端访问NFS共享
客户端可以通过showmount命令查看服务器共享信息,通过mount挂载NFS共享,mount挂载属性有很多为我们提供了足够多的挂载特性。
Client1挂载使用nfsserver共享目录/var/web至本机/var/web目录,该共享目录可以读写,且root帐号不会被映射为匿名帐号(root的权限会被保留):
- [root@client /]# showmount -e 172.16.0.254
- Export list for 192.168.0.254:
- /var/cloud *
- /home *
- /var/web 172.16.0.20
- [root@client1 ~]# mkdir /var/web
- [root@client1 ~]# useradd -u 1003 jerry
- [root@client1 ~]# mount 172.16.0.254:/var/web /var/web #手动挂载
- [root@client1 ~]# echo #设置开机自动挂载
- >“172.16.0.254:/var/web /var/web nfs defaults 0 0” >> /etc/fstab
- [root@client1 ~]# chmod a+w /var/web #给所有用户可写权限
- [root@client1 web]# cd /var/web ; touch root.txt
- [root@centos6 /]# ll /var/web/
- total 0
- -rw-r--r--. 1 root root 0 Mar 10 08:20 root.txt
- [root@client1 web]# su - jerry
- [root@client1 ~]# cd /var/web/
- [root@client1 web]# touch jerry.txt
- [root@client1 web]# ls -l
- total 0
- -rw-r--r--. 1 nfsnobody nfsnobody 0 Mar 9 23:12 root.txt #root被映射为nfsnobody
- -rw-rw-r--. 1 jerry jerry 0 Mar 9 23:21 jerry.txt #jerry为正常用户权限
Client2挂载使用nfsserver共享目录/var/cloud至本机/var/cloud目录,该目录为只读共享,默认root权限会自动映射为nfsnobody帐号,普通帐号权限将保留:
- [root@client2 ~]# mkdir /var/cloud
- [root@client2 ~]# useradd -u 1003 jerry
- [root@client2 ~]# mount 172.16.0.254:/var/cloud /var/cloud
- [root@client2 ~]# echo #设置开机自动挂载
- >“172.16.0.254:/var/cloud /var/cloud nfs defaults 0 0” >> /etc/fstab
- [root@client2 ~]# cd /cloud/
- [root@client2 cloud]# touch root.txt #提示该文件系统只读
- touch: cannot touch `root.txt': Read-only file system
详细剖析权限问题,由于共享数据实际是存储在NFS服务器上,所以所有的操作实际是以服务器本机的账户进行的,只是服务器会根据不同的情况将远程客户端的访问账户转换为不同的服务器本机账户:
l 客户端使用普通用户连接服务器时,默认如果客户端使用的账户UID在服务器上也有相同的账户UID,则服务器将使用服务器本机上该UID帐号进行读写操作,然而如果客户端访问服务器所使用的账户UID在服务器上没有,则服务器自动将帐号转换为nobody帐号。此外如果服务端对共享属性配置了all_squash选项,则服务器会根据anonuid选项的值,将所有账户自动转换为匿名帐号。
l 客户端使用root连接服务器时,如果默认会将root转换为服务器上的nfsnobody帐号,如果服务端对共享属性配置了no_root_squash选项,则服务器会将远程root账户转换为本机root帐号进行读写操作。
[1] rpcbind用来替换CentOS老版本中的portmap提供RPC协议服务。
http://manual.blog.51cto.com/3300438/1151551