19 通过 NFS 共享文件系统 #
网络文件系统 (NFS) 是允许访问服务器上的文件的协议,访问方式与访问本地文件相似。
SUSE Linux Enterprise Server 会安装 NFS v4.2,后者引入了以下支持:稀疏文件、文件预分配、服务器端克隆和复制、应用程序数据块 (ADB) 和用于强制性访问控制 (MAC) 的带标签 NFS(客户端和服务器上均需要 MAC)。
19.1 概览 #
网络文件系统 (NFS) 是久经考验且受到广泛支持的标准化网络协议,它允许在不同的主机之间共享文件。
网络信息服务 (NIS) 可用于在网络中进行集中式用户管理。将 NFS 和 NIS 结合使用可通过文件和目录权限在网络中进行访问控制。NFS 与 NIS 一起使用时网络面向用户是透明的。
在默认配置中,NFS 完全信任网络,因此会信任连接到可信网络的任何计算机。在可通过物理方式访问 NFS 服务器所信任的任何网络的任何计算机上,任何具有管理员特权的用户都可以访问该服务器提供的所有文件。
一般而言,此安全性级别非常适于以下情形:所信任的网络是真正的专用网络,通常局限于单个计算机机柜或机房,并且无法进行未经授权的访问。其他情况下,将整个子网作为一个整体信任存在较大限制,需要更精密的信任机制。为了满足这些情形的需要,NFS 使用 Kerberos 基础架构来支持各种安全性级别。Kerberos 需要 NFSv4(默认使用该协议)。有关详细信息,请参见第 6 章 “使用 Kerberos 进行网络身份验证”。
下面是 YaST 模块中使用的术语。
- 导出
由 NFS 服务器导出的目录,客户端可将其集成到系统中。
- NFS 客户端
NFS 客户端是通过网络文件系统协议使用来自 NFS 服务器的 NFS 服务的系统。TCP/IP 协议已集成到 Linux 内核中;无需再安装任何其他软件。
- NFS 服务器
NFS 服务器向客户端提供 NFS 服务。运行中的服务器依赖于以下守护程序工作:
nfsd
(worker)、idmapd
(用于 NFSv4 的 ID 到名称映射,仅在某些场景下需要)、statd
(文件锁定)和mountd
(挂载请求)。- NFSv3
NFSv3 是版本 3 实施,支持客户端身份验证的“旧版”无状态 NFS。
- NFSv4
NFSv4 是新的版本 4 实施,支持通过 Kerberos 进行安全用户身份验证。NFSv4 只需要一个端口,因此,它比 NFSv3 更适合用于防火墙后的环境。
- pNFS
并行 NFS,属于 NFSv4 的一种协议扩展。任何 pNFS 客户端都可以直接访问 NFS 服务器上的数据。
从理论上讲,所有导出都可以仅使用 IP 地址来完成。为避免超时,您需要一个有效的 DNS 系统。至少为了日志记录目的也应使用 DNS,因为 mountd
守护程序执行反向查找。
19.2 安装 NFS 服务器 #
默认不会安装 NFS 服务器。要使用 YaST 安装 NFS 服务器,请依次选择
› 、 ,然后启用 部分的 选项。单击 安装所需软件包。该软件集不包含用于 NFS 服务器的 YaST 模块。完成软件集安装后,请运行以下命令安装该模块:
>
sudo
zypper in yast2-nfs-server
与 NIS 一样,NFS 也是一个客户端/服务器系统。但是,一台计算机可充当这两种角色:它可以通过网络提供文件系统(导出),也可以从其他主机装入文件系统(导入)。
SUSE Linux Enterprise Server 上不支持在导出服务器本地挂载 NFS 卷。
19.3 配置 NFS 服务器 #
可通过 YaST 配置 NFS 服务器,也可以手动配置它。NFS 还可与 Kerberos 结合来进行身份验证。
19.3.1 使用 YaST 导出文件系统 #
使用 YaST 将网络中的某台主机转换为 NFS 服务器,此服务器可将目录和文件导出到所有有权访问它的主机或导出到某个组的所有成员。因此,无需在每台主机本地安装应用程序,服务器也能提供应用程序。
要设置此类服务器,请继续执行以下步骤:
启动 YaST 并选择图 19.1 “NFS 服务器配置工具”。系统会提示您安装其他软件。
› ;请参见图 19.1︰ NFS 服务器配置工具 #单击
单选按钮。如果
firewalld
在系统上处于活动状态,请单独为 NFS 配置 firewalld(请参见第 19.5 节 “操作受到防火墙保护的 NFS 服务器和客户端”)。YaST 尚不完全支持firewalld
,因此请忽略“防火墙不可配置”消息并继续。选中是否注意:NFSv2。
。如果您停用 NFSv4,YaST 将只支持 NFSv3。有关启用 NFSv2 的信息,请参见如果选择 NFSv4,另外还请输入相应的 NFSv4 域名。
idmapd
守护程序会使用此参数。Kerberos 设置需要该守护程序,当客户端无法处理数字用户名时,也需要使用该守护程序。如果您不运行idmapd
或无任何特殊要求,请将它保留为localdomain
(默认值)。有关idmapd
守护程序的详细信息,请参见/etc/idmapd.conf
。重要:NFSv4 域名请注意,所有 NFSv4 客户端上也需要配置域名。只有域名与服务器相同的客户端才能访问服务器。服务器和客户端的默认域名为
localdomain
。
如果您需要安全访问服务器,请单击
。先决条件是您的域中安装了 Kerberos 并且服务器和客户端都已采用 Kerberos 系统。 单击 继续执行下一个配置对话框。单击对话框上半部分中的
以导出您的目录。如果您尚未配置允许的主机,系统会自动弹出另一个对话框及相应的选项,供您输入客户端信息。输入主机通配符(通常您可以保留默认值不变)。
可以为每个主机设置四种主机通配符:单个主机(名称或 IP 地址)、网络组、通配符(例如
*
表示所有计算机都能访问服务器)和 IP 网络。有关这些选项的更多信息,请参见
exports
手册页。单击
以完成配置。
19.3.2 手动导出文件系统 #
NFS 导出服务的配置文件是 /etc/exports
和 /etc/sysconfig/nfs
。如果 NFSv4 服务器配置包含经过 Kerberos 身份验证的 NFS,或者客户端不能使用数字用户名,则除了这些文件外,还需要 /etc/idmapd.conf
。
要启动或重启动服务,请运行命令 systemctl
restart nfs-server
。此命令还会重启动 NFS 服务器所需的 RPC 端口映射程序。
为确保 NFS 服务器始终都会在系统引导时启动,请运行 sudo systemctl enable nfs-server
。
NFSv4 是 SUSE Linux Enterprise Server 上可用的最新版 NFS 协议。现在,通过 NFSv4 导出所用的配置目录与通过 NFSv3 导出所用的目录相同。
在 SUSE Linux Enterprise Server 11 上,必须在 /etc/exports
中指定绑定挂载。该设置仍然受支持,但现在已弃用。
/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
中定义的网络组 (@my-hosts
)。有关所有选项及其含义的详细说明,请参见/etc/exports
的man
页:(man exports
)。如果您在 NFS 服务器运行时修改了
/etc/exports
,则需使用sudo systemctl restart nfs-server
命令重启动 NFS 服务器,以使更改生效。/etc/sysconfig/nfs
/etc/sysconfig/nfs
文件包含一些决定 NFSv4 服务器守护程序行为的参数。请务必将参数NFS4_SUPPORT
设置为yes
(默认值)。NFS4_SUPPORT
决定 NFS 服务器是否支持 NFSv4 导出和客户端。如果您在 NFS 服务器运行时修改了
/etc/sysconfig/nfs
,则需使用sudo systemctl restart nfs-server
命令重启动 NFS 服务器,以使更改生效。提示:挂载选项在 SUSE Linux Enterprise Server 11 上,必须在
/etc/exports
中指定--bind
挂载。该设置仍然受支持,但现在已弃用。现在,通过 NFSv4 导出所用的配置目录与通过 NFSv3 导出所用的目录相同。注意: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 或域中的任何统一的域身份验证机制来实现。
参数
Domain
必须在/etc/idmapd.conf
中设置。对于服务器和访问此服务器的所有 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
命令重启动守护程序,以使更改生效。有关详细信息,请参见
idmapd
和idmapd.conf
的手册页(man idmapd
和man idmapd.conf
)。
19.3.3 采用 Kerberos 的 NFS #
要对 NFS 使用 Kerberos 身份验证,必须启用通用安全服务 (GSS)。在初始 YaST NFS 服务器对话框中选择
。必须具有一个有效的 Kerberos 服务器才能使用此功能。YaST 不会设置服务器,而只使用所提供的功能。要使用 Kerberos 进行身份验证,除了 YaST 配置外,至少还须完成以下步骤才能运行 NFS 配置:请确保服务器和客户端都在同一 Kerberos 域中。它们必须访问相同的 KDC(密钥分发中心)服务器并共享其
krb5.keytab
文件(在任何计算机上的默认位置都是/etc/krb5.keytab
)。有关 Kerberos 的更多信息,请参见第 6 章 “使用 Kerberos 进行网络身份验证”。在客户端上运行
systemctl start rpc-gssd.service
启动 gssd 服务。在服务器上运行
systemctl start rpc-svcgssd.service
启动 svcgssd 服务。
要进行 Kerberos 身份验证,也需要在服务器上运行 idmapd
守护程序。有关详细信息,请参见/etc/idmapd.conf
。
有关配置采用 Kerberos 的 NFS 的更多信息,请参见第 19.7 节 “更多信息” 中的链接。
19.4 配置客户端 #
要将主机配置为 NFS 客户端,无需安装其他软件。将默认安装所有需要的软件包。
19.4.1 使用 YaST 导入文件系统 #
授权用户可以用 YaST NFS 客户端模块从 NFS 服务器将 NFS 目录挂载本地文件树。按如下所示继续:
启动 YaST NFS 客户端模块。
单击
选项卡中的 。输入 NFS 服务器的主机名、要导入的目录以及要在本地的哪个装入点装入此目录。使用 NFSv4 时,在
选项卡中选择 。另外, 必须包含 NFSv4 服务器所用的相同值。默认域为localdomain
。要对 NFS 使用 Kerberos 身份验证,必须启用 GSS 安全性。选择
。如果
firewalld
在系统上处于活动状态,请单独为 NFS 配置 firewalld(请参见第 19.5 节 “操作受到防火墙保护的 NFS 服务器和客户端”)。YaST 尚不完全支持firewalld
,因此请忽略“防火墙不可配置”消息并继续。单击
保存更改。
配置会写入 /etc/fstab
,并且指定的文件系统会挂载到系统。当您稍后启动 YaST 配置客户端时,它还将读取此文件中的现有配置。
在通过网络以 NFS 共享形式挂载根分区的(无磁盘)系统中,配置可供访问 NFS 共享的网络设备时需保持谨慎。
关闭或重引导系统时,默认的处理顺序是先关闭网络连接,然后卸载根分区。对于 NFS 根文件系统,此顺序会导致问题,因为在已停用与 NFS 共享的网络连接的情况下,根分区无法完全卸载。为防止系统停用相关的网络设备,请按第 23.4.1.2.5 节 “激活网络设备”中所述打开网络设备配置选项卡,然后在 窗格中选择 。
19.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。
nconnect
定义的不同
由于您可以在第一次挂载后关闭和打开连接,因此实际连接计数不必与 nconnect
的值相同。
19.4.2.1 使用自动挂载服务 #
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
来激活该设置。此示例中通过 NFS 挂载 /nfsmounts/localdata
(server1
的 /data
目录),通过 NFSv4 挂载 server2
的 /nfsmounts/nfs4mount
。
如果在 autofs 服务正在运行时编辑了 /etc/auto.master
文件,则必须使用 systemctl restart
autofs
重启动自动挂载器才能使更改生效。
19.4.2.2 手动编辑 /etc/fstab
#
/etc/fstab
中的典型 NFSv3 挂载项如下所示:
nfs.example.com:/data /local/path nfs rw,noauto 0 0
对于 NFSv 挂载,请在第三列中使用 nfs4
而不是 nfs
:
nfs.example.com:/data /local/pathv4 nfs4 rw,noauto 0 0
noauto
选项可禁止在启动时自动挂载文件系统。如果您要手动安装各文件系统,可以缩短只指定挂载点的安装命令:
>
sudo
mount /local/path
如果您没有输入 noauto
选项,系统的 init 脚本将在启动时处理这些文件系统的挂载。在这种情况下,您可以考虑添加选项 _netdev
,以防止脚本在网络可用之前尝试挂载共享。
19.4.3 并行 NFS (pNFS) #
NFS 是最老的协议之一,开发于上世纪八十年代。因此,如果您要共享小文件,NFS 通常能够满足需求。但是,当您要传送大文件或有大量的客户端要访问数据时,NFS 服务器会成为瓶颈,严重影响系统性能。这是因为文件迅速变大,而以太网的相对速度没有完全跟上这一变化。
当您向普通 NFS 服务器请求文件时,服务器会查找文件元数据、收集所有数据,并通过网络将数据传送到您的客户端。但是,无论文件的大小如何,性能瓶颈都会凸显出来:
如果是小文件,则大部分时间都花在收集元数据上。
如果是大文件,则大部分时间花在将数据从服务器传送到客户端上。
pNFS 或并行 NFS 则突破了此种限制,因为它将文件系统元数据从数据位置分离出来。因此,pNFS 需要两类服务器:
一个元数据或控制服务器,用于处理所有非数据流量
一个或多个存储服务器,用于存放数据
元数据和存储服务器组成单独一个逻辑 NFS 服务器。当客户端要读取或写入时,元数据服务器会告诉 NFSv4 客户端使用哪个存储服务器访问文件块。客户端可以直接访问该服务器上的数据。
SUSE Linux Enterprise Server 仅在客户端上支持 pNFS。
19.4.3.1 使用 YaST 配置 pNFS 客户端 #
请执行过程 19.2 “导入 NFS 目录”中所述的步骤,但选中 复选框以及可选的 。YaST 会执行所有必要步骤,并会在文件 /etc/exports
中写入所有必需的选项。
19.4.3.2 手动配置 pNFS 客户端 #
请参阅第 19.4.2 节 “手动导入文件系统”着手配置。大多数配置通过 NFSv4 服务器完成。对于 pNFS,唯一的区别是将 nfsvers
选项和元数据服务器 MDS_SERVER 添加到您的 mount
命令:
>
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
19.5 操作受到防火墙保护的 NFS 服务器和客户端 #
NFS 服务器与其客户端之间的通讯通过远程过程调用 (RPC) 进行。多个 RPC 服务(如挂载守护程序或文件锁定服务)是 Linux NFS 实现的一部分。如果服务器和客户端在防火墙的保护下运行,则需要将这些服务和防火墙配置为不阻止客户端与服务器间的通讯。
NFS 4 服务器向后兼容 NFS 版本 3,两个版本的防火墙配置不同。如有任何客户端使用 NFS 3 来挂载共享,请将防火墙配置为同时允许 NFS 4 和 NFS 3。
19.5.1 NFS 4.x #
NFS 4 要求仅在服务器端打开 TCP 端口 2049。要在防火墙上打开此端口,请在 NFS 服务器上的 firewalld 中启用 nfs
服务:
>
sudo
firewall-cmd --permanent --add-service=nfs --zone=ACTIVE_ZONE firewall-cmd --reload
将 ACTIVE_ZONE 替换为 NFS 服务器上使用的防火墙区域。
使用 NFSv4 时,不需要在客户端进行额外的防火墙配置。默认情况下,挂载默认使用支持的最高 NFS 版本,因此,如果客户端支持 NFSv4,则共享将自动挂载为版本 4.2。
19.5.2 NFS 3 #
NFS 3 需要使用以下服务:
portmapper
nfsd
mountd
lockd
statd
默认情况下,这些服务由 rpcbind
操作,后者会动态分配端口。要允许访问这些受到防火墙保护的服务,需要先将它们配置为通过静态端口运行。之后需要在防火墙中打开这些端口。
portmapper
在 SUSE Linux Enterprise Server 上,
portmapper
已配置为通过静态端口运行。端口
111
协议
TCP、UDP
运行位置
客户端、服务器
>
sudo
firewall-cmd --add-service=rpc-bind --permanent --zone=ACTIVE_ZONEnfsd
在 SUSE Linux Enterprise Server 上,
nfsd
已配置为通过静态端口运行。端口
2049
协议
TCP、UDP
运行位置
服务器
>
sudo
firewall-cmd --add-service=nfs3 --permanent --zone=ACTIVE_ZONEmountd
在 SUSE Linux Enterprise Server 上,
mountd
已配置为通过静态端口运行。端口
20048
协议
TCP、UDP
运行位置
服务器
>
sudo
firewall-cmd --add-service=mountd --permanent --zone=ACTIVE_ZONElockd
要为
lockd
设置静态端口,请执行以下操作:在服务器上编辑
/etc/sysconfig/nfs
,并查找和设置以下项LOCKD_TCPPORT=NNNNN LOCKD_UDPPORT=NNNN
请见 NNNNN 替换为所选的未使用端口。对两种协议使用相同的端口。
重启动 NFS 服务器:
>
sudo
systemctl restart nfs-server
端口
NNNNN
协议
TCP、UDP
运行位置
客户端、服务器
>
sudo
firewall-cmd --add-port=NNNNN/{tcp,udp} --permanent --zone=ACTIVE_ZONEstatd
要为
statd
设置静态端口,请执行以下操作:在服务器上编辑
/etc/sysconfig/nfs
,并查找和设置以下项STATD_PORT=NNNNN
请见 NNNNN 替换为所选的未使用端口。
重启动 NFS 服务器:
>
sudo
systemctl restart nfs-server
端口
NNNNN
协议
TCP、UDP
运行位置
客户端、服务器
>
sudo
firewall-cmd --add-port=NNNNN/{tcp,udp} --permanent --zone=ACTIVE_ZONE
firewalld
配置
每次更改 firewalld
配置后,都需要重新加载该守护程序以使更改生效:
>
sudo
firewall-cmd --reload
确保将 ACTIVE_ZONE 替换为相应计算机上使用的防火墙区域。请注意,不同计算机的有效区域可能会因防火墙配置而异。
19.6 管理 NFSv4 访问控制列表 #
在 Linux 中,除了针对用户、组和其他人 (ugo
) 的读取、写入、执行 (rwx
) 这些简单标志之外,各访问控制列表 (ACL) 没有统一的标准。控制能力相对较好的一个选择是Draft POSIX ACLs《》(POSIX ACL 草稿),它尚未得到 POSIX 的正式标准化。另一个选择是 NFSv4 ACL,它是 NFSv4 网络文件系统的一部分,目的是为了在 Linux 上的 POSIX 系统与 Microsoft Windows 上的 WIN32 系统之间提供适当的兼容性。
NFSv4 ACL 不足以正确实施草稿 POSIX ACL,因此未进行在 NFSv4 客户端上映射 ACL 访问的尝试(比如使用 setfacl
)。
使用 NFSv4 时,无法使用 Draft POSIX ACL(即使在仿真环境中),必须直接使用 NFSv4 ACL。这表示,虽然 setfacl
可以在 NFSv3 上运行,却无法在 NFSv4 上运行。为了能够在 NFSv4 文件系统上使用 NFSv4 ACL,SUSE Linux Enterprise Server 提供了 nfs4-acl-tools
软件包,其中包含下列各项:
nfs4-getfacl
nfs4-setfacl
nfs4-editacl
这些命令的工作方式大体上与用于检查和修改 NFSv4 ACL 的 getfacl
和 setfacl
类似。仅当 NFS 服务器上的文件系统提供对 NFSv4 ACL 的全面支持时,这些命令才有效。虽然某些访问控制项 (ACE) 的特定组合可能在客户端中不可用,但客户端上运行的程序都将受到服务器施加的任何限制的影响。
不支持在输出 NFS 服务器上本地挂载 NFS 卷。
附加信息#
有关信息,请参见 Introduction to NFSv4 ACLs,网址为:https://wiki.linux-nfs.org/wiki/index.php/ACLs#Introduction_to_NFSv4_ACLs。
19.7 更多信息 #
除了 exports
、nfs
和 mount
的手册页外,还可在 /usr/share/doc/packages/nfsidmap/README
中找到关于配置 NFS 服务器和客户端的信息。有关更多联机文档,请参见以下网站:
有关网络安全的一般信息,请参见第 23 章 “伪装和防火墙”。
如果您需要自动挂载 NFS 导出,请参见第 21.4 节 “自动挂载 NFS 共享”。
有关使用 AutoYaST 配置 NFS 的更多细节,请参见第 4.21 节 “NFS 客户端和服务器”。
有关使用 Kerberos 保护 NFS 导出的说明,请参见第 6.6 节 “Kerberos 和 NFS”。
在 SourceForge 上联机查找详细的技术文档。
19.8 收集信息以供 NFS 查错 #
19.8.1 常见查错 #
某些情况下,您可以通过查看生成的错误消息并检查 /var/log/messages
文件来了解 NFS 中的问题。但很多时候,错误消息和 /var/log/messages
中提供的信息不够详细。在这些情况下,可通过再现问题时捕获网络数据包来充分了解大部分 NFS 问题。
明确定义问题。通过以各种方式测试系统并确定发生问题的时间来检查问题。隔离会导致问题的最简单步骤。然后尝试按照下面的过程再现问题。
捕获网络数据包。在 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 地址,反之亦然。
注意在某些情况下,只需在 NFS 客户端或 NFS 服务器任一端捕获数据就足够了。但如果不确定端到端网络的完整性,则通常需要在两端捕获数据。
不要关闭
tcpdump
进程,继续执行下一步。(可选)如果问题发生在
nfs mount
命令本身执行过程中,您可以尝试使用nfs mount
命令的高详细程度选项 (-vvv
) 来获得更多输出。(可选)获取再现方法的
strace
。再现步骤的strace
精确记录了发生系统调用的确切时间。此信息可用于进一步确定您应关注tcpdump
中的哪些事件。例如,如果您发现在 NFS 挂载上执行 mycommand --param 命令失败,则可以使用以下命令来
strace
命令:strace -ttf -s128 -o/tmp/nfs-strace.out mycommand --param
如果您未获得任何再现步骤的
strace
,请注意问题的再现时间。检查/var/log/messages
日志文件以找出问题。一旦问题再现,按 CTRL–c 来停止在终端中运行的
tcpdump
。如果strace
命令导致挂起,还需终止strace
命令。现在,具有数据包跟踪记录和
strace
数据分析经验的管理员可以检查/tmp/nfs-demo.cap
和/tmp/nfs-strace.out
中的数据。
19.8.2 高级 NFS 调试 #
请注意,以下部分仅适用于了解 NFS 代码的高技能 NFS 管理员。因此,请执行第 19.8.1 节 “常见查错”中所述的第一步,以帮助缩小问题范围,并告知专家可能需要哪些方面的调试代码(如果有)才能了解更深入的细节。
可启用各种调试代码来收集额外的 NFS 相关信息。不过,调试消息非常晦涩难懂,并且数据量巨大,因此使用调试代码可能会影响系统性能。它甚至有可能对系统产生的影响大到足以防止问题的发生。大多数情况下都不需要调试代码输出,对于不太熟悉 NFS 代码的人来说,通常也没什么用。
19.8.2.1 使用 rpcdebug
激活调试 #
rpcdebug
工具可让您设置和清除 NFS 客户端和服务器调试标志。如果您安装的 SUSE Linux Enterprise Server 中未提供 rpcdebug
工具,可以使用 nfs-client 或 nfs-kernel-server(适用于 NFS 服务器)软件包安装此工具。
要设置调试标志,请运行:
rpcdebug -m module -s flags
要清除调试标志,请运行:
rpcdebug -m module -c flags
其中,module 可以是:
- nfsd
NFS 服务器代码的调试
- nfs
NFS 客户端代码的调试
- nlm
NFS 锁管理器调试(在 NFS 客户端或 NFS 服务器端)。仅适用于 NFS v2/v3。
- rpc
远程过程调用模块调试(在 NFS 客户端或 NFS 服务器端)。
有关 rpcdebug
命令详细用法的信息,请参见手册页:
man 8 rpcdebug
19.8.2.2 针对 NFS 所依赖的其他代码激活调试 #
NFS 活动可能依赖于其他相关服务,例如 NFS 挂载守护程序—rpc.mountd
。您可以在 /etc/sysconfig/nfs
中为相关服务设置选项。
例如,/etc/sysconfig/nfs
包含以下参数:
MOUNTD_OPTIONS=""
要启用调试模式,必须使用 -d
选项,后跟以下任何值:all
、auth
、call
、general
或 parse
。
例如,以下代码可启用所有形式的 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