通过 POSIX 兼容性测试的v3.7发布后,FastCFS完全可以作为NFS的后端存储,推荐使用FastCFS v3.7.1及后续版本。FastCFS的搭建参见gitee上的FastCFS项目官网,本文着重介绍FastCFS作为后端存储的NFS搭建及常见问题排查。
NFS服务端运行在FastCFS的fuse client节点上。
1.1 安装
CentOS和RHEL:yum install -y nfs-utils rpcbind
Ubuntu和Debian:apt install nfs-kernel-server -y
1.2 配置
NFS服务配置文件/etc/exports示例:
/opt/fastcfs/fuse 192.168.25.57(rw,sync,all_squash,anonuid=501,anongid=504)
参数注解:
/opt/fastcfs/fuse 要共享的目录
192.168.25.57 表示只允许该客户端挂载共享目录,可以是CIDR网段192.168.25.0/24,也可以用*代表允许所有的网段访问
rw 可读写权限
sync 数据同步写入内存和硬盘
all_squash 表示不管使用NFS目录的用户是谁,其身份被限定为一个指定的普通用户身份设置gid和uid权限;
anonuid/anongid: # 要和root_squash以及all_squash一同使用,用于指定使用NFS的用户限定到的uid和gid, 注意:服务端和客户端uid和gid的用户和组必须存在,否则以root用户身份使用
注意:rw、sync等之间是不能有空格或参数不完整,否则报exportfs: /etc/exports:1: syntax error: bad option list
1.3 服务启动
systemctl restart rpcbind && systemctl restart nfs-server
1.4 重新加载配置文件
exportfs -arv
2.1 安装
CentOS和RHEL:yum install nfs-utils -y
Ubuntu和Debian:apt install nfs-common -y
2.2 挂载
客户端测试是否能连接服务端:
showmount 192.168.25.118 -e
mount命令示例:
mkdir -p /mnt/nfs
mount -t nfs -onolock,nfsvers=3 192.168.25.118:/opt/fastcfs/fuse /mnt/nfs
或者:
mount -t nfs -onolock,nfsvers=4 192.168.25.118:/ /mnt/nfs
3.1 如何查看nfs版本
服务端查看:rpcinfo -p | grep -iE "service|NFS"
客户端查看:nfsstat
3.2 NFS服务端如何设置开机启动
1)查看rpcbind和nfs-server是否开机启动
systemctl list-unit-files --type=service | grep enable | grep rpcbind
systemctl list-unit-files --type=service | grep enable | grep nfs-server
注:输出为空则开机启动没有生效
2)设置开机启动
systemctl enable rpcbind && systemctl enable nfs-server
3.3 两台虚拟机都是Centos6客户端口登录总是提示:mount.nfs: access denied server while mounting
服务端关闭防火墙,以及设置目录权限,都解决不了,在/etc/exports文件中引入如下配置,问题解决。NFS默认支持的端口小于1024,加入insecure参数开启大于1024端口的支持,/etc/exports配置示例:/opt/fastcfs/fuse 192.168.25.118 (insecure,rw,sync,no_root_squash)
3.4 客户端NFS操作提示没有权限(Permission denied)
故障原因:服务端NFS共享目录的权限设置问题
解决方法:在服务端设置NFS共享目录权限为777,客户端就可以写入文件
3.5 目录操作错误提示:mount: mount to NFS server '192.168.25.118' failed: System Error: No route to host. mount clntudp_create: rpc: port mapper failure - rpc: unable to receive
问题原因:开启了防火墙
解决方法:关闭防火墙
3.6 FastCFS作为NFS后端存储时NFS client mount失败
出错信息:reason given by server: No such file or directory
解决方法:
NFS v3直接使用服务端配置的目录如:/opt/fastcfs/fuse,而v4将服务端配置的路径作为基路径,mount要使用/
NFS挂载默认会使用最新的NFS协议,挂载命令示例(支持v4前提下使用):
mount -t nfs -onolock 172.16.168.131:/ /mnt/nfs
NFS v3挂载命令示例:
mount -t nfs -onolock 172.16.168.131:/opt/fastcfs/fuse /mnt/nfs
指定NFS v4挂载命令示例:
mount -t nfs -onolock,nfsvers=4 172.16.168.131:/ /mnt/nfs
友情提示:
CentOS 6需要使用NFS v3挂载
/etc/exports中需要设置fsid=0,例如:/opt/fastcfs/fuse 172.16.168.130(fsid=0,rw,sync,no_root_squash,no_all_squash)
配置示例:
/opt/fastcfs/fuse 10.10.31.0/24: (rw,no_root_squash,no_all_squash,sync)
10.10.31.0/24:这是允许访问NFS server的IP范围,也就是10.10.31开头的IP,24是掩码长度。
可以设定的参数主要有以下这些:
rw或ro:rw表示可读写权限,ro表示只读权限
no_root_squash:登入到NFS主机的用户如果是root,该用户即拥有root权限
no_all_squash:透传普通用户ID及其用户组
root_squash:登入NFS主机的用户如果是root,该用户权限将被限定为匿名使用者anonuid
all_squash:不管登陆NFS主机的用户是何权限都会被重新设定为匿名使用者anongid
anonuid:将登入NFS主机的用户都设定成指定的user id,此ID必须存在于/etc/passwd中,默认为nobody或nfsnobody
anongid:将登入NFS主机的用户组都设定成指定的group id,此ID必须存在于/etc/group中,默认为nobody或nfsnobody
sync:数据同步写入硬盘
async:数据会先存放在内存中,然后再异步写入硬盘
insecure:允许对本共享目录的非授权访问
async:异步同步,此参数会提高I/O性能,但会降低数据安全(除非对性能要求很高,对数据可靠性不要求的场合),不推荐使用;
noatime:取消更新文件系统上的inode访问时间,提升I/O性能,优化I/O目的,推荐使用;
nodiratime:取消更新文件系统上的directory inode访问时间,高并发环境可以提高系统性能,推荐使用。