NFS简介
NFS 是 Network FileSystem 的缩写,顾名思义就是网络文件存储系统,它最早是由 Sun 公司发展出来的,也是 FreeBSD 支持的文件系统中的一个,它允许网络中的计算机之间通过 TCP/IP 网络共享资源。通过 NFS,我们本地 NFS 的客户端应用可以透明地读写位于服务端 NFS 服务器上的文件,就像访问本地文件一样方便。简单的理解,NFS 就是可以透过网络,让不同的主机、不同的操作系统可以共享存储的服务。
NFS 在文件传送或信息传送过程中依赖于 RPC(Remote Procedure Call) 协议,即远程过程调用, NFS 的各项功能都必须要向 RPC 来注册,如此一来 RPC 才能了解 NFS 这个服务的各项功能 Port、PID、NFS 在服务器所监听的 IP 等,而客户端才能够透过 RPC 的询问找到正确对应的端口,所以,NFS 必须要有 RPC 存在时才能成功的提供服务,简单的理解二者关系:NFS是 一个文件存储系统,而 RPC 是负责信息的传输。
NFS部署
操作系统:CentOS Linux release 7.9.2009 (Core)
内核版本:Linux hcss-ecs-1b32 3.10.0-1160.92.1.el7.x86_64 #1 SMP Tue Jun 20 11:48:01 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
自 Red Hat Enterprise Linux 7.4 发布以来,Red Hat Enterprise Linux 完全支持 NFS 版本 4.2 (NFSv4.2)。
NFS分为服务器端和客户端;服务端接收请求,发送同步数据;客户端请求数据
一、服务端安装配置
1.1、时区同步
服务端和客户端执行时间同步,保证时区一致、时间无相差
date -R # 查看当前时区
sudo timedatectl list-timezones # 列出所有可用时区
sudo timedatectl set-timezone Asia/Shanghai # 设置为上海时区
1.2、安装nfs软件
NFS服务依赖 rpcbind 和 nfs-utils,先检查本机有无安装
rpm -qa nfs-utils rpcbind
若是返回空,则说明未安装,执行安装操作
yum install -y nfs-utils rpcbind # 服务端
yum install -y nfs-utils
1.3、启动服务&设置开机自启
sudo systemctl start rpcbind
sudo systemctl enable rpcbind
sudo systemctl start nfs-server
sudo systemctl enable nfs-server
1.4、设置共享目录
在服务端设置共享目录,并保证权限正确(rwxr-xr-x)
1.5、修改配置文件/etc/exports
$ vim /etc/exports
/data/share 192.168.1.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)
命令说明:允许/data/share目录被192.168.1.0/24区间的客户端挂载
参数 | 说明 |
---|---|
ro | 只读访问 |
rw | 读写访问 |
sync | 同步写入内存和硬盘 |
async | 异步写;优先将数据写入内存,之后写入硬盘;效率高,但可能会丢数据 |
root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户 |
all_squash | 无论NFS客户端以什么身份访问,均映射为NFS服务器的匿名用户 |
no_root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的root用户 |
secure | 缺省选项,使用1024以下的tcp/ip端口传输 |
insecure | 使用1024以上的tcp/ip端口传输 |
no_wdelay | 关闭写延迟,如果设置了async,则会忽略该选项 |
nohide | 在共享目录中不共享其子目录 |
subtree_check | 强制检查父目录的权限 |
no_subtree_check | 不强制检查父目录的权限 |
anonuid=xxx | 指定NFS服务器匿名用户的UID |
anongid=xxx | 指定NFS服务器匿名用户的GID |
1.6、查看注册端口并放行
当firewalld进程必须要开启时,就需要将NFS运行需要的相关端口放行。
首先,可以先查看NFS需要的端口
rpcinfo -p localhost
其次,firewalld放行相关端口
firewall-cmd --zone=public --permanent --add-service={rpc-bind,mountd,nfs}
firewall-cmd --reload
1.7、配置完成后重启NFS并查看共享目录列表
如果showmount命令不存在,需要检查是否开启了selinux或者/usr/sbin下是否存在该命令
sudo systemctl restart nfs-server
showmount -e localhost
二、客户端安装配置
2.1、安装客户端工具
yum install -y nfs-utils
2.2、配置并启动服务
客户端不需要开启NFS服务。
sudo systemctl enable rpcbind
sudo systemctl start rpcbind
2.3、挂载共享目录
先查看服务端的共享目录
showmount -e 192.168.1.100 # 假设192.168.1.100是服务端的IP地址
在客户端创建并挂载对应目录
mkdir -p /data/share
mount -t nfs 192.168.1.100:/data/share /data/share -o proto=tcp -o nolock
检查挂载是否成功
df -hT /data/share
mount | grep /data/share
卸载挂载目录,可以使用umount命令。
2.4、配置自动挂载
配置NFS自动挂载和普通磁盘分区挂载一致,都需要修改/etc/fstab
$ vim /etc/fstab
192.168.1.100:/data/share /data/share nfs defaults 0 0
$ mount -a
重新加载systemctl,即可实现重启后自动挂载
systemctl daemon-reload
三、其他注意点&命令解析
1.1、NFS服务相关端口配置
NFS在启动时,会随机启动多个端口向RPC注册;当服务端开启了防火墙时,需要固定注册端口以便于端口放行
默认设置中 nfs 端口是2049,portmapper 的端口是111,mountd 端口是20048,status 和 nlockmgr 是随机端口。
这一点可以通过重启NFS服务测试到,用rpcinfo指令查看前后的端口变化比较。
要固定这些端口,可以修改/etc/sysconfig/nfs、/etc/modprobe.d/lockd.conf 这两个配置文件
rpcinfo -p localhost # 使用rpcinfo命令查看注册的端口
$ vim /etc/sysconfig/nfs
RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004
$ vim /etc/modprobe.d/lockd.conf
options lockd nlm_tcpport=30002
options lockd nlm_udpport=30002
$ sudo systemctl restart nfs-server
$ sudo systemctl restart rpcbind
$ sudo systemctl restart nfs-config
$ systemctl restart nfs-idmap
$ systemctl restart nfs-lock
$ systemctl restart nfs-server
1.2、指定协议挂载
默认情况下,NFS使用UDP协议进行挂载;为了提高挂载的可靠性和稳定性,我们可以指定TCP协议
mount 192.168.1.100:/data/share /data/share -o proto=tcp
1.3、exportfs指令:管理NFS共享的文件系统
/usr/sbin/exportfs命令主要用于维护NFS共享资源;重新共享/etc/exports变更目录或将NFS server共享目录卸载或重新共享
命令格式:exportfs [参数] [目录]
常用参数如下:
参数 | 解释 |
---|---|
-a | 全部挂载或全部卸载 |
-r | 重新挂载 |
-u | 卸载某一个目录 |
-v | 显示共享目录 |
例如,在NFS服务器上修改了 /etc/exports 文件,增加了某个共享文件时,可以直接使用 sudo /usr/sbin/exportfs -arv
指令使其立即生效,不用重启NFS服务。