Tao's Blog

Linux常见服务部署与优化之NFS

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添加一行(配置过程中需注意每一个共享文件必须独立一行)

1
共享目录 客户端主机(可以是一个IP或者一个IP段) [多个客户端主机] (权限选项)

权限选项详解:

选项 说明
ro 只读
rw 可读可写
sync 同步, 把内存中的数据实时写入磁盘中
async 不同步, 把内存中的数据定时写入磁盘中
root_squash 限制远程root的权限, 使其只有普通用户的权限
no_root_squash 不限制远程root的权限,使其拥有至高的权限(不推荐使用)
all_squash 限制所有远程用户的权限

anonuid/anongid: 指定使用NFS的用户限定后的uid/gid(该选项需与root_squashall_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
正在启动 rpcbind: [确定]

1# /etc/init.d/nfs start

1
2
3
4
启动 NFS 服务: [确定]
启动 NFS mountd: [确定]
启动 NFS 守护进程: [确定]
正在启动 RPC idmapd: [确定]

若如上提示则表示服务端已完成配置

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

1
2
Export list for 192.168.44.127:
/root/test 192.168.44.128

可以看到服务端共享了什么目录,
接下来我们就在客户端上挂载该目录
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

1
2
3
4
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 18G 711M 16G 5% /
192.168.44.127:/root/test/
18G 711M 16G 5% /root/share

接下来我们创建一个uid为1000的用户cli_tester
2# useradd -u 1000 cli_tester

此时进入/root/share新建一个文件
2# touch test.txt
执行touch命令可以用ls -l
看到如下的属主与属组: (因为客户端上只创建了uid为1000的用户,而没有创建gid为1000的组, nfs默认的为nfsnobody帐号)

1
-rw-r--r-- 1 cli_tester nfsnobody 0 11月 19 18:29 test.txt

2. 客户端常见操作
  1. 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的安全与优化

  1. 固定RPC相关程序的端口号, 制定合理的iptables规则
    一般地, NFS服务要向rpcbind动态注册端口信息, 这会导致很难定制防火墙规则, 因为端口信息是由系统随机生成的.
    然而CentOS6以后的版本中系统提供了固定NFS服务的端口配置文件/etc/sysconfig/nfs. 可以通过该文件可以固定端口号
    主要要固定的RPC服务有mountdrquotadnlockmgrstatd

    1
    2
    3
    4
    5
    RQUOTAD_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的端口号
  2. 使用/etc/exports设置更加合理、安全的权限
    尽量使用root_squashall_squashanonuid/anongid来规范用户身份

  3. 正确关闭NFS服务器
    切忌直接关机, 在关机之前,应先停掉rpcbind,nfs这两个deamon.
    在NFS服务端,可以使用showmount -a localhost来查看哪些客户端处于连接状态
    也可以查看/var/lib/nfs/rmtab文件来检查

遇到的错误

  1. lnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
    RPC端口映射失败:无法接收(没有路由到主机)
    解决办法:
    • 然后清空iptables: iptables -F
  2. touch: 无法创建”test.txt”: 权限不够
    解决办法:
    • 这是因为在服务端没有给共享的目录w写权限, 解决办法: 在服务端上执行chmod a+w /root/test

本文链接: http://taolichuan.com/2016/11/18/Linux常见服务部署与优化之NFS/  转载请注明转载自: 陶之夭夭