跳转到内容跳转到页面导航:上一页 [访问键 p]/下一页 [访问键 n]
适用于 openSUSE Leap 15.6

22 使用 NFS 共享文件系统 编辑源文件

摘要

网络文件系统 (Network File System) (NFS) 是一种协议,允许以类似于访问本地文件的方式访问服务器上的文件。

openSUSE Leap 安装 NFS v4.2,它引入了对稀疏文件、文件预分配、服务器端克隆和复制、应用程序数据块 (ADB) 以及带标签 NFS 以进行强制访问控制 (MAC)(需要在客户端和服务器上都需要 MAC)的支持。

22.1 概述 编辑源文件

网络文件系统 (Network File System) (NFS) 是一种标准化、经过充分验证且广泛支持的网络协议,允许在独立的宿主机之间共享文件。

网络信息服务 (Network Information Service) (NIS) 可用于在网络中实现集中式用户管理。将 NFS 和 NIS 结合使用允许使用文件和目录权限进行网络访问控制。带有 NIS 的 NFS 使网络对用户透明。

在默认配置中,NFS 完全信任网络,因此连接到受信任网络的任何机器。具有物理访问任何 NFS 服务器信任的网络的任何具有管理员权限的用户都可以访问服务器提供的任何文件。

通常,这种级别的安全性是完全令人满意的,例如当受信任的网络真正是私有的、通常位于单个机柜或机房内,并且不可能进行未经授权的访问时。在其他情况下,将整个子网作为一个单元进行信任是受限制的,并且需要更细粒度的信任。为了满足这些情况下的需求,NFS 支持使用 Kerberos 基础设施的各种安全级别。Kerberos 需要 NFSv4,默认情况下使用 NFSv4。有关详细信息,请参阅 “安全和加固指南”一书,第 6 章“使用 Kerberos 进行网络身份验证”

以下是在 YaST 模块中使用的术语。

导出

一个目录由 NFS 服务器 导出,客户端可以将该目录集成到他们的系统中。

NFS 客户端

NFS 客户端是一个使用 NFS 协议通过网络文件系统从 NFS 服务器使用 NFS 服务的系统。TCP/IP 协议已经集成到 Linux 内核中;无需安装任何其他软件。

NFS 服务器

NFS 服务器为客户端提供 NFS 服务。正在运行的服务器依赖于以下守护进程:nfsd(工作进程)、idmapd(ID 到名称映射,仅在某些情况下需要)、statd(文件锁定)和 mountd(挂载请求)。

NFSv3

NFSv3 是版本 3 的实现,是支持客户端身份验证的“旧”无状态 NFS。

NFSv4

NFSv4 是新的版本 4 的实现,支持通过 Kerberos 进行安全的身份验证。NFSv4 仅需要一个端口,因此比 NFSv3 更适合在防火墙后面的环境。

该协议在 https://datatracker.ietf.org/doc/rfc7531/ 中指定。

pNFS

并行 NFS,NFSv4 的协议扩展。任何 pNFS 客户端可以直接访问 NFS 服务器上的数据。

Important
重要提示:需要 DNS

原则上,所有导出都可以仅使用 IP 地址进行。为了避免超时,您需要一个正常工作的 DNS 系统。DNS 至少需要用于日志记录目的,因为 mountd 守护进程执行反向查找。

22.2 安装 NFS 服务器 编辑源文件

NFS 服务器不是默认安装的一部分。要使用 YaST 安装 NFS 服务器,请选择 软件 › 软件管理,选择 模式,并在 服务器功能部分启用 文件服务器选项。单击 接受以安装所需的软件包。

与 NIS 类似,NFS 是一个客户端/服务器系统。但是,一台机器可以同时充当两者——它可以跨网络提供文件系统(导出)并从其他主机挂载文件系统(导入)。

Note
注意:在导出服务器上本地挂载 NFS 卷

openSUSE Leap 上不支持在导出服务器上本地挂载 NFS 卷。

22.3 配置 NFS 服务器 编辑源文件

可以通过 YaST 或手动配置 NFS 服务器。对于身份验证,NFS 还可以与 Kerberos 结合使用。

22.3.1 使用 YaST 导出文件系统 编辑源文件

使用 YaST,将您的主机变成一个 NFS 服务器——一个导出目录和文件到被授予访问权限的所有主机或组中所有成员的服务器。因此,服务器还可以提供应用程序,而无需在每台主机上本地安装应用程序。

要设置此类服务器,请按以下步骤操作

过程 22.1:设置 NFS 服务器
  1. 启动 YaST 并选择 网络服务 › NFS 服务器;请参阅 图 22.1,“NFS 服务器配置工具”。您可能会被提示安装其他软件。

    NFS server configuration tool
    图 22.1:NFS 服务器配置工具
  2. 单击 启动单选按钮。

  3. 如果您的系统上激活了 firewalld,请单独为 NFS 配置它(请参阅 第 22.5 节,“在防火墙后运行 NFS 服务器和客户端”)。YaST 尚未完全支持 firewalld,因此忽略“无法配置防火墙”消息并继续。

  4. 检查您是否希望 启用 NFSv4。如果您停用 NFSv4,YaST 将仅支持 NFSv3。有关启用 NFSv2 的信息,请参阅 注意:NFSv2

    1. 如果选择了 NFSv4,请另外输入适当的 NFSv4 域名。此参数由 idmapd 守护进程使用,该守护进程对于 Kerberos 设置或客户端无法使用数字用户名的情况是必需的。如果您不运行 idmapd 或没有特殊要求,请将其保留为 localdomain(默认值)。有关 idmapd 守护进程的更多信息,请参阅 /etc/idmapd.conf

      Important
      重要提示:NFSv4 域名

      请注意,域名需要在所有 NFSv4 客户端上配置。只有共享与服务器相同域名的客户端才能访问服务器。服务器和客户端的默认域名是 localdomain

  5. 如果您需要安全访问服务器,请单击 启用 GSS 安全性。为此,您必须在您的域上安装 Kerberos,并且服务器和客户端都已 Kerberos 化。单击 下一步以继续下一个配置对话框。

  6. 单击对话框上半部分的 添加目录 以导出您的目录。

  7. 如果您尚未配置允许的主机,则会自动弹出另一个用于输入客户端信息和选项的对话框。输入主机通配符(通常您可以保留默认设置)。

    可以为每个主机设置四种类型的主机通配符:单个主机(名称或 IP 地址)、netgroups、通配符(例如 * 表示所有机器都可以访问服务器)和 IP 网络。

    有关这些选项的更多信息,请参阅 exports man 页。

  8. 单击 完成 以完成配置。

22.3.2 手动导出文件系统 编辑源文件

NFS 导出服务配置文件是 /etc/exports/etc/sysconfig/nfs。除了这些文件之外,如果使用 Kerberos 身份验证或客户端无法使用数字用户名,则还需要 /etc/idmapd.conf

要启动或重新启动服务,请运行命令 systemctl restart nfs-server。这将重新启动 NFS 服务器所需的 RPC 端口映射器。

要确保 NFS 服务器在启动时始终启动,请运行 sudo systemctl enable nfs-server

Note
注意:NFSv4

NFSv4 是 openSUSE Leap 上可用的 NFS 协议的最新版本。使用 NFSv4 导出目录的配置现在与 NFSv3 相同。

openSUSE Leap 之前的版本 上,/etc/exports 中的 bind 挂载是强制性的。它仍然受支持,但现在已弃用。

/etc/exports

/etc/exports 文件包含一个条目列表。每个条目指示共享的目录以及共享方式。 /etc/exports 中的典型条目包括

/SHARED/DIRECTORY   HOST(OPTION_LIST)

例如

/nfs_exports/public *(rw,sync,root_squash,wdelay)
/nfs_exports/department1 *.department1.example.com(rw,sync,root_squash,wdelay)
/nfs_exports/team1 192.168.1.0/24(rw,sync,root_squash,wdelay)
/nfs_exports/tux 192.168.1.2(rw,sync,root_squash)

在此示例中,使用了以下 HOST

  • *:导出到网络上的所有客户端

  • *.department1.example.com:仅导出到 *.department1.example.com 域上的客户端

  • 192.168.1.0/24:仅导出到 IP 地址在 192.168.1.0/24 范围内的客户端

  • 192.168.1.2:仅导出到 IP 地址为 192.168.1.2 的机器

除了上述示例之外,您还可以将导出限制为在 /etc/netgroup 中定义的 netgroups(@my-hosts)。有关所有选项及其含义的详细说明,请参阅 exports man 页(man exports)。

如果您在 NFS 服务器运行时修改了 /etc/exports,则需要重新启动它才能使更改生效:sudo systemctl restart nfs-server

/etc/sysconfig/nfs

/etc/sysconfig/nfs 文件包含一些确定 NFSv4 服务器守护进程行为的参数。将参数 NFS4_SUPPORT 设置为 yes(默认值)非常重要。 NFS4_SUPPORT 确定 NFS 服务器是否支持 NFSv4 导出和客户端。

如果您在 NFS 服务器运行时修改了 /etc/sysconfig/nfs,则需要重新启动它才能使更改生效:sudo systemctl restart nfs-server

Tip
提示:挂载选项

openSUSE Leap 之前的版本 上,/etc/exports 中的 --bind 挂载是强制性的。它仍然受支持,但现在已弃用。使用 NFSv4 导出目录的配置现在与 NFSv3 相同。

Note
注意:NFSv2

如果 NFS 客户端仍然依赖于 NFSv2,请在 /etc/sysconfig/nfs 中启用它,方法是设置

NFSD_OPTIONS="-V2"
MOUNTD_OPTIONS="-V2"

重新启动服务后,使用命令检查是否可用版本 2

> cat /proc/fs/nfsd/versions
+2 +3 +4 +4.1 +4.2
/etc/idmapd.conf

仅当使用 Kerberos 身份验证或客户端无法使用数字用户名时,才需要 idmapd 守护进程。从 Linux 内核 2.6.39 开始,Linux 客户端可以使用数字用户名。 idmapd 守护进程对 NFSv4 请求到服务器进行名称到 ID 映射并回复客户端。

如果需要,idmapd 需要在 NFSv4 服务器上运行。客户端上的名称到 ID 映射将由 nfs-client 包提供的 nfsidmap 完成。

确保在可能使用 NFS 共享文件系统的机器上以一致的方式分配用户名和 ID(UID)。可以通过使用 NIS、LDAP 或域中的任何统一域身份验证机制来实现这一点。

必须在 /etc/idmapd.conf 中设置参数 Domain。它必须与服务器和访问此服务器的所有 NFSv4 客户端相同。处于不同 NFSv4 域中的客户端无法访问服务器。建议坚持使用默认域名 localdomain。如果您需要选择不同的名称,您可以选择主机名的 FQDN 减去主机名。示例配置文件如下

[General]
Verbosity = 0
Pipefs-Directory = /var/lib/nfs/rpc_pipefs
Domain = localdomain

[Mapping]
Nobody-User = nobody
Nobody-Group = nobody

要启动 idmapd 守护进程,请运行 systemctl start nfs-idmapd。如果您在守护进程运行时修改了 /etc/idmapd.conf,则需要重新启动它才能使更改生效:systemctl restart nfs-idmapd

有关更多信息,请参阅 idmapdidmapd.conf 的 man 页(man idmapdman idmapd.conf)。

22.3.3 带有 Kerberos 的 NFS 编辑源文件

要使用 Kerberos 身份验证进行 NFS,必须启用通用安全服务 (GSS)。在 YaST 的初始 NFS 服务器对话框中选择 启用 GSS 安全性。您必须拥有正在运行的 Kerberos 服务器才能使用此功能。YaST 不会设置服务器,而仅使用提供的功能。除了 YaST 配置之外,要使用 Kerberos 身份验证,请至少完成以下步骤

  1. 确保服务器和客户端都位于同一 Kerberos 域中。它们必须访问相同的 KDC(密钥分发中心)服务器并共享其 krb5.keytab 文件(任何机器上的默认位置是 /etc/krb5.keytab)。有关 Kerberos 的更多信息,请参阅 “安全和加固指南”一书,第 6 章“使用 Kerberos 进行网络身份验证”

  2. 使用命令 systemctl start rpc-gssd.service 在客户端上启动 gssd 服务。

  3. 使用命令 systemctl start rpc-svcgssd.service 在服务器上启动 svcgssd 服务。

Kerberos 身份验证还需要在服务器上运行 idmapd 守护进程。有关更多信息,请参阅 /etc/idmapd.conf

有关配置 Kerberized NFS 的更多信息,请参阅 第 22.7 节,“更多信息” 中的链接。

22.4 配置客户端 编辑源代码

要将您的主机配置为 NFS 客户端,您无需安装额外的软件。所有必需的软件包默认情况下都已安装。

22.4.1 使用 YaST 导入文件系统 编辑源代码

授权用户可以使用 YaST NFS 客户端模块将 NFS 目录从 NFS 服务器挂载到本地文件树中。请按以下步骤操作

过程 22.2: 导入 NFS 目录
  1. 启动 YaST NFS 客户端模块。

  2. NFS 共享 选项卡中单击 添加。输入 NFS 服务器的主机名、要导入的目录以及在本地挂载此目录的挂载点。

  3. 在使用 NFSv4 时,在 NFS 设置 选项卡中选择 启用 NFSv4。此外,NFSv4 域名 必须与 NFSv4 服务器使用的值相同。默认域名是 localdomain

  4. 要对 NFS 使用 Kerberos 身份验证,必须启用 GSS 安全性。选择 启用 GSS 安全性

  5. 如果您的系统上 firewalld 处于活动状态,请单独为 NFS 配置它(请参阅 第 22.5 节,“在防火墙后运行 NFS 服务器和客户端”)。YaST 尚未完全支持 firewalld,因此请忽略 防火墙不可配置 消息并继续。

  6. 单击 确定 以保存您的更改。

配置写入 /etc/fstab,并挂载指定的的文件系统。稍后启动 YaST 配置客户端时,它还会从该文件读取现有的配置。

Tip
提示:NFS 作为根文件系统

在根分区通过网络作为 NFS 分享挂载的(无盘)系统中,您需要小心配置可访问 NFS 分享的网络设备。

在关机或重新启动系统时,默认处理顺序是关闭网络连接,然后卸载根分区。对于 NFS 根,此顺序会导致问题,因为网络连接到 NFS 共享已经停用,无法干净地卸载根分区。为了防止系统停用相关的网络设备,请按照 第 13.4.1.2.5 节,“激活网络设备” 中所述打开网络设备配置选项卡,并在 设备激活 面板中选择 On NFSroot

22.4.2 手动导入文件系统 编辑源代码

手动从 NFS 服务器导入文件系统的先决条件是正在运行的 RPC 端口映射器。nfs 服务负责正确启动它;因此,以 root 的身份输入 systemctl start nfs。然后,可以使用 mount 将远程文件系统挂载到文件系统中,就像本地分区一样。

> sudo mount HOST:REMOTE-PATH LOCAL-PATH

例如,要从 nfs.example.com 机器导入用户目录,请使用

> sudo mount nfs.example.com:/home /home

要定义客户端与 NFS 服务器建立的 TCP 连接数,可以使用 mount 命令的 nconnect 选项。您可以指定 1 到 16 之间的任何数字,如果未指定挂载选项,则默认值为 1。

仅在首次挂载到特定 NFS 服务器时应用 nconnect 设置。如果同一客户端执行挂载命令到同一 NFS 服务器,所有已建立的连接都将被共享——不会建立新的连接。要更改 nconnect 设置,必须卸载 所有 客户端连接到特定 NFS 服务器。然后,您可以为 nconnect 选项定义一个新值。

您可以在 mount 的输出中或在 /proc/mounts 文件中找到当前生效的 nconnect 值。如果挂载选项没有值,则表示在挂载期间未使用该选项,并且正在使用默认值 1

Note
注意:与 nconnect 定义的连接数不同

由于您可以在首次挂载后关闭和打开连接,因此实际的连接数不一定与 nconnect 的值相同。

22.4.2.1 使用 automount 服务 编辑源代码

可以使用 autofs 守护程序自动挂载远程文件系统。将以下条目添加到 /etc/auto.master 文件

/nfsmounts /etc/auto.nfs

现在,如果 auto.nfs 文件已正确填充,则 /nfsmounts 目录将充当所有 NFS 客户端挂载的根目录。选择 auto.nfs 是为了方便起见——您可以选择任何名称。在 auto.nfs 中,为所有 NFS 挂载添加条目,如下所示

localdata -fstype=nfs server1:/data
nfs4mount -fstype=nfs4 server2:/

root 的身份使用 systemctl start autofs 激活设置。在此示例中,/nfsmounts/localdataserver1/data 目录,使用 NFS 挂载,而 /nfsmounts/nfs4mount 来自 server2 使用 NFSv4 挂载。

如果在 autofs 服务运行时编辑了 /etc/auto.master 文件,则必须使用 systemctl restart autofs 重新启动自动挂载器才能使更改生效。

22.4.2.2 手动编辑 /etc/fstab 编辑源代码

典型的 NFSv3 挂载条目在 /etc/fstab 中如下所示

nfs.example.com:/data /local/path nfs rw,noauto 0 0

对于 NFSv4 挂载,在第三列中使用 nfs4 代替 nfs

nfs.example.com:/data /local/pathv4 nfs4 rw,noauto 0 0

noauto 选项可防止文件系统在启动时自动挂载。如果您想手动挂载相应的文件系统,则可以通过仅指定挂载点来缩短挂载命令。

> sudo mount /local/path
Note
注意:启动时挂载

如果您没有输入 noauto 选项,则系统的启动脚本将处理在启动时挂载这些文件系统。在这种情况下,您可能需要添加 _netdev 选项,该选项可防止脚本在网络可用之前尝试挂载共享。

22.4.3 并行 NFS (pNFS) 编辑源代码

NFS 是最古老的协议之一,开发于 1980 年代。因此,如果您只想共享小文件,NFS 通常就足够了。但是,当您想要传输大文件或许多客户端想要访问数据时,NFS 服务器会成为瓶颈,并对系统性能产生重大影响。这是因为文件正在迅速变大,而以太网的相对速度并没有完全跟上。

当您从常规 NFS 服务器请求文件时,服务器会查找文件元数据、收集所有数据,并通过网络将其传输到您的客户端。但是,无论文件大小如何,性能瓶颈都会变得明显

  • 对于小文件,大部分时间都花在收集元数据上。

  • 对于大文件,大部分时间都花在从服务器传输数据到客户端上。

pNFS 或并行 NFS 克服了此限制,因为它将文件系统元数据与数据的位置分开。因此,pNFS 需要两种类型的服务器

  • 处理所有非数据流量的 元数据控制服务器

  • 保存数据的 存储服务器

元数据和存储服务器构成一个单一的逻辑 NFS 服务器。当客户端想要读取或写入时,元数据服务器会告诉 NFSv4 客户端使用哪个存储服务器来访问文件块。客户端可以直接在服务器上访问数据。

openSUSE Leap 仅支持客户端上的 pNFS。

22.4.3.1 使用 YaST 配置 pNFS 客户端 编辑源代码

按照 过程 22.2,“导入 NFS 目录” 中所述进行操作,但选中 pNFS (v4.2) 复选框,并可选地选中 NFSv4 共享。YaST 将执行所有必要的步骤,并将所有必需的选项写入 /etc/exports 文件。

22.4.3.2 手动配置 pNFS 客户端 编辑源代码

请参阅 第 22.4.2 节,“手动导入文件系统” 以开始。大部分配置由 NFSv4 服务器完成。对于 pNFS,唯一的区别是在 mount 命令中添加 nfsvers 选项和元数据服务器 MDS_SERVER

> sudo mount -t nfs4 -o nfsvers=4.2 MDS_SERVER MOUNTPOINT

为了帮助进行调试,更改 /proc 文件系统中的值

> sudo echo 32767 > /proc/sys/sunrpc/nfsd_debug
> sudo echo 32767 > /proc/sys/sunrpc/nfs_debug

22.5 在防火墙后运行 NFS 服务器和客户端 编辑源代码

NFS 服务器和客户端之间的通信通过远程过程调用 (RPC) 进行。Linux NFS 实现的几个 RPC 服务,例如挂载守护程序或文件锁定服务,都是其中的一部分。如果服务器和客户端在防火墙后运行,则需要配置这些服务和防火墙,以防止阻止客户端-服务器通信。

NFS 4 服务器与 NFS 版本 3 兼容,并且防火墙配置因版本而异。如果您的任何客户端使用 NFS 3 挂载共享,请配置防火墙以允许 NFS 4 和 NFS 3。

22.5.1 NFS 4.x 编辑源代码

NFS 4 需要在服务器端打开 TCP 端口 2049。要在防火墙上打开此端口,请在 firewalld 中启用 nfs 服务 在 NFS 服务器上

> sudo firewall-cmd --permanent --add-service=nfs --zone=ACTIVE_ZONE
firewall-cmd --reload

ACTIVE_ZONE 替换为 NFS 服务器上使用的防火墙区域。

在使用 NFSv4 时,客户端上不需要额外的防火墙配置。默认情况下,挂载会默认到支持的最高 NFS 版本,因此如果您的客户端支持 NFSv4,则共享将自动挂载为版本 4.2。

22.5.2 NFS 3 编辑源代码

NFS 3 需要以下服务

  • portmapper

  • nfsd

  • mountd

  • lockd

  • statd

这些服务由 rpcbind 运行,默认情况下动态分配端口。为了允许在防火墙后访问这些服务,需要先配置它们以在静态端口上运行。然后需要在防火墙中打开这些端口。

portmapper

openSUSE Leap 上,portmapper 已经配置为在静态端口上运行。

端口

111

协议

TCP、UDP

运行于

客户端、服务器

> sudo firewall-cmd --add-service=rpc-bind --permanent --zone=ACTIVE_ZONE
nfsd

openSUSE Leap 上,nfsd 已经配置为在静态端口上运行。

端口

2049

协议

TCP、UDP

运行于

服务器

> sudo firewall-cmd --add-service=nfs3 --permanent --zone=ACTIVE_ZONE
mountd

openSUSE Leap 上,mountd 已经配置为在静态端口上运行。

端口

20048

协议

TCP、UDP

运行于

服务器

> sudo firewall-cmd --add-service=mountd --permanent --zone=ACTIVE_ZONE
lockd

要为 lockd 设置静态端口

  1. 编辑服务器上的 /etc/sysconfig/nfs 并查找并设置

    LOCKD_TCPPORT=NNNNN
    LOCKD_UDPPORT=NNNN

    NNNNN 替换为您选择的未使用的端口。对两种协议使用相同的端口。

  2. 重启 NFS 服务器

    > sudo systemctl restart nfs-server

端口

NNNNN

协议

TCP、UDP

运行于

客户端、服务器

> sudo firewall-cmd --add-port=NNNNN/{tcp,udp} --permanent --zone=ACTIVE_ZONE
statd

要为 statd 设置静态端口

  1. 编辑服务器上的 /etc/sysconfig/nfs 并查找并设置

    STATD_PORT=NNNNN

    NNNNN 替换为您选择的未使用的端口。

  2. 重启 NFS 服务器

    > sudo systemctl restart nfs-server

端口

NNNNN

协议

TCP、UDP

运行于

客户端、服务器

> sudo firewall-cmd --add-port=NNNNN/{tcp,udp} --permanent --zone=ACTIVE_ZONE
Important
重要:加载更改后的 firewalld 配置

每当您更改 firewalld 配置时,都需要重新加载守护进程才能激活更改

> sudo firewall-cmd --reload
Note
注意:防火墙区域

请务必将 ACTIVE_ZONE 替换为各自机器上使用的防火墙区域。请注意,根据防火墙配置,活动区域可能因机器而异。

22.6 通过 NFSv4 管理访问控制列表 编辑源代码

在 Linux 中,访问控制列表 (ACL) 没有单一标准,除了用户、组和其他 (ugo) 的简单读、写和执行 (rwx) 标志。一种更精细控制的选项是 Draft POSIX ACLs,它从未被 POSIX 正式标准化。另一种是 NFSv4 ACL,它是为了成为 NFSv4 网络文件系统的一部分而设计的,旨在使 Linux 上的 POSIX 系统和 Microsoft Windows 上的 WIN32 系统之间提供合理的兼容性。

NFSv4 ACL 不足以正确实现 Draft POSIX ACL,因此没有尝试映射 NFSv4 客户端上的 ACL 访问权限(例如使用 setfacl)。

在使用 NFSv4 时,即使在仿真模式下也无法使用 Draft POSIX ACL,并且需要直接使用 NFSv4 ACL;这意味着虽然 setfacl 可以在 NFSv3 上工作,但不能在 NFSv4 上工作。为了允许在 NFSv4 文件系统上使用 NFSv4 ACL,openSUSE Leap 提供了 nfs4-acl-tools 包,其中包含以下内容

  • nfs4-getfacl

  • nfs4-setfacl

  • nfs4-editacl

这些命令的操作方式通常与 getfaclsetfacl 检查和修改 NFSv4 ACL 的方式类似。这些命令仅在 NFS 服务器上的文件系统提供对 NFSv4 ACL 的完全支持时才有效。服务器施加的任何限制都会影响客户端上运行的程序,即某些特定的访问控制条目 (ACE) 组合可能不可行。

不支持在导出 NFS 服务器上本地挂载 NFS 卷。

附加信息编辑源代码

有关信息,请参阅 https://wiki.linux-nfs.org/wiki/index.php/ACLs#Introduction_to_NFSv4_ACLs 上的 Introduction to NFSv4 ACLs

22.7 更多信息 编辑源代码

除了 exportsnfsmount 的手册页之外,有关配置 NFS 服务器和客户端的信息还可在 /usr/share/doc/packages/nfsidmap/README 中找到。有关在线的更多文档,请参阅以下网站

  • 有关网络安全的一般信息,请参阅 “Security and Hardening Guide”一书,第 23 章“Masquerading and firewalls”

  • 如果您需要自动挂载 NFS 导出,请参阅 第 23.4 节,“Auto-mounting an NFS share”

  • 有关通过 AutoYaST 配置 NFS 的更多详细信息,请参阅 “AutoYaST Guide”一书,第 4 章“Configuration and installation options”,第 4.20 节“NFS client and server”

  • 有关使用 Kerberos 保护 NFS 导出的说明,请参阅 “Security and Hardening Guide”一书,第 6 章“Network authentication with Kerberos”,第 6.6 节“Kerberos and NFS”

  • SourceForge 上找到详细的技术文档。

22.8 收集 NFS 故障排除信息 编辑源代码

22.8.1 常见故障排除 编辑源代码

在某些情况下,您可以通过读取产生的错误消息并查看 /var/log/messages 文件来了解 NFS 中的问题。但是,在许多情况下,错误消息和 /var/log/messages 中提供的信息不够详细。在这些情况下,通过在重现问题时捕获网络数据包来最好地了解大多数 NFS 问题。

明确定义问题。通过以各种方式测试系统来检查问题,并确定问题何时发生。隔离导致问题的最简单步骤。然后尝试按照以下步骤重现问题。

Procedure 22.3: 重现问题
  1. 捕获网络数据包。在 Linux 上,您可以使用 tcpdump 命令,该命令由 tcpdump 包提供。

    一个 tcpdump 语法示例如下

    tcpdump -s0 -i eth0 -w /tmp/nfs-demo.cap host x.x.x.x

    其中

    s0

    防止数据包截断

    eth0

    应替换为数据包将通过的本地接口的名称。您可以使用 any 值同时捕获所有接口,但使用此属性通常会导致数据质量较差以及分析混乱。

    w

    指定要写入的捕获文件的名称。

    x.x.x.x

    应替换为 NFS 连接另一端的 IP 地址。例如,在 NFS 客户端侧使用 tcpdump 时,指定 NFS 服务器的 IP 地址,反之亦然。

    Note
    注意

    在某些情况下,在 NFS 客户端或 NFS 服务器上捕获数据就足够了。但是,在怀疑端到端网络完整性存在疑问的情况下,通常需要在两端都捕获数据。

    不要关闭 tcpdump 进程并继续执行下一步。

  2. (可选) 如果问题发生在 nfs mount 命令的执行期间,您可以尝试使用 nfs mount 命令的高冗余选项 (-vvv) 以获取更多输出。

  3. (可选) 获取重现方法的 strace。重现步骤的 strace 记录了在什么时间进行的系统调用。可以使用此信息进一步确定您应该关注 tcpdump 中的哪些事件。

    例如,如果您发现执行命令 mycommand --param 在 NFS 挂载上失败,那么您可以 strace 该命令,如下所示

    strace -ttf -s128 -o/tmp/nfs-strace.out mycommand --param

    如果您没有获得重现步骤的 strace,请注意重现问题的时间。检查 /var/log/messages 日志文件以隔离问题。

  4. 重现问题后,停止在您的终端中运行的 tcpdump,按 CTRLc。如果 strace 命令导致挂起,也请终止 strace 命令。

  5. 现在,具有分析数据包跟踪和 strace 数据的经验的管理员可以检查 /tmp/nfs-demo.cap/tmp/nfs-strace.out 中的数据。

22.8.2 高级 NFS 调试 编辑源代码

Important
重要:高级调试仅供专家

请记住,以下部分仅供精通 NFS 代码的熟练 NFS 管理员使用。因此,请执行 第 22.8.1 节,“Common troubleshooting” 中描述的初始步骤,以帮助缩小问题范围并告知专家可能需要哪些调试代码区域(如果有的话)才能了解更深入的详细信息。

有各种调试代码区域可以启用以收集其他 NFS 相关信息。但是,调试消息非常晦涩,并且它们的数量可能非常大,以至于使用调试代码可能会影响系统性能。它甚至可能影响系统到足以阻止问题的发生。在大多数情况下,不需要调试代码输出,通常对不熟悉 NFS 代码的人也没有用。

22.8.2.1 使用 rpcdebug 激活调试 编辑源代码

rpcdebug 工具允许您设置和清除 NFS 客户端和服务器调试标志。如果您的 openSUSE Leap 安装中没有 rpcdebug 工具,您可以从 nfs-clientnfs-kernel-server 包中安装它,用于 NFS 服务器。

要设置调试标志,请运行

rpcdebug -m module -s flags

要清除调试标志,请运行

rpcdebug -m module -c flags

其中 module 可以是

nfsd

调试 NFS 服务器代码

nfs

调试 NFS 客户端代码

nlm

调试 NFS Lock Manager,在 NFS 客户端或 NFS 服务器上。这仅适用于 NFS v2/v3。

rpc

调试远程过程调用模块,在 NFS 客户端或 NFS 服务器上。

有关 rpcdebug 命令的详细用法信息,请参阅手册页

man 8 rpcdebug

22.8.2.2 激活 NFS 依赖的其他代码的调试 编辑源代码

NFS 活动可能依赖于其他相关服务,例如 NFS 挂载守护进程—rpc.mountd。您可以在 /etc/sysconfig/nfs 中设置相关服务的选项。

例如,/etc/sysconfig/nfs 包含参数

MOUNTD_OPTIONS=""

要启用调试模式,您必须使用 -d 选项,后跟以下任何值:allauthcallgeneralparse

例如,以下代码启用所有形式的 rpc.mountd 日志记录

MOUNTD_OPTIONS="-d all"

有关所有可用选项,请参阅手册页

man 8 rpc.mountd

更改 /etc/sysconfig/nfs 后,需要重新启动服务

systemctl restart nfs-server  # for nfs server related changes
systemctl restart nfs  # for nfs client related changes
打印此页面