NFS共享存储在应用中的作用

环境要求

高可用建议

日常维护方式

重要目录说明

# linux下nfs文件共享服务单机部署

当前文档适用于基于 systemd 的 NFS 的单机部署。

# NFS服务端

# 部署NFS服务注意事项

提前规划好用于 NFS 文件共享的磁盘以及要使用的文件系统格式。

使用专用于 NFS 的独立磁盘和 XFS 文件系统格式。不要使用 OS 所在磁盘。

配置好开机自动挂载用于 NFS 的独立磁盘,并且使用 UUID 进行挂载,避免重启系统后磁盘错乱。

非NFS高可用架构时,务必确保服务端运行正常,否则可能导致客户端卡死。例如:K8S中v8的pod挂载了NFS存储,NFS服务端或网络异常时,则可能导致pod无法启动。

# 安装NFS服务端软件

yum install -y rpcbind nfs-utils

# 挂载用于NFS的独立磁盘

# 查看当前的磁盘情况
fdisk -l
# 或使用以下命令查看当前的磁盘情况
lsblk

# 创建需共享的目录

mkdir /nfsDisk

# 创建分区和格式化

假设将现有第二块独立磁盘 /dev/sdb 用于 NFS 共享。

# 磁盘分区

  • 磁盘容量小于2T时
fdisk /dev/sdb
n
p
回车
回车
w
回车
  • 磁盘容量大于2T时
parted /dev/sdb
mklabel gpt
mkpart primary 1 100%
quit

# 磁盘格式化

按需选用合适的文件系统格式。例如可以使用 ext4 或 xfs 等文件系统格式。建议使用 xfs 文件系统。

执行以下命令格式化:

mkfs.xfs /dev/sdb1

# 获取磁盘设备的UUID

lsblk --fs /dev/sdb1
blkid /dev/sdb1
ls -l /dev/disk/by-uuid

按需选用以上命令执行,且复制所需磁盘的 UUID 号备用。 1739993314828.png

# 磁盘开机挂载

vim /etc/fstab
UUID=16291793-ff76-4f37-a983-bc056bcf47b8 /apps xfs defaults 0 0

手动挂载或重启服务器后检查挂载情况。 1739993364831.png

df -h

如下图所示,则表明挂载成功。 1739993444716.png

# 配置NFS服务端的配置文件

# 编辑NFS配置文件 添加待共享的目录
vim /etc/exports/nfsDisk 192.168.100.0/24(rw,sync,no_root_squash,no_subtree_check)

# 创建需要共享的目录

mkdir -p /nfsDisk
# mkdir -p /nfsDisk/{index,officetrans,resources,sportal,upload,webmail}

# 发布共享资源

exportfs -rv

# 启动NFS服务并设置开机自启

对于只使用 NFSv4 时,不需要启动 rpcbind 服务

# rhel 7.x | kylin v10
systemctl enable --now rpcbind nfs
# rhel 8.x/9.x
systemctl enable --now rpcbind nfs-server

# 防火墙开放服务及端口

在NFS服务端执行以下命令开放防火墙端口:

firewall-cmd --permanent --zone=public --add-service=nfs --add-service=mountd --add-service=rpc-bind
firewall-cmd --reload

# 检查NFS服务端nfs的侦听情况

netstat --listening --tcp --udp

# 配置NFS服务端只支持NFSv4

NFSv4 不需要 rpcbind 服务来侦听网络,如果不需要 NFSv3 的话,建议配置为只使用 NFSv4 。这可最大限度地减少系统上打开的端口的数量和运行的服务。 1、通过在 /etc/nfs.conf 配置文件的 [nfsd] 部分添加以下行来禁用 NFSv3:

[nfsd]
vers3=no

2、(可选)禁用对 RPCBIND、MOUNT 和 NSM 协议调用的监听,在仅使用 NFSv4 情况下不需要这些调用。禁用相关服务:

systemctl mask --now rpc-statd.service rpcbind.service rpcbind.socket

3、重启 NFS 服务器:

systemctl restart nfs-server

启动或重启 NFS 服务时生效。

# NFS客户端

# 客户端安装

yum install -y nfs-utils

# 客户端检查NFS共享

showmount -e 192.168.100.135

# 客户端挂载NFS共享

挂载NFS的命令格式如下:

mount -t nfs -o options host:/remote/export /local/directory注意:挂载NFS共享目录到本地目录之前,需要先创建挂载点文件夹。

options: 以逗号分隔的挂载选项列表。 host: 导出您要挂载文件系统的服务器的主机名、IP 地址或完全限定域名。 /remote/export: 要从服务器导出的文件系统或目录,即您要挂载的目录。 /local/directory: 挂载 /remote/export 的客户端位置。

示例:为COP挂载一个NFS文件共享盘

mkdir /nfsDisk
mount -t nfs 192.168.100.135:/nfsDisk /nfsDisk

权限说明 ● rw :读写; ● ro :只读; ● sync :同步模式,内存中数据时时写入磁盘; ● async :不同步,把内存中数据定期写入磁盘中; ● secure :nfs通过1024以下的安全TCP/IP端口发送 ● insecure :nfs通过1024以上的端口发送 ● no_root_squash :加上这个选项后,root用户就会对共享的目录拥有至高的权限控制,就像是对本机的目录操作一样。不安全,不建议使用; ● root_squash :和上面的选项对应,root用户对共享目录的权限不高,只有普通用户的权限,即限制了root; ● subtree_check :如果共享/usr/bin之类的子目录时,强制nfs检查父目录的权限(默认) ● no_subtree_check :和上面相对,不检查父目录权限 ● all_squash :不管使用NFS的用户是谁,他的身份都会被限定成为一个指定的普通用户身份; ● anonuid/anongid :要和root_squash 以及 all_squash一同使用,用于指定使用NFS的用户限定后的uid和gid,前提是本机的/etc/passwd中存在这个uid和gid。

# 永久挂载

永久挂载可简单理解为开机挂载。要实现开机自动挂载。执行以下命令:

vim /etc/fstab
# 无需带密码时添加以下内容
# nfs服务器共享的目录 本地挂载点 文件系统格式 权限 备份 检查
192.168.100.135:/nfsDisk /nfsDisk nfs defaults,_netdev 0 0
# 需要带密码时添加以下内容
192.168.100.254:/nfsDisk /nfsDisk nfs defaults,_netdev,username=nfsUser,password=nfsPassword 0 0

开机自动挂载中,需要指定 netdev 权限。在系统重启检测自动挂载的过程中,会检测 NFS 服务,如果没有 netdev 权限,会导致系统无法启动。netdev 权限明确说明了挂载的是网络设备,有挂载超时时长,用来防止因无法挂载 NFS 共享目录而导致的无法开机的问题。

# 按需挂载

# 手动挂载
# 服务器重启后失效
mkdir /nfsDisk
mount -t nfs 192.168.100.135:/nfsDisk /nfsDisk
# 使用 autofs 挂载

关于 autofs 的方式,后续完善。

dnf install -y autofs

# 手动卸载

umount /nfsDisk

# 检查NFS挂载情况

df -h

# 常用 NFS 挂载选项

以下是挂载 NFS 共享时常用的选项。您可以使用选项 wth manual mount 命令、/etc/fstab 设置和 autofs。 lookupcache=mode 指定内核应该如何管理给定挂载点的目录条目缓存。mode 的有效参数为 all、none 或 positive。 nfsvers=version 指定要使用 NFS 协议的哪个版本,其中 version 为 3、4、4.0、4.1 或 4.2。这对于运行多个 NFS 服务器的主机很有用,或者禁止使用较低版本重试挂载。如果没有指定版本,NFS 将使用内核和 mount 工具支持的最高版本。 noacl 关闭所有 ACL 处理。当与旧版本的 Red Hat Enterprise Linux、Red Hat Linux 或 Solaris 交互时,可能需要此功能,因为最新的 ACL 技术与较旧的系统不兼容。 nolock 禁用文件锁定。当连接到非常旧的 NFS 服务器时,有时需要这个设置。 noexec 防止在挂载的文件系统中执行二进制文件。这在系统挂载不兼容二进制文件的非 Linux 文件系统时有用。 nosuid 禁用 set-user-identifier 和 set-group-identifier 位。这可防止远程用户通过运行 setuid 程序获得更高的特权。 port=num 指定 NFS 服务器端口的数字值。如果 num 为 0(默认值),则 mount 查询远程主机上 rpcbind 服务,以获取要使用的端口号。如果远程主机上的 NFS 服务没有注册其 rpcbind 服务,则使用标准的 NFS 端口号 TCP 2049。 rsize=num 和 wsize=num 这些选项设定单一 NFS 读写操作传输的最大字节数。 rsize 和 wsize 没有固定的默认值。默认情况下,NFS 使用服务器和客户端都支持的最大的可能值。 sec=flavors 用于访问挂载导出上文件的安全类别。flavors 值是一个冒号分隔的、由一个或多个安全类别组成的列表。 默认情况下,客户端会尝试查找客户端和服务器都支持的安全类别。如果服务器不支持任何选定的类别,挂载操作将失败。 可用类别: sec=sys 使用本地 UNIX UID 和 GID。它们使用 AUTH_SYS 验证 NFS 操作。 sec=krb5 使用 Kerberos V5 ,而不是本地 UNIX UID 和 GID 来验证用户。 sec=krb5i 使用 Kerberos V5 进行用户身份验证,并使用安全校验和执行 NFS 操作的完整性检查,以防止数据被篡改。 sec=krb5p 使用 Kerberos V5 进行用户身份验证、完整性检查,并加密 NFS 流量以防止流量嗅探。这是最安全的设置,但它也会涉及最大的性能开销。 tcp 指示 NFS 挂载使用 TCP 协议。

# 问题处理

# 由于在多个 NFS 客户端上使用相同的主机名,NFSv4 clientid 突然过期

https://access.redhat.com/mt/zh-hans/solutions/6395261

# 报错 clnt_create: RPC: Unable to receive

检查nfs服务端是否开启了防火墙; 检查nfs服务端是否开启了nfs服务。

编撰人:het、yangfc