实验环境:VMware Workstation Pro 14(试用版)

系统平台:
CentOS Linux release 7.4.1708 (Core)       内核  3.10.0-693.el7.x86_64

NFS配置介绍

软件包

nfs-utils

端口

2049(nfsd), 其它端口由rpcbind(111)分配

工作过程
NFS启动时,会将所使用的端口向rpcbind注册,当有客户端访问的时候,客户端首先通讯的是rpcbind(111),进而rpcbind会告知NFS所使用的端口,客户端就可以通过端口访问NFS服务了。

配置文件:

/etc/exports
/etc/exports.d/*.exports

依赖包

rpcbind(必须)
tcp_wrappers

日志

/var/lib/nfs/

NFS服务主要进程

rpc.nfsd    最主要的NFS进程,管理客户端是否可登录
rpc.mountd  挂载和卸载NFS文件系统,包括权限管理
rpc.lockd   非必要,管理文件锁,避免同时写出错
rpc.statd   非必要,检查文件一致性,可修复文件

CentOS 7不支持同一目录同时用nfs和samba共享,因为使用锁机制不同

启动NFS

# systemctl start nfs
# systemctl start nfs-server

在Centos 6上,rpcbind必须先启动,否则NFS无法启动
在Centos 7上,NFS服务启动时,会把依赖的服务rpcbind一并启动
rpcbind.service可以被rpcbind.socket 激活,rpcbind.socket独立工作

报以下错误的时候
clnt_create: RPC: Program not registered > 重启NFS服务重新注册到rpcbind
clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused) > rpcbind服务未启动,重启rpcbing和nfs服务,注意顺序

查看NFS开启的端口

# rpcinfo -p

如果需要在外部使用NFS服务,需要调整防火墙策略

必须先把NFS配置使用固定端口
vim /etc/sysconfig/nfs

RQUOTAD_PORT=875
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
MOUNTD_PORT=892
STATD_PORT=662
STATD_OUTGOING_PORT=2020

防火墙除开放上述端口,还需开放TCP和UDP的 111 和 2049 共4个端口

配置NFS

语法格式

目录路径 允许访问的IP地址或FQDN列表(选项1,选项2)

/app/nfs *              > * 代表所有
/app/nfs 192.168.5.10(ro) 192.168.5.13(rw)  > 列表以空格分隔
/app/nfs 192.168.5.0/24(rw)
/app/nfs *.magedu.com

默认选项:(ro,sync,root_squash,no_all_squash)
• ro,rw 只读和读写
• async 异步,数据变化后不立即写磁盘,性能高
• sync(1.0.0后为默认)同步,数据在请求时立即写入共享
• no_all_squash (默认)保留共享文件的UID和GID
• all_squash 所有远程用户(包括root)都变成nfsnobody
• root_squash (默认)远程root映射为nfsnobody,UID为65534,早期版本是4294967294 (nfsnobody)
• no_root_squash 远程root映射成root用户
• anonuid和anongid 指明匿名用户映射为特定用户UID和组GID,而非nfsnobody,可配合all_squash使用

生效与查看共享资源

# exportfs -r
exportfs: No options for /app/nfs *: suggest *(sync) to avoid warning
# exportfs -v
/app/nfs        (ro,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)

通过远程主机查看
# showmount -e 192.168.5.108
Export list for 192.168.5.108:
/app/nfs *

远程主机挂载NFS共享

Linux主机

# mount -t nfs 192.168.5.108:/app/nfs /tmp/nfs
# mount 192.168.5.108:/app/nfs /tmp/nfs
#df
Filesystem           1K-blocks    Used Available Use% Mounted on
192.168.5.108:/app/nfs  8913920 1422112   7491808  16% /tmp/nfs

# mount
192.168.5.108:/app/nfs on /tmp/nfs type nfs (rw,vers=4,addr=192.168.5.108,clientaddr=192.168.5.107)

指定NFS版本号挂载
# mount -o vers=3 192.168.5.108:/app/nfs /tmp/nfs
192.168.5.108:/app/nfs on /tmp/nfs type nfs (rw,vers=3,addr=192.168.5.108)

永久挂载
# vim /etc/fstab
192.168.5.108:/app/nfs /tmp/nfs nfs vers=3 0 0
192.168.5.108:/app/nfs /tmp/nfs nfs defaults 0 0

Wdindows下挂载

c:\>mount 192.168.5.108:/app/nfs Z:
Z: 现已成功连接到 192.168.5.108:/app/nfs

命令已成功完成。

NFS权限情况

1.NFS共享受文件系统权限影响
2.受下以选项影响
root_squash (默认)远程root映射为nfsnobody,UID为65534,早期版本是4294967294 (nfsnobody)
no_root_squash 远程root映射成root用户
anonuid和anongid

NFS工具


rpcinfo
rpcinfo -p hostname
rpcinfo –s hostname 查看RPC注册程序

exportfs
–v 查看本机所有NFS共享
–r 重读配置文件,并共享目录
–a 输出本机所有共享
–au 停止本机所有共享

showmount -e hostname

mount.nfs 挂载工具

NFS相关的挂载选项

fg  (默认)前台挂载,bg后台挂载
hard(默认)持续请求,soft 非持续请求
intr 和hard配合,请求可中断
rsize和wsize 一次读和写数据最大字节数,rsize=32768
_netdev 无网络不挂载

示例:
mount -o rw,nosuid,fg,hard,intr 172.16.0.1:/testdir /mnt/nfs/

实现NFS的伪根

/app *(fsid=0,rw,crossmnt)       > 指明NFS根的路径,(fsid=0,crossmn)这2个选项需要添加
/app/nfs *(rw)
/app/home/hunk *(rw)

重新加载配置
#exportfs -r
查看
#exportfs -v
/app            (rw,sync,wdelay,hide,crossmnt,no_subtree_check,fsid=0,sec=sys,secure,root_squash,no_all_squash)
/app/nfs        (rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)
/app/home/hunk  (rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)

远程主机挂载NFS伪根


# mount 192.168.5.108:/ /tmp/ > 方法跟之前的是一样的,只是把远程NFS的挂载目录变为/

#tree /tmp
/tmp
├── home
│ └── hunk
│     └── hunk
└──nfs
    ├── aaa.txt
    └── nfs1.txt