NFS(Network File System) 中文名为网络文件系统, 是由Sun公司开发的, 一种通过网络的方式共享文件系统的通用解决方案, 通过挂载后, 可以像在本机上操作.默认端口为2049/tcp
RPC(Remote Procedure Call) 即远程过程调用协议, 它是一种通过网络从远程计算机程序上请求服务, 而不需要了解底层网络技术的协议. NFS就是通过RPC协议与另一台(多台)计算机建立连接, 默认端口111
搭建之前
因为需要RPC协议的支持, 则需要rpcbind服务(注: 在之前CentOS版本中, 是需要安装portmap的, 从CentOS6后, 就由rpcbind代替了)
准备工作:
- 两台服务器(这里指笔者在虚拟机(均为CentOS6.8)中完成. test1(1#)为服务端(ip:192.168.44.127); test2(2#)为客户端(192.168.44.128))
- 软件nfs-utils(安装nfs-utils时会自动安装rpcbind)
服务端部署过程
1. 安装nfs-utils
# yum install -y nfs-utils
# rpm -qa | grep -E "nfs-utils|rpcbind"
显示如下则安装成功:
nfs-utils-1.2.3-70.el6_8.2.x86_64
rpcbind-0.2.0-12.el6.x86_64
nfs-utils-lib-1.1.5-11.el6.x86_64
2. 编辑配置文件/etc/exports
在/etc/exports
添加一行(配置过程中需注意每一个共享文件必须独立一行)
权限选项详解:
选项 | 说明 |
---|---|
ro | 只读 |
rw | 可读可写 |
sync | 同步, 把内存中的数据实时写入磁盘中 |
async | 不同步, 把内存中的数据定时写入磁盘中 |
root_squash | 限制远程root的权限, 使其只有普通用户的权限 |
no_root_squash | 不限制远程root的权限,使其拥有至高的权限(不推荐使用) |
all_squash | 限制所有远程用户的权限 |
anonuid/anongid: 指定使用NFS的用户限定后的uid/gid(该选项需与root_squash
和all_squash
一起使用, 并且本机上存在uid/gid对应的用户或组)
- 创建一个uid为1000的用户nfstest
# useradd -u 1000 nfstest
- 编辑配置文件
# vim /etc/exports
/root/test/ 192.168.44.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
保存退出.
3. 启动服务
1# /etc/init.d/rpcbind start
1# /etc/init.d/nfs start
若如上提示则表示服务端已完成配置
4. 服务端常见操作
- 查看RPC服务的注册状况
rpcinfo
用法: rpcinfo [-psmtu]
选项 | 说明 |
---|---|
p | 显示指定主机RPC注册信息(rpcinfo [选项] ip) |
s | 显示指定主机所有注册RPC的信息程序(同上) |
m | 显示指定主机rpcbind操作信息表(同上) |
t/u | 针对指定主机的某个程序检查其TCP/UDP数据包所在软件版本(rpcinfo [选项] ip 程序名) |
- 共享资源的日志文件
/var/lib/nfs/etab
: 主要记录了NFS的共享目录的完整权限设置值./var/lib/nfs/xtab
: 主要记录了曾经连接到该服务端的客户端的数据.
- 服务端维护命令
exportfs
用法: exportfs [-aruv]
选项 | 说明 |
---|---|
a | 全部挂载/卸载 |
r | 重新挂载 |
v | 将共享目录可视化 |
u | 卸载某个目录 |
客户端访问NFS共享目录
在客户端可以通过showmount命令
来查看服务端共享的相关信息, 通过mount命令
来挂载NFS共享目录
1. 查看共享目录
2# showmount -e 192.168.44.127
可以看到服务端共享了什么目录,
接下来我们就在客户端上挂载该目录2# mount -t nfs -o nfsvers=3 192.168.44.127:/root/test/ /root/share/
注: -0 nfsvers 指定nfs的版本(version可以为2, 3, 4)2# dh -h
接下来我们创建一个uid为1000的用户cli_tester2# useradd -u 1000 cli_tester
此时进入/root/share
新建一个文件2# touch test.txt
执行touch
命令可以用ls -l
看到如下的属主与属组: (因为客户端上只创建了uid为1000的用户,而没有创建gid为1000的组, nfs默认的为nfsnobody帐号)
2. 客户端常见操作
- mount命令
mount
命令有一个-o
的选项, 对应的有多个参数,如下:
参数 | 说明 | 默认值 |
---|---|---|
suid/nosuid | 当共享目录中有任何SUID的程序时,只要使用nosuid就能取消SUID的功能. | suid |
rw/ro | 这参数可以指定共享目录中的文件在本机上的读写权限 | rw |
dev/nodev | 是否保留设备文件的特殊功能(一般选择nodev) | dev |
exec/noexec | 是否具有执行文件的权限(一般选择noexec) | exec |
user/nouser | 是否允许用户进行文件的挂载/卸载操作 | nouser |
auto/noauto | 指定使用命令mount -a 时, 是否被挂载 |
auto |
特殊的挂载参数: | ||
fg/bg | 决定执行挂载时,该行为是在前台还是后台执行(如果网络不稳定,或者服务器时常需要开关机, 建议使用bg) | fg |
rsize/wsize | 读写的区块大小, 通常在服务器端和客户机端的内存允许的情况下可以尽可能大些,可以提升NFS的传输能力 | rsize=1024;wsize=1024 |
soft/hard | 如是hard, 则客户端和服务端任一宕机, RPC会持续呼叫, 直至对方恢复;而soft则是RPC在timeout后重复呼叫, 而不会持续.(如果网络不稳定,或者服务器时常需要开关机, 建议使用soft) | hard |
intr | 当服务器宕机时允许终端NFS请求 | 无 |
NFS的安全与优化
固定RPC相关程序的端口号, 制定合理的iptables规则
一般地, NFS服务要向rpcbind动态注册端口信息, 这会导致很难定制防火墙规则, 因为端口信息是由系统随机生成的.
然而CentOS6以后的版本中系统提供了固定NFS服务的端口配置文件/etc/sysconfig/nfs
. 可以通过该文件可以固定端口号
主要要固定的RPC服务有mountd
、rquotad
、nlockmgr
、statd
12345RQUOTAD_PORT=port # 设置rquotad程序端口号LOCKD_TCPPORT=port # 设置tcp的rpc.lockd的端口号LOCKD_UDPPORT=port # 设置udp的rpc.lockd的端口号MOUNTD_PORT=port # 设置rpc.mountd的端口号STATD_PORT=port # 设置rpc.statd的端口号使用
/etc/exports
设置更加合理、安全的权限
尽量使用root_squash
、all_squash
与anonuid/anongid
来规范用户身份正确关闭NFS服务器
切忌直接关机, 在关机之前,应先停掉rpcbind,nfs这两个deamon.
在NFS服务端,可以使用showmount -a localhost
来查看哪些客户端处于连接状态
也可以查看/var/lib/nfs/rmtab
文件来检查
遇到的错误
- lnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
RPC端口映射失败:无法接收(没有路由到主机)
解决办法:- 然后清空iptables:
iptables -F
- 然后清空iptables:
- touch: 无法创建”test.txt”: 权限不够
解决办法:- 这是因为在服务端没有给共享的目录
w写
权限, 解决办法: 在服务端上执行chmod a+w /root/test
- 这是因为在服务端没有给共享的目录