NFS 简介
NFS(Network File System)即网络文件系统
主要功能: 通过网络 (局域网) 让不同的主机系统之间可以共享文件或目录
主要用途: NFS 网络文件系统一般被用来存储共享视频, 图片, 附件等静态资源文件
NFS 存储服务
无 NFS 文件共享存储
当用户 A 通过互联网上传文件时, 经过负载均衡, 随机或者定向分配到某个节点但是当用户 B 去下载这个文件的时候, 并不确定会向哪个节点发送请求, 这样会导致用户存在一定几率下载不到的情况
有 NFS 文件共享存储
当用户 A 通过互联网上传文件时, 经过负载均衡, 无论发送到哪个节点都会被存储到 NFS 文件服务器但是当用户 B 去下载这个文件的时候, 任何节点都可以读取 NFS 文件服务器的文件
NFS 服务的优缺点
优点
简单容易上手
方便部署非常快速, 维护十分简单
节省本地存储空间将常用的数据存放在一台服务器可以通过网络访问
缺点
在高并发下 NFS 效率 / 性能有限
NFS 的数据是明文的, 对数据完整性不做验证
多台机器挂载 NFS 服务器时, 连接管理维护麻烦
容易发生单点故障, 如果服务端宕机, 所有客户端将不能访问
客户端没用用户认证机制, 且数据是通过明文传送, 安全性一般(一般建议在局域网内使用)
RPC 工作流程
NFS 支持的功能非常多, 不同的功能会有不同的服务来完成, 很多服务都需要监听在一些端口, 其中的很多端口并不是固定的这些服务在启动时, 都需要向 rpcbind 服务注册一个端口, rpcbind 服务随机选取一个未被使用的端口予以分配 rpcbind 服务监听在 111 端口, 所以 rpcbind 的主要功能就是指定每个 RPC service 对应的 port number, 并且通知给客户端, 让客户端连接到正确的端口上去
客户端向 NFS 服务器端请求的步骤:
首先用户访问网站程序, 由程序在 NFS 客户端上发出存取 NFS 文件的请求, 这是 NFS 客户端的 RPC 服务就不通过网络向 NFS 服务器端的 RPC 服务的 111 端口发出 NFS 文件存取功能的查询请求, 包括要实现的什么功能
NFS 服务器端的 RPC 服务找到对应的已注册的 NFS 端口, 通知 NFS 客户端的 RPC 服务
此时 NFS 客户端获取到正确的端口, 并与 NFS 联机存取数据
NFS 客户端把数据存取成功后, 返回给客户端程序, 告知用户存取结果
注意: 由于 rpc service 在启动时需要向 rpcbind 注册端口, 所以 rpcbind 要先启动另外若 rpcbind 重新启动, 原来注册的数据也会不见, 因此一但 rpcbind 重新启动, 让所管理的服务因为需要重新启动以重新向 rpcbind 注册
NFS 服务器端配置
NFS 服务器: 192.168.1.180
检查并安装 NFS
- [root@iZ2ze74fkxrls31tr2ia2fZ ~]# rpm -qa rpcbind nfs-utils
- nfs-utils-1.3.0-0.48.el7_4.1.x86_64
- rpcbind-0.2.0-42.el7.x86_64
如果没有, 安装 NFS 服务器所需的软件包, 实际上需要安装两个包 nfs-utils(nfs 服务主程序)和 rpcbind(rpc 主程序), 不过当使用 yum 安装 nfs-utils 时会把 rpcbind 一起安装上
yum install -y nfs-utils
配置说明
- /etc/sysconfig/nfs #NFS 的主配置文件
- /etc/exports #配置共享目录的文件
/etc/exports 的配置格式:
nfs 共享目录 nfs 客户端地址 1(参 1, 参 2.....) 客户端地址 2(参 1, 参 2...)
说明:
nfs 共享目录: 为 nfs 服务器要共享的实际目录, 绝对目录注意权限问题
nfs 客户端地址: 为 nfs 服务器授权可以访问的客户端的地址, 可以是单独的 ip 地址或主机名, 域名也可以是整个网段
授权整个网段: eg:10.0.0.0/24
文件配置实例说明:
/data/fileserver 192.168.1.190(rw,sync,no_root_squash)
若服务器端对 / etc/exports 文件进行了修改, 可以通过 exportfs 命令重新加载服务而不需要重启服务若重启服务需要重新向 prcbind 注册, 而且对客户端的影响也很大, 所以尽量使用 exportfs 命令来使配置文件生效
- exportfs:
- exportfs -ar #重新导出所有的文件系统
- exportfs -r #导出某个文件系统
- exportfs -au #关闭导出的所有文件系统
- exportfs -u #关闭指定的导出的文件系统
相关参数 (man exports)
A. 选项: 选项用来设置输出目录的访问权限用户映射等
设置输出目录只读: ro
设置输出目录读写: rw
B. 用户映射选项
all_squash: 将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
no_all_squash: 与 all_squash 取反(默认设置);
root_squash: 将 root 用户及所属组都映射为匿名用户或用户组(默认设置);
no_root_squash: 与 rootsquash 取反;
anonuid=xxx: 将远程访问的所有用户都映射为匿名用户, 并指定该用户为本地用户(UID=xxx);
anongid=xxx: 将远程访问的所有用户组都映射为匿名用户组账户, 并指定该匿名用户组账户为本地用户组账户(GID=xxx);
C. 其它选项
secure: 限制客户端只能从小于 1024 的 tcp/ip 端口连接 nfs 服务器(默认设置);
insecure: 允许客户端从大于 1024 的 tcp/ip 端口连接服务器;
sync: 将数据同步写入内存缓冲区与磁盘中, 效率低, 但可以保证数据的一致性;
async: 将数据先保存在内存缓冲区中, 必要时才写入磁盘;
wdelay: 检查是否有相关的写操作, 如果有则将这些写操作一起执行, 这样可以提高效率(默认设置);
no_wdelay: 若有写操作则立即执行, 应与 sync 配合使用;
subtree: 若输出目录是一个子目录, 则 nfs 服务器将检查其父目录的权限(默认设置);
no_subtree: 即使输出目录是一个子目录, nfs 服务器也不检查其父目录的权限, 这样可以提高效率;
启动 NFS 服务端上 nfs 服务
1 先为 rpcbind 和 nfs 做开机启动:
- systemctl enable rpcbind.service
- systemctl enable nfs-server.service
2 然后分别启动 rpcbind 和 nfs 服务:
- systemctl start rpcbind.service
- systemctl start nfs-server.service
查看服务是否启动
- [root@iZ2ze74fkxrls31tr2ia2fZ ~]# rpcinfo -p
- program vers proto port service
- 100000 4 tcp 111 portmapper
- 100000 3 tcp 111 portmapper
- 100000 2 tcp 111 portmapper
- 100000 4 udp 111 portmapper
- 100000 3 udp 111 portmapper
- 100000 2 udp 111 portmapper
- 100024 1 udp 47426 status
- 100024 1 tcp 35379 status
- 100005 1 udp 20048 mountd
- 100005 1 tcp 20048 mountd
- 100005 2 udp 20048 mountd
- 100005 2 tcp 20048 mountd
- 100005 3 udp 20048 mountd
- 100005 3 tcp 20048 mountd
- 100003 3 tcp 2049 nfs
- 100003 4 tcp 2049 nfs
- 100227 3 tcp 2049 nfs_acl
- 100003 3 udp 2049 nfs
- 100003 4 udp 2049 nfs
- 100227 3 udp 2049 nfs_acl
- 100021 1 udp 53046 nlockmgr
- 100021 3 udp 53046 nlockmgr
- 100021 4 udp 53046 nlockmgr
- 100021 1 tcp 38280 nlockmgr
- 100021 3 tcp 38280 nlockmgr
- 100021 4 tcp 38280 nlockmgr
使用 exportfs 查看本机上已经共享的目录:
exportfs
NFS 客户端配置
NFS 客户端: 192.168.1.190
安装 nfs, 并启动服务
- yum install -y nfs-utils
- systemctl enable rpcbind.service
- systemctl start rpcbind.service
客户端不需要启动 nfs 服务, 只需要启动 rpcbind 服务
检查 NFS 服务器端是否有目录共享
showmount -e 192.168.1.180
挂载远程服务
mount -t nfs 192.168.1.180:/data/fileserver /data/itstyle
查看挂载
df -h
开机挂载, 编辑 / etc/fstab
vim /etc/fstab 加入以下内容:
- # 设备文件 挂载点 文件系统类型 mount 参数 dump 参数 fsck 顺序
- 192.168.1.180:/data/fileserver /data/itstyle nfs defaults,_netdev 0 0
_netdev 明确说明这是网络文件系统, 避免网络启动前挂载出现错误
保存后, 重新挂载 /etc/fstab 里面的内容
mount -a
作者: 小柒
来源: https://yq.aliyun.com/articles/467913