1. NFS服务介绍
1.1什么是NFS服务
NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样,也就是说客户端PC可以挂载NFS服务器所提供的目录并且挂载之后这个目录看起来如同本地的磁盘分区一样,可以使用cp、cd、mv、rm及df等与磁盘相关的命令。
1.2 NFS服务的优缺点
1.2.1优点
a.节省本地存储空间将常用的数据存放在一台服务器可以通过网络访问
b.简单容易上手
c.方便部署非常快速,维护十分简单
1.2.2缺点
a.局限性容易发生单点故障,及server机宕机了所有客户端都不能访问
b.在高并发下NFS效率/性能有限
c.客户端没用用户认证机制,且数据是通过明文传送,安全性一般(一般建议在局域网内使用)
d.NFS的数据是明文的,对数据完整性不做验证
e.多台机器挂载NFS服务器时,连接管理维护麻烦
2. NFS服务工作原理
下面给大家看一幅图
2.1 NFS原理简单介绍
NFS Server服务器上设定/data目录被分享,而客户端可以通过internet将/data目录挂载到本地的挂载点(常用mnt)后,客户端就可以进入挂载点目录进行文件的读写。NFS客户端所开放的端口是随机的我们不知道,那该怎么办呢?那是不是就不能进行数据传输了呢?答案当然是NO了那就需要另外一种服务帮他分配port了,服务是什么呢?那就是RPC服务了!想知道什么是RPC服务那就往下看啦~~~
2.2 RPC简单介绍
2.2.1什么是rpc服务
RPC(Remote Procedure Call)即远程过程调用。RPC 最主要的功能就是在指定每个 NFS 功能所对应的 port number ,并且回报给客户端,让客户端可以连结到正确的port上去。
2.2.2 RPC服务原理
a.执行顺序:1(注册端口)--à2(达成协议)-à3(直接建立联系)--à4(达成协议)--à5(建立连接)
b.那为啥rpc能够找到对应的port呢?这是因为当服务器在启动NFS时会随机取用数个port,并且主动的向RPC注册,因此RPC可以知道每个NFS的port对应的NFS功能,然后RPC又是固定使用port111来监听客户端的需求并汇报客户端的正确的port。
2.2.3 portmap
功能:主要是把RPC程序号转化为Internet的端口号。
特点:只在第一次建立连接时候帮助网络应用程序找到正确的port,当当双方正确连接时,端 口就和应用绑定,portmap就无用。相当于媒婆。
2.3NFS Server配置安装
2.3.1 yum安装nfs服务rpc服务
1
|
[root@nfsserver~]
# yum -y install nfs* #nfs*有nfs-utils、nfs-utils-lib、nfs-utils-lib-devel和nfs4-acl-tools
|
2.3.2 检查rpc服务和nfs服务是否安装并且安装成功
1
2
3
4
5
6
|
[root@nfsserver~]
# rpm -qa rpc* nfs*
nfs-utils-lib-1.1.5-11.el6.x86_64
nfs-utils-lib-devel-1.1.5-11.el6.x86_64
rpcbind-0.2.0-11.el6.x86_64
nfs-utils-1.2.3-64.el6.x86_64
nfs4-acl-tools-0.3.3-7.el6.x86_64
|
2.3.3 启动rpc服务和NFS服务(先启rpc服务,后启NFS服务)
1
2
3
4
5
6
7
|
[root@nfsserver/]
# /etc/init.d/rpcbind start
Startingrpcbind: [ OK ]
[root@nfsserver/]
# /etc/init.d/nfs start
Starting NFSservices: [ OK ]
Starting NFSmountd: [ OK ]
Starting NFSdaemon: [ OK ]
Starting RPCidmapd: [ OK ]
|
2.3.4 设置开机自启
1
2
3
4
5
6
|
[root@nfsserver/]
# chkconfig nfs on
[root@nfsserver/]
# chkconfig rpcbind on
[root@nfsserver/]
# chkconfig --list |grep -E "nfs|rpcbind"
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
nfslock 0:off 1:off 2:off 3:on 4:on 5:on 6:off
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
|
2.3.5配置共享目录/data(nfs配置文件时/etc/exports 默认是空的)
1
2
3
|
[root@nfsserver~]
# vim /etc/exports
#share /datafor nfsclient
/data192
.168.137.2
/10
(rw,
sync
, no_all_squash)
|
2.3.6 建立共享目录
1
|
[root@nfsserver ~]
# mkdir /data
|
2.3.7 平滑加载NFS服务并检查服务(shoumount -e localhost)
1
2
3
4
|
[root@nfsserver~]
# /etc/init.d/nfs reload
[root@nfsserver~]
# showmount -e localhost
Export list forlocalhost:
/data192
.168.137.2
/10
|
2.4 NFS Client 配置
2.4.1安装rpc服务
1
|
[root@nfsclient01 ~]
# yum -y installrpcbind
|
2.4.2 启动rpc服务并检查
1
2
3
4
5
|
[root@nfsclient01~]
# /etc/init.d/rpcbind start
Startingrpcbind: [ OK ]
[root@nfsclient01~]
# ps -ef| grep "rpc"
rpc 1208 1 0 13:38 ? 00:00:00 rpcbind
root 1212 1135 0 13:39 pts
/0
00:00:00
grep
rpc
|
2.4.3 设置开启自启并检查
1
2
3
|
[root@nfsclient01~]
# chkconfig rpcbind on
[root@nfsclient01~]
# chkconfig --list rpcbind
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
|
2.4.4 挂载并测试
挂载/data到/mnt目录下
1
|
[root@nfsclient01/]
# mount -t nfs 192.168.137.7:/data /mnt
|
大家注意了,如果是新的机子的话在这里可能会出现这样的一个error
1
2
|
mount
: wrong fstype, bad option, bad superblock on 192.168.137.7:
/data
,missing
codepage or helper program, orother error(
for
several filesystems (e.g. nfs, cifs)you might need a
/sbin/mount
.<
type
> helperprogram) In some cases useful info is found insyslog - try dmesg |
tail
or so
|
解决方法是安装一个nfs-utils之后再挂载一次就ok
1
2
|
[root@nfsclient01 /]
# yum -y installnfs-utils
root@nfsclient01 /]
# mount -t nfs 192.168.137.7:/data/mnt
|
最后,将挂载命令写进rc.local
3. NFS配置知识介绍
3.1 NFS 配置文件格式
3.1.1 NFS配置文件:/etc/exports(默认为空)
3.1.2/etc/exports格式
3.1.3 权限参数
权限参数类型 | 功能 |
rw | 可读写的权限 |
ro | 只读的权限 |
sync(同步) | 资料同步写入到内存与硬盘中(慢,不容易丢数据) |
async(异步) | 资料会暂存于内存当中,而不是写入硬盘(快,容易丢数据) |
no_root_squash | 客户端用root用户访问该共享文件夹时, root用户不会映射成匿名用户(极不安全,不建议使用) |
root_squash | 客户端用root用户访问该共享文件夹是,将root用户映射为匿名用户 |
all_squash | 不论登入NFS的使用者身份是谁,他的身份都会被压缩成匿名用户(nfsnobody) |
anonuid=xxx | 指定NFS服务器的匿名用户UID |
anongid=xxx | 指定NFS服务器的匿名用户GID |
insecure | NFS通过1024以上的端口发送 |
secure | NFS通过1024以下的安全TCP/IP端口发送 |
hide | 在NFS共享目录中共享其子目录 |
no_hide | 在NFS共享目录中共享其子目录 |
wdelay | 如果多个用户写入NFS目录,则归组写入(默认) |
no_wdelay | 如果多个用户写入NFS目录,则立即写入,当使用async时,无需此设置 |
subtree_check | 在共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认) |
no_subtree_check | 和上面相对,不检查父目录权限 |
3.2 NFS常用命令
命令 | 参数 | 含义 |
exportfs | -a | 递增式更新,对/etc/export增加或修改的部分进行挂载和卸载 |
-i<文件> | 指定配置文件 | |
-r | 更新配置重新读取/etc/exports | |
-u | 卸载指定的目录 | |
-o | 使用指定的参数 | |
-v | 显示共享详细情况 | |
showmount | -a或--all | 以host:dir 这样的格式来显示客户主机名和挂载点目录 |
-d或--directories | 仅显示客户端挂载的目录名 | |
-e或--exports | 显示NFS服务器输出清单 | |
-h或--help | 显示帮助信息 | |
-v或--version | 显示版本信息 | |
--no-headers | 禁止输出描述头部信息 | |
rpcinfo语法:rpcinfo –p [host];rpcinfo [-n port] –u |-t host program[version] | ||
rpcinfo | -p(probe,探测) | 列出所有在host用portmap注册的RPC程序,如果没有指定的host,就查找本地上的RPC程序 |
-n(port number,端口号) | 根据-t或者-u,使用编号为port的端口,而不是由portmap指定的端口号 | |
-u(UDP) | UDP RPC调用host上程序program的version版本,并报告是否接収到响应 | |
-t(TCP) | TCP RPC调用host上程序program的version版本(如果指定的话),并报告是否接收到响应 | |
-b(broadcast,广播) | 向程序program的version版本进行RPC广播,并列出响应的主机 | |
-d(delete,删除) | 将程序program的version版本从本机的RPC注册表中删除。只有root特权用户才可以使用这个选项 | |
mount(nfs) | -t | 指定设备的文件系统类型 |
-r | 以只读方式加载设备 | |
umount | -t | 仅卸除选项中所指定的文件系统 |
-r | 若无法成功卸除,则尝试以只读的方式重新挂入文件系统 |
3.3 NFS出问题解决方法及生产应用场景:
大中小型网站(2000wpv以下)线上应用,当web服务器少的时候,弃用nfS,同步数据到web服务器上(上传数据太快的话,同步延迟较大)
看配置是否有问题à看服务是否开启à挂载没反应à挂载没反应(看ping通?然后看telnet通不通)