如何在 Linux 上设置和配置 NFS 服务器

Sun Microsystems 的 NFS(网络文件系统)是一种基于 RPC 的分布式文件系统结构,它允许联网设备使用通过网络运行 NFS 的服务器作为其本地驱动器。

这是在 Linux 机器上设置和配置 NFS 服务器的分步指南。

什么是网络文件系统?

NFS 文件系统有四种协议。 当服务器准备好时,它会通知 portmap(将协议转换为端口号的服务器)要使用的端口,并提供受控的 RPC 程序号。

使用嵌入式 Linux 系统时,通过网络上的 NFS 文件共享启动设备非常方便,而不是直接从存储设备(NAND 闪存、eMMC、MMC 等)启动设备。

虽然很少见,但您可能还想在系统启动后挂载 NFS 共享并使用它执行文件共享,即使您不直接从 NFS 共享启动系统。 要使这两种方案都能正常工作,您必须首先在您正在开发的计算机上安装 NFS 服务器。

如何在 Linux 上安装 NFS

如果您使用的是基于 Debian 的系统,例如 Ubuntu 或 Linux Mint,您应该安装 nfs 内核服务器 包如下:

sudo apt install nfs-kernel-server

在 Arch Linux 上:

sudo pacman -S nfs-utils

上 Fedora、CentOS 和 RHEL:

sudo dnf -y install nfs-utils

在该过程结束时,您的 NFS 服务器将自动运行。 但是,此时它还不知道您要通过网络共享您计算机上的哪些目录。 因此,它默认不提供任何共享。

您可以在同一台服务器上打开多个目录,以允许具有不同授权和限制的网络共享。

在 Linux 上配置 NFS 服务器

要通过 NFS 服务器共享任何目录,需要在 /etc/出口 文件。 使用您选择的任何文本编辑器打开文件。 确保添加 sudo 命令的前缀。

sudo vim /etc/s 

您可能想知道您在此处看到的映射选项是什么意思:

  • 根南瓜: 分数 sudo 授权客户端用户为 NFS 上的 nobody 用户和组
  • no_root_squash: 禁用根挤压
  • all_squash: 与root_squash 不同,它允许将所有用户映射为nobody 用户和组。 它通常用于公共访问。
  • no_all_squash: all_squash 的反面; 这个选项是默认的

当您在 NFS 服务器上的 /etc/s 文件中允许的 IP 范围之外的系统尝试访问相关资源时,NFS 服务器将拒绝该请求。

在您的嵌入式系统上安装时,您可能会收到“服务器拒绝访问”消息。 类似以下的错误信息会出现在最后 /var/log/syslog 运行 NFS 服务器的计算机上的文件:

rpc.mountd[1041]: refused mount request from 192.168.2.2 for /home/example/casper/target (/home/example/casper/target): unmatched host

当您看到与上述类似的不匹配主机日志消息时,您应该在 /etc/s 文件中展开相关规则的 IP/网络掩码部分或使用 星号 (*) 特殊字符,如果您想授予对所有 IP 地址的访问权限。

修改后必须重启 NFS 服务 /etc/出口 文件:

sudo service nfs-kernel-server restart

或者,如果您的发行版附带 systemctl,请运行以下命令:

sudo systemctl restart nfs-server.service

你也可以给 -r 参数 导出文件 命令,以便它重新共享已更改与共享相关的任何设置的目录:

sudo fs -r

修复挂载延迟问题

当您在服务器上使用 NFS 协议版本 4 及更高版本时,在使用 NFS 服务器默认配置的传统操作场景中,客户端挂载过程可能会出现长达 15 秒的延迟。 这个问题可能会出现在某些版本的 Debian 上, Fedora,和 Ubuntu。

如果您遇到类似的挂载延迟,可以检查服务器端日志文件 (/var/log/syslog, /var/log/消息) 的日志消息类似于以下内容:

... RPC: AUTH_GSS upcall timed out

此消息表明 Kerberos 身份验证失败并超时。 您可能不需要 Kerberos 协议在您的环境中的网络上进行安全身份验证。 即使您在以这种方式配置的网络上,至少对于您的嵌入式 Linux 系统,您也不需要启用 Kerberos 身份验证。

尽管已经提供了使用 NFS 运行 GSSD 服务来解决问题的替代方案,但这些方法对所有发行版和软件包版本的影响并不相同,因此,从根本上解决这个问题是最合理的。

您必须阻止(或列入黑名单) rpcsec_gss_krb5 内核模块从正在执行 NFS 服务器的 Linux 系统上加载。

要让此选项在您每次重新启动计算机时生效,请创建一个名为 /etc/modprobe.d/nfs-gss-blacklist.conf 并向其中添加以下行:

blacklist rpcsec_gss_krb5

保存文件并重新启动系统后,挂载延迟问题就会消失。

为什么使用 NFS 服务器?

NFS 的设置简单且经济实惠。 它允许集中管理,从而减少了对单个用户 PC 上额外软件和存储空间的需求。 在一台机器上,多个用户可以共享同一个磁盘空间。 他们可以将这些磁盘放在他们的文件系统之上以扩展存储空间。

NFS 共享允许将需要大量存储空间的程序分组到单个服务器上。 这可以节省大量磁盘空间。 虽然以前的 NFS 版本易受攻击,但较新的版本引入了额外的保护级别,包括 Kerberos 身份验证。

但是,也有一些缺点。 已发现 NFS 在某些情况下会在网络流量较大的情况下变慢。 可以与 Windows 共享,但可能需要一些第三方应用程序。 但这在安全性方面并不是一个非常明智的做法。 如果配置不正确,可能会发生未经授权的访问。

使用 NFS 在 Linux 上轻松实现文件系统共享

了解安全问题并找到解决方案是系统管理员最关键的任务之一。 有必要了解所有文件共享系统和管理工具的安全程序,而不仅仅是 NFS。