系统管理指南:网络服务

第 6 章 访问网络文件系统(参考)

本章介绍 NFS 命令,以及 NFS 环境的各个部分和这些部分协同工作的方式。


注 –

如果系统启用了区域并且您要在非全局区域中使用此功能,请参见《系统管理指南:Solaris Containers-资源管理和 Solaris Zones》以了解更多信息。


NFS 文件

任何计算机上的 NFS 活动都需要若干文件来支持。其中许多文件是 ASCII 文件,但也有一些文件是数据文件。表 6–1 中列出了这些文件及其功能。

表 6–1 NFS 文件

文件名 

功能 

/etc/default/autofs

列出 autofs 环境的配置信息。 

/etc/default/fs

列出本地文件系统的缺省文件系统类型。 

/etc/default/nfs

列出 lockdnfsd 的配置信息。有关更多信息,请参阅/etc/default/nfs 文件的关键字nfs(4) 手册页。

/etc/default/nfslogd

列出 NFS 服务器日志记录守护进程 nfslogd 的配置信息。

/etc/dfs/dfstab

列出要共享的本地资源。 

/etc/dfs/fstypes

列出远程文件系统的缺省文件系统类型。 

/etc/dfs/sharetab

列出共享的本地资源和远程资源。请参见 sharetab(4) 手册页。请勿编辑此文件。

/etc/mnttab

列出当前挂载的文件系统,包括自动挂载的目录。请参见 mnttab(4) 手册页。请勿编辑此文件。

/etc/netconfig

列出传输协议。请勿编辑此文件。

/etc/nfs/nfslog.conf

列出 NFS 服务器日志记录的常规配置信息。 

/etc/nfs/nfslogtab

列出与 nfslogd 进行日志后期处理相关的信息。请勿编辑此文件。

/etc/nfssec.conf

列出 NFS 安全服务。 

/etc/rmtab

列出由 NFS 客户机远程挂载的文件系统。请参见 rmtab(4) 手册页。请勿编辑此文件。

/etc/vfstab

定义要本地挂载的文件系统。请参见 vfstab(4) 手册页。

/etc/dfs/fstypes 中的第一项通常用作远程文件系统的缺省文件系统类型。此项将 NFS 文件系统类型定义为缺省类型。

/etc/default/fs 中只有一项:本地磁盘的缺省文件系统类型。通过检查 /kernel/fs 中的文件,可以确定客户机或服务器支持的文件系统类型。

/etc/default/autofs 文件

从 Solaris 10 发行版开始,可以使用 /etc/default/autofs 文件来配置 autofs 环境。具体来说,此文件提供了配置 autofs 命令和 autofs 守护进程的其他方法。在命令行上制定的规范也可以通过此配置文件实现。但是,与在命令行上制定的规范不同的是,此文件将保留您的规范,即使在向您的操作系统升级时也是如此。另外,不再需要更新关键的启动文件即可确保保留 autofs 环境的现有行为。可通过为以下关键字提供值来制定规范:

AUTOMOUNT_TIMEOUT

设置在取消挂载文件系统之前文件系统保持空闲的持续时间。此关键字与 automount 命令的 -t 参数等效。缺省值为 600。

AUTOMOUNT_VERBOSE

提供有关 autofs 挂载、取消挂载和其他不重要事件的通知。此关键字与 automount-v 参数等效。缺省值为 FALSE。

AUTOMOUNTD_VERBOSE

将状态消息记录到控制台。此关键字与 automountd 守护进程的 -v 参数等效。缺省值为 FALSE。

AUTOMOUNTD_NOBROWSE

针对所有 autofs 挂载点打开或关闭浏览功能。此关键字与 automountd-n 参数等效。缺省值为 FALSE。

AUTOMOUNTD_TRACE

扩展每个远程过程调用 (remote procedure call, RPC) 并在标准输出中显示扩展的 RPC。此关键字与 automountd-T 参数等效。缺省值为 0。取值范围为 0 到 5。

AUTOMOUNTD_ENV

允许您将不同的值指定给不同的环境。此关键字与 automountd-D 参数等效。可以多次使用 AUTOMOUNTD_ENV 关键字。但是,必须对每个环境赋值使用单独的行。

有关更多信息,请参阅 automount(1M)automountd(1M) 手册页。有关过程信息,请参阅如何使用 /etc/default/autofs 文件

/etc/default/nfs 文件的关键字

在 NFS 版本 4 中,可以在 /etc/default/nfs 文件中设置以下关键字。这些关键字控制客户机和服务器使用的 NFS 协议。

NFS_SERVER_VERSMIN

设置要注册且由服务器提供的 NFS 协议的最低版本。从 Solaris 10 发行版开始,缺省值为 2。其他有效值包括 3 或 4。请参阅设置 NFS 服务

NFS_SERVER_VERSMAX

设置要注册且由服务器提供的 NFS 协议的最高版本。从 Solaris 10 发行版开始,缺省值为 4。其他有效值包括 2 或 3。请参阅设置 NFS 服务

NFS_CLIENT_VERSMIN

设置由 NFS 客户机使用的 NFS 协议的最低版本。从 Solaris 10 发行版开始,缺省值为 2。其他有效值包括 3 或 4。请参阅设置 NFS 服务

NFS_CLIENT_VERSMAX

设置由 NFS 客户机使用的 NFS 协议的最高版本。从 Solaris 10 发行版开始,缺省值为 4。其他有效值包括 2 或 3。请参阅设置 NFS 服务

NFS_SERVER_DELEGATION

控制是否对服务器启用 NFS 版本 4 委托功能。如果启用此功能,则服务器将尝试对 NFS 版本 4 客户机提供委托。缺省情况下,会启用服务器委托。要禁用服务器委托,请参见如何在服务器上选择不同版本的 NFS。有关更多信息,请参阅NFS 版本 4 的委托

NFSMAPID_DOMAIN

为客户机和服务器设置公共域。将覆盖使用本地 DNS 域名的缺省行为。有关任务信息,请参阅设置 NFS 服务。另请参见nfsmapid 守护进程

/etc/default/nfslogd 文件

此文件定义了使用 NFS 服务器日志记录时所使用的某些参数。可以定义以下参数。

CYCLE_FREQUENCY

确定在循环使用日志文件之前必须经过的小时数。 缺省值为 24 小时。此选项用于防止日志文件变得太大。

IDLE_TIME

设置 nfslogd 在检查缓冲区文件中是否存在更多信息之前应处于休眠状态的秒数。此参数还确定检查配置文件的频率。此参数与 MIN_PROCESSING_SIZE 一同确定处理缓冲区文件的频率。缺省值为 300 秒。增加该秒数即可通过减少检查次数来提高性能。

MAPPING_UPDATE_INTERVAL

指定对 file-handle-to-path 映射表中的记录进行更新的间隔秒数。缺省值为 86400 秒,即一天。此参数有助于保持 file-handle-to-path 映射表始终处于最新状态,而不必不断更新这些表。

MAX_LOGS_PRESERVE

确定要保存的日志文件数目。缺省值为 10。

MIN_PROCESSING_SIZE

设置在处理和写入日志文件之前缓冲区文件必须达到的最小字节数目。此参数与 IDLE_TIME 一同确定处理缓冲区文件的频率。缺省值为 524288 字节。增加该字节数即可通过减少处理缓冲区文件的次数来提高性能。

PRUNE_TIMEOUT

选择 file-handle-to-path 映射记录超时之前必须经过的、并可以缩减的小时数。缺省值为 168 小时,即 7 天。

UMASK

nfslogd 创建的日志文件指定文件模式创建掩码。缺省值为 0137。

/etc/nfs/nfslog.conf 文件

此文件定义了 nfslogd 使用的日志记录的路径、文件名和类型。每个定义都与 tag 相关联。启动 NFS 服务器日志记录时,需要您标识每个文件系统的 tag。全局标记定义了缺省值。可以根据需要将各个标记与以下参数一起使用。

defaultdir=path

指定日志记录文件的缺省目录路径。除非您指定了不同的目录,否则缺省目录为 /var/nfs

log=path/filename

设置日志文件的路径和文件名。缺省值为 /var/nfs/nfslog

fhtable=path/filename

选择文件句柄到路径数据库文件的路径和文件名。缺省值为 /var/nfs/fhtable

buffer=path/filename

确定缓冲区文件的路径和文件名。缺省值为 /var/nfs/nfslog_workbuffer

logformat=basic|extended

选择创建用户可读日志文件时使用的格式。基本 (basic) 格式产生的日志文件与某些 ftpd 守护进程类似。扩展 (extended) 格式提供了更详细的视图。

如果未指定路径,则将使用由 defaultdir 定义的路径。另外,还可以使用绝对路径覆盖 defaultdir

为了更容易地识别文件,请将文件置于单独的目录中。下面的示例列出了所需的更改。


% cat /etc/nfs/nfslog.conf

#ident  "@(#)nfslog.conf        1.5     99/02/21 SMI"

#

  .

  .

# NFS server log configuration file.

#



global  defaultdir=/var/nfs \

        log=nfslog fhtable=fhtable buffer=nfslog_workbuffer



publicftp log=logs/nfslog fhtable=fh/fhtables buffer=buffers/workbuffer

在本示例中,以 log=publicftp 形式共享的任何文件系统都使用以下值:

有关过程信息,请参阅如何启用 NFS 服务器日志记录

NFS 守护进程

为了支持 NFS 活动,在系统进入运行级 3 或多用户模式时将启动多个守护进程。mountdnfsd 守护进程在作为服务器的系统上运行。服务器守护进程的自动启动取决于 /etc/dfs/sharetab 中是否存在带有 NFS 文件系统类型标记的项。为了支持 NFS 文件锁定,应该在 NFS 客户机和服务器上运行 lockdstatd 守护进程。但是,与以前版本的 NFS 不同的是,在 NFS 版本 4 中,不使用守护进程 lockdstatdmountdnfslogd

本节介绍以下守护进程。

automountd 守护进程

该守护进程处理来自 autofs 服务的挂载和取消挂载请求。此命令的语法如下:

automountd [ -Tnv ] [ -D name=value ]

该命令采用以下几种方式运行:

自动挂载映射的缺省值为 /etc/auto_master。可使用 -T 选项进行故障排除。

lockd 守护进程

此守护进程支持对 NFS 文件的记录锁定操作。lockd 守护进程针对网络锁定管理器 (Network Lock Manager, NLM) 协议管理客户机与服务器之间的 RPC 连接。该守护进程通常不使用任何选项即可启动。可将三个选项与此命令一起使用。请参见 lockd(1M) 手册页。可以在命令行中或通过编辑 /etc/default/nfs 中的相应字符串来使用这些选项。以下是可在 /etc/default/nfs 文件中设置的关键字的说明。


注 –

从 Solaris 10 发行版开始,LOCKD_GRACE_PERIOD 关键字和 -g 选项已过时。过时的关键字将由新的关键字 GRACE_PERIOD 取代。 如果同时设置了这两个关键字,则 GRACE_PERIOD 的值将覆盖 LOCKD_GRACE_PERIOD 的值。 请参见以下有关 GRACE_PERIOD 的说明。


LOCKD_GRACE_PERIOD 类似,/etc/default/nfs 中的 GRACE_PERIOD=graceperiod 设置服务器重新引导后客户机回收 NFS 版本 3 锁定(由 NLM 提供)和版本 4 锁定所需的秒数。 因此,GRACE_PERIOD 的值可控制 NFS 版本 3 和 NFS 版本 4 锁定恢复的宽延期长度。

/etc/default/nfs 中的 LOCKD_RETRANSMIT_TIMEOUT=timeout 参数选择将锁定请求重新传输到远程服务器之前等待的秒数。此选项将影响 NFS 客户端服务。timeout 的缺省值为 15 秒。减小 timeout 值可以改善“嘈杂”网络上的 NFS 客户机的响应时间。但是,这种更改可能会增大锁定请求的频率,进而会导致增加服务器负载。使用 -t timeout 选项来启动该守护进程,即可在命令行中使用相同的参数。

/etc/default/nfs 中的 LOCKD_SERVERS=nthreads 参数指定服务器每个连接可处理的并发线程的最大数目。应根据 NFS 服务器上的预期负载来确定 nthreads 的值。缺省值为 20。使用 TCP 的每台 NFS 客户机都使用与 NFS 服务器的单一连接。因此,每台客户机最多可使用服务器上的 20 个并发线程。

使用 UDP 的所有 NFS 客户机都共享与 NFS 服务器之间的单一连接。在上述情况下,可能必须增加可用于 UDP 连接的线程数。对于每个 UDP 客户机而言,至少要有两个线程。但是,此数目具体取决于客户机上的工作负荷,因此每台客户机两个线程可能是不够的。使用更多线程的缺点是:使用线程越多,占用的 NFS 服务器内存就越多。但是,如果从不使用线程,则增加 nthreads 没有任何效果。通过使用 nthreads 选项来启动该守护进程,即可在命令行中使用相同的参数。

mountd 守护进程

该守护进程处理来自远程系统的文件系统挂载请求并提供访问控制。mountd 守护进程将检查 /etc/dfs/sharetab,以确定哪些文件系统可用于远程挂载,以及哪些系统被允许执行远程挂载。可以将 -v 选项和 -r 选项与此命令结合使用。请参见 mountd(1M) 手册页。

-v 选项以详细模式运行该命令。NFS 服务器每次确定应授予客户机的访问权限时,都会在控制台上列显一条消息。在尝试确定客户机为何不能访问文件系统时,生成的信息可能非常有用。

-r 选项拒绝来自客户机的所有未来的挂载请求。此选项不会影响已挂载文件系统的客户机。


注 –

NFS 版本 4 不使用该守护进程。


nfs4cbd 守护进程

nfs4cbd 专供 NFS 版本 4 客户机使用,可管理 NFS 版本 4 回叫程序的通信端点。该守护进程没有用户可访问的接口。有关更多信息,请参见 nfs4cbd(1M) 手册页。

nfsd 守护进程

该守护进程可处理其他客户机文件系统请求。可以将多个选项与此命令一起使用。有关完整列表,请参见 nfsd(1M) 手册页。可以在命令行中或通过编辑 /etc/default/nfs 中的相应字符串来使用这些选项。

/etc/default/nfs 中的 NFSD_LISTEN_BACKLOG=length 参数为 NFS 和 TCP 设置基于面向连接的传输的连接队列的长度。缺省值为 32 项。使用 -l 选项来启动 nfsd,即可在命令行中执行相同的选择。

/etc/default/nfs 中的 NFSD_MAX_CONNECTIONS=#_conn 参数选择每个面向连接的传输选择最大连接数。#_conn 的缺省值没有限制。使用 -c #_conn 选项来启动该守护进程,即可在命令行中使用相同的参数。

/etc/default/nfs 中的 NFSD_SERVER=nservers 参数选择服务器可以处理的并发请求的最大数目。nservers 的缺省值为 16。使用 nservers 选项来启动 nfsd,即可在命令行中执行相同的选择。

与旧版本的该守护进程不同的是,nfsd 不会产生用于处理并发请求的多个副本。使用 ps 检查进程表时,将仅显示正在运行的守护进程的一个副本。

nfslogd 守护进程

该守护进程提供有关操作的日志记录。服务器上的哪些 NFS 操作将写入记录,取决于 /etc/default/nfslogd 中定义的配置选项。启用 NFS 服务器日志记录时,选定文件系统上的所有 RPC 操作的记录将由内核写入缓冲区文件。然后,nfslogd 将对这些请求进行后期处理。名称服务转换器用于帮助将 UID 映射为登录名,并将 IP 地址映射为主机名。如果无法通过确定的名称服务找到任何匹配项,则将记录该数字。

还可以通过 nfslogd 来处理文件句柄到路径名的映射。该守护进程将跟踪文件句柄到路径映射表中的这些映射。对于在 /etc/nfs/nfslogd 中标识的每个标记,都存在一个映射表。经过后期处理后,这些记录将被写入 ASCII 日志文件中。


注 –

NFS 版本 4 不使用该守护进程。


nfsmapid 守护进程

版本 4 的 NFS 协议 (RFC3530) 更改了用户标识符或组标识符(UID 或 GID)在客户机与服务器之间的交换方式。该协议要求分别采用 user@nfsv4_domaingroup@nfsv4_domain 格式将文件的属主属性和组属性作为字符串在 NFS 版本 4 客户机与 NFS 版本 4 服务器之间进行交换。

例如,用户 known_user 在 NFS 版本 4 客户机上具有 UID 123456,该客户机的完全限定主机名为 system.example.com。客户机为了向 NFS 版本 4 服务器发出请求,必须将 UID 123456 映射为 known_user@example.com,然后将此属性发送到 NFS 版本 4 服务器。NFS 版本 4 服务器希望接收 user_or_group@nfsv4_domain 格式的用户和组文件属性。服务器从客户机收到 known_user@example.com 后,就会将该字符串映射为基础文件系统可以识别的本地 UID 123456。此功能假设网络中的每个 UID 和 GID 都是唯一的,并且客户机中的 NFS 版本 4 域与服务器上的 NFS 版本 4 域匹配。


注 –

如果服务器不能识别给定的用户名或组名,即使 NFS 版本 4 域匹配,服务器也不能将该用户名或组名映射为其唯一 ID(整数值)。在这类情况下,服务器会将传入的用户名或组名映射为 nobody 用户。为了防止这类情况出现,管理员应避免创建仅在 NFS 版本 4 客户机上存在的特殊帐户。


NFS 版本 4 客户机和服务器都能执行整数到字符串和字符串到整数的转换。例如,在对 GETATTR 操作进行响应时,NFS 版本 4 服务器会将从基础文件系统获取的 UID 和 GID 映射到其各自的字符串说明中,并将此信息发送到客户机。或者,客户机还必须将 UID 和 GID 映射到字符串说明中。例如,在对 chown 命令进行响应时,客户机在将 SETATTR 操作发送到服务器之前会先将新的 UID 或 GID 映射到字符串说明中。

但是请注意,客户机和服务器将以不同的方式对不能识别的字符串做出响应:

配置文件和 nfsmapid

下面介绍了 nfsmapid 守护进程使用 /etc/nsswitch.conf/etc/resolv.conf 文件的方式:

优先级规则

为了使 nfsmapid 能正常工作,NFS 版本 4 客户机和服务器必须具有相同的域。为了确保与 NFS 版本 4 域匹配,nfsmapid 将遵循以下严格的优先级规则:

  1. 守护进程首先从 /etc/default/nfs 文件中查找已为 NFSMAPID_DOMAIN 关键字指定的值。如果找到了值,则指定的值将优先于其他任何设置。指定的值被附加到外发属性字符串上,并与传入属性字符串进行比较。有关 /etc/default/nfs 文件中的关键字的更多信息,请参见/etc/default/nfs 文件的关键字。有关过程信息,请参见设置 NFS 服务


    注 –

    使用 NFSMAPID_DOMAIN 设置不具备可伸缩性,因此建议不要用于大型部署。


  2. 如果未对 NFSMAPID_DOMAIN 指定值,则守护进程会从 DNS TXT RR 中查找域名。nfsmapid 将依赖于 /etc/resolv.conf 文件中由 resolver 中的一组例程所使用的指令。resolver 将在已配置的 DNS 服务器中搜索 _nfsv4idmapdomain TXT RR。请注意,使用 DNS TXT 记录具备更强的伸缩性。出于此原因,继续使用 TXT 记录比在 /etc/default/nfs 文件中设置关键字更好。

  3. 如果没有提供域名的 DNS TXT 记录,则在缺省情况下 nfsmapid 守护进程将使用已配置的 DNS 域。

  4. 如果 /etc/resolv.conf 文件不存在,则 nfsmapid 将按照 domainname 命令的行为获取 NFS 版本 4 域名。具体来说,如果 /etc/defaultdomain 文件存在,则 nfsmapid 将使用与 NFS 版本 4 域对应的文件的内容。如果 /etc/defaultdomain 文件不存在,则 nfsmapid 将使用由网络的已配置命名服务提供的域名。有关更多信息,请参见 domainname(1M) 手册页。

nfsmapid 和 DNS TXT 记录

DNS 普遍存在的这一特性为 NFS 版本 4 域名提供了有效的存储和分配机制。此外,由于 DNS 固有的可伸缩性,因此使用 DNS TXT 资源记录是为大型部署配置 NFS 版本 4 域名的首选方法。您应该在企业级 DNS 服务器上配置 _nfsv4idmapdomain TXT 记录。这类配置可确保任何 NFS 版本 4 客户机或服务器都能通过遍历 DNS 树找到其 NFS 版本 4 域。

以下是用于使 DNS 服务器能够提供 NFS 版本 4 域名的首选项的示例:


_nfsv4idmapdomain		IN		TXT			"foo.bar"

在本示例中,要配置的域名是用双引号引起来的值。请注意未指定 ttl 字段,且未将域附加到 _nfsv4idmapdomain(是 owner 字段中的值)中。此配置使 TXT 记录能够使用区域的颁发机构开始 (Start-Of-Authority, SOA) 记录中的 ${ORIGIN} 项。例如,在域名称空间的不同层次上,该记录的值可能为:


_nfsv4idmapdomain.subnet.yourcorp.com.    IN    TXT    "foo.bar"

_nfsv4idmapdomain.yourcorp.com.           IN    TXT    "foo.bar"

在使用 resolv.conf 文件搜索 DNS 树分层结构方面,此配置为 DNS 客户机提供了更大的灵活性。请参见 resolv.conf(4) 手册页。此功能提高了找到 TXT 记录的概率。为了获得更大的灵活性,较低层的 DNS 子域可以定义其各自的 DNS TXT 资源记录 (resource record, RR)。此功能使较低层的 DNS 子域可以覆盖由顶层 DNS 域定义的 TXT 记录。


注 –

TXT 记录指定的域可以是任意字符串,该字符串不一定与使用 NFS 版本 4 的客户机和服务器的 DNS 域匹配。您可以选择不与其他 DNS 域共享 NFS 版本 4 数据。


在 Solaris 10 发行版中配置 NFS 版本 4 缺省域

从 NFS 版本 4 的 Solaris 10 发行版开始,如果您的网络包括多个 DNS 域,但只有单个 UID 和 GID 名称空间,则所有的客户机都必须对 NFSMAPID_DOMAIN 使用一个值。 对于使用 DNS 的站点,nfsmapid 将通过从为 _nfsv4idmapdomain 指定的值中获取域名来解决此问题。有关更多信息,请参见nfsmapid 和 DNS TXT 记录。如果未将网络配置为使用 DNS,则在首次引导系统期间,Solaris OS 将使用 sysidconfig 实用程序为 NFS 版本 4 域名提供以下提示:


This system is configured with NFS version 4, which uses a 

domain name that is automatically derived from the system's 

name services. The derived domain name is sufficient for most 

configurations. In a few cases, mounts that cross different 

domains might cause files to be owned by nobody due to the 

lack of a common domain name.



Do you need to override the system's default NFS verion 4 domain 

name (yes/no)? [no]

缺省响应为 [no]。如果选择 [no],则将看到以下信息:


For more information about how the NFS version 4 default domain name is 

derived and its impact, refer to the man pages for nfsmapid(1M) and 

nfs(4), and the System Administration Guide: Network Services.

如果选择 [yes],则将看到以下提示:


Enter the domain to be used as the NFS version 4 domain name.

NFS version 4 domain name []:

注 –

如果 NFSMAPID_DOMAIN 的值存在于 /etc/default/nfs 中,则您提供的 [domain_name] 将覆盖该值。


有关 nfsmapid 的其他信息

有关 nfsmapid 的更多信息,请参见以下内容:

statd 守护进程

该守护进程使用 lockd 为锁定管理器提供崩溃和恢复功能。statd 守护进程可跟踪在 NFS 服务器上保存锁定的客户机。如果服务器崩溃,则在重新引导时,服务器上的 statd 将与客户机上的 statd 进行联系。随后,客户机 statd 便会尝试回收服务器上的所有锁定。客户机 statd 还会通知服务器 statd 客户机发生崩溃的时间,以便可以清除服务器上的客户机锁定。使用此守护进程时没有可选择的选项。有关更多信息,请参见 statd(1M) 手册页。

在 Solaris 7 发行版中,statd 跟踪客户机的方式已改进。在所有早期的 Solaris 发行版中,statd 使用客户机的未限定主机名在 /var/statmon/sm 中为每台客户机创建文件。如果两台客户机在不同的域中,且共享同一主机名,或者如果客户机与 NFS 服务器不在同一个域中,则此文件命名将导致问题。由于未限定的主机名仅列出主机名,而不含任何域或 IP 地址信息,因此旧版本的 statd 无法区分这些类型的客户机。为了解决此问题,Solaris 7 statd 使用客户机的 IP 地址在 /var/statmon/sm 中创建了一个指向未限定主机名的符号链接。新的链接如下所示:


# ls -l /var/statmon/sm

lrwxrwxrwx   1 daemon          11 Apr 29 16:32 ipv4.192.168.255.255 -> myhost

lrwxrwxrwx   1 daemon          11 Apr 29 16:32 ipv6.fec0::56:a00:20ff:feb9:2734 -> v6host

--w-------   1 daemon          11 Apr 29 16:32 myhost

--w-------   1 daemon          11 Apr 29 16:32 v6host

在本示例中,客户机主机名为 myhost,客户机的 IP 地址为 192.168.255.255。如果另一台名为 myhost 的主机正在挂载文件系统,则两个符号链接都将指向该主机名。


注 –

NFS 版本 4 不使用该守护进程。


NFS 命令

必须以超级用户身份运行这些命令才能使其完全生效,但是所有的用户都可以发出信息请求:

automount 命令

此命令将安装 autofs 挂载点并将 automaster 文件中的信息与每个挂载点相关联。命令的语法如下:

automount [ -t duration ] [ -v ]

-t duration 用于设置文件系统持续处于挂载状态的时间(以秒为单位),而 -v 用于选择详细模式。在详细模式下运行此命令可以更容易地排除故障。

如果未明确地进行设置,则持续时间值将被设置为 5 分钟。在多数情况下,该值是合适的。但是,在具有许多自动挂载的文件系统的系统上,可能需要增大持续时间值。特别是,如果服务器具有许多活动用户,则每 5 分钟检查一次自动挂载文件系统可能是不够的。每 1800 秒(即 30 分钟)检查一次 autofs 文件系统可能更理想。如果没有每 5 分钟进行一次取消挂载文件系统,/etc/mnttab 就会变得很大。要减少 df 检查 /etc/mnttab 中的每一项时的输出,可以使用 -F 选项(请参见 df(1M) 手册页)或使用 egrep 过滤 df 的输出。

您应该考虑到,调整持续时间还会更改反映对自动挂载程序映射所做更改的速度。取消挂载文件系统之前,无法查看更改。有关如何修改自动挂载程序映射的说明,请参阅修改映射

clear_locks 命令

通过此命令,可以删除 NFS 客户机的所有文件、记录和共享锁定。必须是 root 才能运行此命令。从 NFS 服务器,可以清除对特定客户机的锁定。从 NFS 客户机,可以清除该客户机对特定服务器的锁定。以下示例将清除对当前系统上名为 tulip 的 NFS 客户机的锁定。


# clear_locks tulip

使用 -s 选项可以指定要从中清除锁定的 NFS 主机。必须从创建锁定的 NFS 客户机运行此选项。在这种情况下,将从名为 bee 的 NFS 服务器中删除客户机锁定。


# clear_locks -s bee

注意 – 注意 –

只有在客户机崩溃且无法清除其锁定时,才应运行此命令。为避免数据损坏问题,请不要清除对活动客户机的锁定。


mount 命令

使用此命令,可以将已命名的文件系统(本地或远程)连接到指定的挂载点。有关更多信息,请参见 mount(1M) 手册页。在不使用参数的情况下,mount 将显示当前在计算机上挂载的文件系统列表。

标准 Solaris 安装中包括许多类型的文件系统。每个文件系统类型都有特定的手册页,其中列出了适用于该文件系统类型的 mount 选项。NFS 文件系统的手册页为 mount_nfs(1M)。对于 UFS 文件系统,请参见 mount_ufs(1M)

Solaris 7 发行版可以使用 NFS URL(而不是标准的 server:/pathname 语法)从 NFS 服务器选择要挂载的路径名。有关详细信息,请参见如何使用 NFS URL 挂载 NFS 文件系统


注意 – 注意 –

从 2.6 到当前发行版的任何 Solaris 发行版中包括的 mount 命令版本都不会发出有关无效选项的警告。该命令将默认忽略无法解释的所有选项。请确保验证已使用的所有选项,以便防止出现意外行为。


NFS 文件系统的 mount 选项

下面介绍挂载 NFS 文件系统时可跟在 -o 标志后面的某些选项。有关完整的选项列表,请参阅 mount_nfs(1M) 手册页。

bg|fg

可以使用这些选项来选择挂载失败时的重试行为。bg 选项将导致挂载试图在后台运行。fg 选项将导致挂载试图在前台运行。缺省值为 fg,对于必须可用的文件系统而言,这是最佳选择。此选项可防止在挂载完成之前进一步进行处理。bg 是适用于非关键文件系统的适当选择,因为客户机在等待挂载请求完成的同时可以执行其他处理。

forcedirectio

此选项可提高大型连续数据传输的性能。数据将直接复制到用户缓冲区。不会在客户机的内核中执行任何缓存操作。缺省情况下,此选项处于关闭状态。

以前,所有写请求都被 NFS 客户机和 NFS 服务器串行化。NFS 客户机已被修改,允许应用程序向单个文件发出并发写入以及并发读取和写入。您可以使用 forcedirectio 挂载选项在客户机上启用此功能。使用此选项时,将为已挂载文件系统中的所有文件启用此功能。还可以通过使用 directio() 接口对客户机的单个文件启用此功能。除非启用了此功能,否则对文件的写入一定是串行化的。而且,如果正在进行并发写入或并发读取和写入,该文件将不再支持 POSIX 语义。

有关如何使用此选项的示例,请参阅使用 mount 命令

largefiles

使用此选项,可以在运行 Solaris 2.6 发行版的服务器上访问大于 2 GB 的文件。由于只能在服务器上控制某个大文件是否可以访问,因此在 NFS 版本 3 挂载中将默认忽略此选项。从 2.6 发行版开始,缺省情况下,所有的 UFS 文件系统都使用 largefiles 进行挂载。对于使用 NFS 版本 2 协议的挂载,largefiles 选项将导致挂载失败,且会出现错误。

nolargefiles

用于 UFS 挂载的此选项可以保证文件系统中不会存在大文件。请参见 mount_ufs(1M) 手册页。由于只能在 NFS 服务器上控制大文件的存在,因此使用 NFS 挂载时不存在用于 nolargefiles 的选项。系统将拒绝尝试使用此选项挂载 NFS 文件系统,且会出现错误。

nosuid|suid

从 Solaris 10 发行版开始,nosuid 选项与指定 nosetuid 选项和 nodevices 选项等效。指定 nodevices 选项时,禁止在已挂载的文件系统上打开特定于设备的文件。指定 nosetuid 选项时,系统将忽略位于文件系统中的二进制文件的 setuid 位和 setgid 位。进程将使用执行该二进制文件的用户的权限运行。

suid 选项与指定 setuid 选项和 devices 选项等效。指定 devices 选项时,允许在已挂载的文件系统上打开特定于设备的文件。指定 setuid 选项时,内核将接受位于文件系统中的二进制文件的 setuid 位和 setgid 位。

如果这两个选项都没有指定,则缺省选项为 suid,这将提供指定 setuid 选项和 devices 选项的缺省行为。

下表介绍了将 nosuidsuiddevicesnodevices,以及 setuidnosetuid 组合的效果。请注意,在选项的每个组合中,行为由限制性最强的选项确定。

组合选项的行为 

选项 

选项 

选项 

与使用 nodevicesnosetuid 等效

nosuid

nosetuid

nodevices

与使用 nodevicesnosetuid 等效

nosuid

nosetuid

devices

与使用 nodevicesnosetuid 等效

nosuid

setuid

nodevices

与使用 nodevicesnosetuid 等效

nosuid

setuid

devices

与使用 nodevicesnosetuid 等效

suid

nosetuid

nodevices

与使用 devicesnosetuid 等效

suid

nosetuid

devices

与使用 nodevicessetuid 等效

suid

setuid

nodevices

与使用 devicessetuid 等效

suid

setuid

devices

nosuid 选项为访问可能不可信的服务器的 NFS 客户机提供了附加安全性。使用此选项挂载远程文件系统会减少通过导入不可信设备或导入不可信 setuid 二进制文件来升级权限的机会。所有这些选项在所有的 Solaris 文件系统中都是可用的。

public

此选项强制在与 NFS 服务器联系时使用公共文件句柄。如果服务器支持公共文件句柄,则由于不使用 MOUNT 协议,因此挂载操作会比较快。此外,由于不使用 MOUNT 协议,公共选项允许通过防火墙进行挂载。

rw|ro

-rw-ro 选项指示文件系统以读写方式挂载还是以只读方式挂载。缺省值为读写,该选项适用于远程起始目录、邮件假脱机目录或需要由用户更改的其他文件系统。只读选项适用于不应该由用户更改的目录。例如,用户不应写入手册页的共享副本。

sec=mode

可以使用此选项指定在挂载事务期间使用的验证机制。mode 的值可以是以下某个值之一。

  • 对 Kerberos 版本 5 验证服务使用 krb5

  • 对具备完整性的 Kerberos 版本 5 使用 krb5i

  • 对具备保密性的 Kerberos 版本 5 使用 krb5p

  • 对于不验证的情况,使用 none

  • 对于 Diffie-Hellman (DH) 验证,使用 dh

  • 对于标准的 UNIX 验证,使用 sys

上述模式还在 /etc/nfssec.conf 中进行了定义。

soft|hard

如果服务器没有做出响应,则使用 soft 选项挂载的 NFS 文件系统将返回错误。hard 选项将导致挂载继续重试,直到服务器做出响应为止。缺省值为 hard,大多数文件系统都应该使用此选项。应用程序不会经常检查从使用 soft 选项挂载的文件系统返回的值,这可能会使应用程序出现故障或可能导致文件损坏。如果应用程序检查返回值,则路由问题和其他情况可能仍然会干扰应用程序或导致文件损坏(如果选择 soft 选项)。在大多数情况下,不应该使用 soft 选项。如果文件系统是使用 hard 选项挂载的且不可用,则使用该文件系统的应用程序将挂起,直到该文件系统可用为止。

使用 mount 命令

请参阅以下示例。

umount 命令

使用此命令,可以删除当前已挂载的远程文件系统。umount 命令支持 -V 选项,以便进行测试。您还可以使用 -a 选项一次取消挂载几个文件系统。如果 mount_points 中包括 -a 选项,则会取消挂载这些文件系统。如果不包括挂载点,则系统会尝试取消挂载 /etc/mnttab 中列出的所有文件系统,但“必需的”文件系统(如 //usr/var/proc/dev/fd/tmp)除外。由于文件系统已挂载并且在 /etc/mnttab 中应有一个对应项,因此无需包括一个表示此文件系统类型的标志。

-f 选项可强制取消挂载繁忙的文件系统。可以使用此选项来取消挂起因尝试挂载无法挂载的文件系统而处于挂起状态的客户机。


注意 – 注意 –

如果强制取消挂载文件系统,则在写入文件的情况下会导致数据丢失。


请参见以下示例。


示例 6–1 取消挂载文件系统

本示例取消挂载在 /usr/man 上挂载的文件系统:


# umount /usr/man


示例 6–2 使用带有选项的 umount

本示例显示了 umount -a -V 的运行结果:


# umount -a -V

umount /home/kathys

umount /opt

umount /home

umount /net

请注意,此命令实际上不会取消挂载文件系统。


mountall 命令

使用此命令可挂载文件系统表中列出的所有文件系统或特定的一组文件系统。此命令提供了执行以下操作的方法:

由于所有标记为 NFS 文件系统类型的文件系统均为远程文件系统,因此在上述选项中,有一些是多余的。有关更多信息,请参见 mountall(1M) 手册页。

请注意,以下两个用户输入示例是等效的:


# mountall -F nfs

# mountall -F nfs -r

umountall 命令

使用此命令可取消挂载一组文件系统。-k 选项运行 fuser -k mount_point 命令来中止所有与 mount_point 关联的进程。-s 选项表示不会并行执行取消挂载。-l 指定将仅使用本地文件系统,-r 指定将仅使用远程文件系统。-h host 选项表示应取消挂载指定主机中的所有文件系统。不能将 -h 选项与 -l-r 合并使用。

以下是取消挂载从远程主机挂载的所有文件系统的示例:


# umountall -r

以下是取消挂载当前从服务器 bee 挂载的所有文件系统的示例:


# umountall -h bee

share 命令

使用此命令,可以挂载 NFS 服务器上的本地文件系统。另外,还可以使用 share 命令显示当前在系统上共享的文件系统列表。NFS 服务器必须处于运行状态才能使用 share 命令。如果 /etc/dfs/dfstab 中存在一项,则在系统引导过程中会自动启动 NFS 服务器软件。如果 NFS 服务器软件未运行,则此命令不会报告错误,因此必须验证此软件是否正在运行。

可以共享的对象包括任意目录树。但是,每个文件系统分层结构会受到文件系统所在的磁盘分片或磁盘分区的限制。例如,共享根 (/) 文件系统将不会同时共享 /usr,除非这些目录位于相同的磁盘分区或磁盘分片上。标准安装将根目录放在分片 0 上,将 /usr 放在分片 6 上。另外,共享 /usr 时将不会共享在 /usr 的子目录上挂载的其他任何本地磁盘分区。

如果某个文件系统是一个已共享的大文件系统的一部分,则不能共享此文件系统。例如,如果 /usr/usr/local 位于同一磁盘分片上,则可以共享 /usr/usr/local。但是,如果这两个目录需要使用不同的共享选项进行共享,则必须将 /usr/local 移到单独的磁盘分片上。

通过读写共享的文件系统的文件句柄,可以获取对只读共享的文件系统的访问。但是,这两个文件系统必须位于同一磁盘分片上。您可以创建更为安全的环境。请将那些需要读写的文件系统放在单独的分区或磁盘分片上,使其与需要只读共享的文件系统分隔开来。


注 –

有关取消共享文件系统之后再重新共享此系统时 NFS 版本 4 如何运行的信息,请参阅在 NFS 版本 4 中取消共享和重新共享文件系统


特定于非文件系统的 share 选项

以下是可以用于 -o 标志的一些选项。

rw|ro

pathname 文件系统对所有客户机而言是读写共享还是只读共享。

rw=accesslist

文件系统仅对列出的客户机是读写共享。其他所有请求均被拒绝。从 Solaris 2.6 发行版开始,accesslist 中定义的客户机列表已进行了扩展。有关更多信息,请参见使用 share 命令设置访问列表。可以使用此选项来覆盖 -ro 选项。

特定于 NFS 的 share 选项

以下是可以用于 NFS 文件系统的选项。

aclok

使用此选项,可以将支持 NFS 版本 2 协议的 NFS 服务器配置为对 NFS 版本 2 客户机进行访问控制。如果不使用此选项,则会为所有客户机提供最低访问权限。如果使用此选项,则客户机具有最高访问权限。例如,在使用 -aclok 选项共享的文件系统上,如果某个用户具有读取权限,则所有用户均可具有读取权限。但是,如果不使用此选项,本该具有访问权限的客户机也会被拒绝访问。确定是允许最多访问还是最少访问取决于已设置的安全系统。有关访问控制列表 (access control list, ACL) 的更多信息,请参见《系统管理指南:安全性服务》中的“使用访问控制列表保护文件”


注 –

要使用 ACL,请确保客户机和服务器运行的软件支持 NFS 版本 3 协议和 NFS_ACL 协议。如果该软件仅支持 NFS 版本 3 协议,则客户机可获取正确的访问权限,但不能处理 ACL。如果该软件支持 NFS_ACL 协议,则客户机可获取正确的访问权限,并且可处理 ACL。从 Solaris 2.5 发行版开始,Solaris 系统同时支持这两种协议。


anon=uid

可以使用 uid 来选择未验证的用户的用户 ID。如果将 uid 设置为 -1,则服务器会拒绝未验证的用户进行访问。通过设置 anon=0 可以授予超级用户访问权限,但是由于此选项允许未验证的用户具有超级用户访问权限,因此请改用 root 选项。

index=filename

用户访问 NFS URL 时,-index=filename 选项会强制装入 HTML 文件,而不是显示目录列表。如果在 HTTP URL 正在访问的目录中找到 index.html 文件,则此选项会模拟当前浏览器的操作。此选项相当于为 httpd 设置 DirectoryIndex 选项。例如,假定 dfstab 文件项与以下内容类似:


share -F nfs -o ro,public,index=index.html /export/web

这些 URL 随后会显示相同的信息:


nfs://<server>/<dir>

nfs://<server>/<dir>/index.html

nfs://<server>//export/web/<dir>

nfs://<server>//export/web/<dir>/index.html

http://<server>/<dir>

http://<server>/<dir>/index.html
log=tag

此选项可指定 /etc/nfs/nfslog.conf 中的标记,该文件中包含文件系统的 NFS 服务器日志记录配置信息。必须选择此选项才能启用 NFS 服务器日志记录。

nosuid

此选项表示应忽略启用 setuidsetgid 模式的所有尝试。NFS 客户机不能创建启用了 setuidsetgid 位的文件。

public

-public 选项已添加到 share 命令中,以启用 WebNFS 浏览功能。使用此选项在一台服务器上只能共享一个文件系统。

root=accesslist

服务器会为列表中的主机提供超级用户访问权限。缺省情况下,服务器不会为任何远程主机提供超级用户访问权限。如果选定的安全模式不是 -sec=sys,则只能在 accesslist 中包括客户机主机名。从 Solaris 2.6 发行版开始,accesslist 中定义的客户机列表已进行了扩展。有关更多信息,请参见使用 share 命令设置访问列表


注意 – 注意 –

授予其他主机超级用户访问权限会涉及广泛的安全问题。请慎用 -root= 选项。


root=client_name

client_name 值可用于 AUTH_SYS 验证,以便对照 exportfs(1B) 中提供的地址列表来检查客户机的 IP 地址。如果找到匹配项,则可以 root 访问权限访问共享的文件系统。

root=host_name

对于安全 NFS 模式(如 AUTH_SYS 或 RPCSEC_GSS),服务器会对照访问列表派生的基于主机的主体名称列表来检查客户机的主体名称。客户机主体名称的通用语法为 root@hostname。对于 Kerberos V,语法为 root/hostname.fully.qualified@REALM。使用 host_name 值时,访问列表中的客户机必须具有某个主体名称的凭证。对于 Kerberos V,客户机必须具有其 root/hostname.fully.qualified@REALM 主体名称的有效密钥表项。有关更多信息,请参见《系统管理指南:安全性服务》中的“配置 Kerberos 客户机”

sec=mode[:mode]

mode 选择获取对文件系统的访问所需的安全模式。缺省情况下,安全模式为 UNIX 验证。可以指定多种模式,但是每个命令行一次只能使用一种安全模式。每个 -mode 选项都应用于所有后续的 -rw-ro-rw=-ro=-root=-window= 选项,直至遇到其他 -mode 为止。使用 -sec=none 可将所有用户映射为用户 nobody

window=value

value 选择 NFS 服务器上某个凭证的最长生命周期(以秒为单位)。缺省值为 30000 秒,即 8.3 小时。

使用 share 命令设置访问列表

在 Solaris 2.6 之前的发行版中,用于 share 命令的 -ro=-rw=-root= 选项的 accesslist 仅限于主机名或网络组名的列表。从 Solaris 2.6 发行版开始,访问列表还可以包括域名、子网号或拒绝访问的项。由于不必更改名称空间或维护较长的客户机列表,这些扩展简化了单一服务器上的文件访问控制。

以下命令为大多数系统提供只读访问权限,但是允许 roselilac 进行读写访问:


# share -F nfs -o ro,rw=rose:lilac /usr/src

在下一面的示例中,为 eng 网络组中的任意主机指定了只读访问权限。专门为客户机 rose 提供了读写访问权限。


# share -F nfs -o ro=eng,rw=rose /usr/src

注 –

不能同时指定不带参数的 rwro。如果未指定读写选项,则缺省情况下会为所有客户机指定读写访问权限。


要使多台客户机共享一个文件系统,必须在同一行中键入所有选项。针对同一对象多次调用 share 命令时,将仅“记住”最后一个运行的命令。以下命令为三台客户机系统提供读写访问权限,但是仅为 rosetulip 提供以 root 身份对文件系统的访问。


# share -F nfs -o rw=rose:lilac:tulip,root=rose:tulip /usr/src

共享使用多种验证机制的文件系统时,请确保在正确的安全模式之后包括 -ro-ro=-rw-rw=-root-window 选项。在本示例中,会为名为 eng 的网络组中的所有主机选择 UNIX 验证。这些主机只能以只读模式挂载文件系统。如果主机 tuliplilac 使用 Diffie-Hellman 验证,则它们可以以读写模式挂载文件系统。使用这些选项时,即使主机 tuliplilac 不使用 DH 验证,也可以以只读模式挂载文件系统。但是,必须在 eng 网络组中列出这些主机名。


# share -F nfs -o sec=dh,rw=tulip:lilac,sec=sys,ro=eng /usr/src

尽管 UNIX 验证为缺省安全模式,但如果使用 -sec 选项,也不会包括 UNIX 验证。因此,如果要将 UNIX 验证与其他任何验证机制一起使用,就必须包括 -sec=sys 选项。

通过在实际域名的前面添加一个点,可以在访问列表中使用 DNS 域名。点后面的字符串是域名,而不是全限定主机名。以下项允许 eng.example.com 域中的所有主机进行挂载:


# share -F nfs -o ro=.:.eng.example.com /export/share/man

在本示例中,单个 “.” 与通过 NIS 或 NIS+ 名称空间匹配的所有主机相匹配。 从这些名称服务中返回的结果中不包括域名。“.eng.example.com” 项与所有使用 DNS 进行名称空间解析的主机相匹配。DNS 始终返回全限定主机名。因此,如果使用了 DNS 和其他名称空间的组合,则需要较长的项。

通过在实际网络号或网络名的前面添加 “@”,可以在访问列表中使用子网号。此字符可将网络名与网络组或全限定主机名区分开来。必须在 /etc/networks、NIS 或 NIS+ 名称空间中标识子网。如果 192.168 子网已标识为 eng 网络,则以下各项具有相同效果:


# share -F nfs -o ro=@eng /export/share/man

# share -F nfs -o ro=@192.168 /export/share/man

# share -F nfs -o ro=@192.168.0.0 /export/share/man

最后两项表明无需包括完整的网络地址。

如果网络前缀不是按字节对齐,即与无类域间路由 (Classless Inter-Domain Routing, CIDR) 一样,则可以在命令行中明确指定掩码长度。掩码长度可通过在网络名或网络号后添加一条斜杠和地址前缀中的有效位数进行定义。例如:


# share -f nfs -o ro=@eng/17 /export/share/man

# share -F nfs -o ro=@192.168.0/17 /export/share/man

在上述示例中,“/17” 表示地址中的前 17 位要用作掩码。有关 CIDR 的其他信息,请查阅 RFC 1519。

另外,还可以通过在项的前面放置 “-” 来选择拒绝访问。请注意,各项是从左到右读取的。因此,必须将拒绝访问项放在应用了拒绝访问项的项之前:


# share -F nfs -o ro=-rose:.eng.example.com /export/share/man

本示例将允许对 eng.example.com 域中除了名为 rose 的主机之外的任何主机进行访问。

unshare 命令

使用此命令,可使以前可供挂载的文件系统不能再由客户机挂载。可以使用 unshare 命令取消共享任何文件系统,无论此文件系统是使用 share 命令进行显式共享还是通过 /etc/dfs/dfstab 自动共享。如果使用 unshare 命令取消共享通过 dfstab 文件共享的文件系统,请务必谨慎。请记住,退出再重新进入运行级 3 时,会再次共享文件系统。如果要保持这一更改,则必须从 dfstab 文件中删除此文件系统项。

取消共享 NFS 文件系统时,将禁止从具有现有挂载的客户机进行访问。文件系统可能仍挂载在客户机上,但是无法再访问其中的文件。


注 –

有关取消共享文件系统之后再重新共享此系统时 NFS 版本 4 如何运行的信息,请参阅在 NFS 版本 4 中取消共享和重新共享文件系统


以下是取消共享某个特定文件系统的示例:


# unshare /usr/src

shareall 命令

使用此命令可共享多个文件系统。如果在不带选项的情况下使用此命令,则可以共享 /etc/dfs/dfstab 中的所有项。您可以包括一个文件名来指定其中列出了 share 命令行的文件的名称。如果没有包括文件名,则会检查 /etc/dfs/dfstab。如果使用 “-” 来替换文件名,则可以从标准输入中键入 share 命令。

以下是共享本地文件中列出的所有文件系统的示例:


# shareall /etc/dfs/special_dfstab

unshareall 命令

此命令可使所有当前共享的资源不可用。-F FSType 选项可选择 /etc/dfs/fstypes 中定义的文件系统类型的列表。使用此标志,可以仅选择要取消共享的某些文件系统类型。缺省的文件系统类型在 /etc/dfs/fstypes 中定义。要选择特定的文件系统,请使用 unshare 命令。

以下是取消共享所有 NFS 类型的文件系统的示例:


# unshareall -F nfs

showmount 命令

此命令可显示以下内容之一:


注 –

showmount 命令仅显示 NFS 版本 2 和版本 3 的导出内容,而不显示 NFS 版本 4 的导出内容。


此命令的语法如下:

showmount [ -ade ] [ hostname ]

-a

列显所有远程挂载的列表。每项都包括客户机名称和目录。

-d

列显由客户机远程挂载的目录的列表。

-e

列显共享或导出的文件的列表。

hostname

选择要从其中收集信息的 NFS 服务器。

如果未指定 hostname,则会对本地主机进行查询。

以下命令列出了所有客户机以及这些客户机已挂载的本地目录:


# showmount -a bee

lilac:/export/share/man

lilac:/usr/src

rose:/usr/src

tulip:/export/share/man

以下命令列出了已挂载的目录:


# showmount -d bee

/export/share/man

/usr/src

以下命令列出了已共享的文件系统:


# showmount -e bee

/usr/src								(everyone)

/export/share/man					eng

setmnt 命令

此命令可创建 /etc/mnttab 表。mountumount 命令会查阅该表。通常不必手动运行此命令,因为它会在系统引导时自动运行。

用于解决 NFS 问题的命令

这些命令在解决 NFS 问题时会非常有用。

nfsstat 命令

可以使用此命令来收集有关 NFS 和 RPC 连接的统计信息。此命令的语法如下:

nfsstat [ -cmnrsz ]

-c

显示客户端信息

-m

显示每个已挂载 NFS 文件系统的统计信息

-n

指定要同时显示在客户端和服务器端的 NFS 信息

-r

显示 RPC 统计信息

-s

显示服务器端信息

-z

指定应将统计信息设置为零

如果未在命令行中提供任何选项,则使用 -cnrs 选项。

向计算环境中添加新的软件或硬件时,收集服务器端统计信息对于调试问题非常重要。每周最少运行一次此命令并存储运行结果可以保留以前执行情况的完整历史记录。

请参阅以下示例:


# nfsstat -s



Server rpc:

Connection oriented:

calls      badcalls   nullrecv   badlen     xdrcall    dupchecks  dupreqs    

719949194  0          0          0          0          58478624   33         

Connectionless:

calls      badcalls   nullrecv   badlen     xdrcall    dupchecks  dupreqs    

73753609   0          0          0          0          987278     7254       



Server nfs:

calls                badcalls             

787783794            3516                 

Version 2: (746607 calls)

null       getattr    setattr    root       lookup     readlink   read       

883 0%     60 0%      45 0%      0 0%       177446 23% 1489 0%    537366 71% 

wrcache    write      create     remove     rename     link       symlink    

0 0%       1105 0%    47 0%      59 0%      28 0%      10 0%      9 0%       

mkdir      rmdir      readdir    statfs     

26 0%      0 0%       27926 3%   108 0%     

Version 3: (728863853 calls)

null          getattr       setattr       lookup        access        

1365467 0%    496667075 68% 8864191 1%    66510206 9%   19131659 2%   

readlink      read          write         create        mkdir         

414705 0%     80123469 10%  18740690 2%   4135195 0%    327059 0%     

symlink       mknod         remove        rmdir         rename        

101415 0%     9605 0%       6533288 0%    111810 0%     366267 0%     

link          readdir       readdirplus   fsstat        fsinfo        

2572965 0%    519346 0%     2726631 0%    13320640 1%   60161 0%      

pathconf      commit        

13181 0%      6248828 0%    

Version 4: (54871870 calls)

null                compound            

266963 0%           54604907 99%        

Version 4: (167573814 operations)

reserved            access              close               commit              

0 0%                2663957 1%          2692328 1%          1166001 0%          

create              delegpurge          delegreturn         getattr             

167423 0%           0 0%                1802019 1%          26405254 15%        

getfh               link                lock                lockt               

11534581 6%         113212 0%           207723 0%           265 0%              

locku               lookup              lookupp             nverify             

230430 0%           11059722 6%         423514 0%           21386866 12%        

open                openattr            open_confirm        open_downgrade      

2835459 1%          4138 0%             18959 0%            3106 0%             

putfh               putpubfh            putrootfh           read                

52606920 31%        0 0%                35776 0%            4325432 2%          

readdir             readlink            remove              rename              

606651 0%           38043 0%            560797 0%           248990 0%           

renew               restorefh           savefh              secinfo             

2330092 1%          8711358 5%          11639329 6%         19384 0%            

setattr             setclientid         setclientid_confirm verify              

453126 0%           16349 0%            16356 0%            2484 0%             

write               release_lockowner   illegal             

3247770 1%          0 0%                0 0%                



Server nfs_acl:

Version 2: (694979 calls)

null        getacl      setacl      getattr     access      getxattrdir 

0 0%        42358 6%    0 0%        584553 84%  68068 9%    0 0%        

Version 3: (2465011 calls)

null        getacl      setacl      getxattrdir 

0 0%        1293312 52% 1131 0%     1170568 47% 


以上列出的是 NFS 服务器统计信息的示例。前五行与 RPC 有关,其余行则报告 NFS 活动。在两组统计信息中,了解 badcallscalls 的平均数以及每周的调用次数有助于确定问题。badcalls 值报告来自客户机的错误消息数。该值可以表明网络硬件问题。

某些连接会在磁盘上执行写操作。这些统计信息的突然增加可能表明出现了问题,应该对这一现象进行调查。对于 NFS 版本 2 的统计信息,要注意的连接包括 setattrwritecreateremoverenamelinksymlinkmkdirrmdir。对于 NFS 版本 3 和版本 4 的统计信息,要注意的值为 commit。如果 commit 在一台 NFS 服务器中的级别高于在另一台几乎相同的服务器中的级别,请检查 NFS 客户机是否具有足够的内存。客户机没有可用资源时,服务器上的 commit 操作数将增加。

pstack 命令

此命令可显示每个进程的栈跟踪。pstack 命令必须由相应进程的属主或 root 运行。可以使用 pstack 来确定进程挂起的位置。此命令允许使用的唯一选项是要检查的进程的 PID。请参见 proc(1) 手册页。

以下是检查正在运行的 nfsd 进程的示例。


# /usr/bin/pgrep nfsd

243

# /usr/bin/pstack 243

243:    /usr/lib/nfs/nfsd -a 16

 ef675c04 poll     (24d50, 2, ffffffff)

 000115dc ???????? (24000, 132c4, 276d8, 1329c, 276d8, 0)

 00011390 main     (3, efffff14, 0, 0, ffffffff, 400) + 3c8

 00010fb0 _start   (0, 0, 0, 0, 0, 0) + 5c

此示例显示进程正在等待新的连接请求,这是正常响应。如果栈表明在发出请求之后进程仍在轮询,则此进程可能会被挂起。请遵照如何重新启动 NFS 服务中的说明来解决此问题。请检查NFS 疑难解答过程中的说明来充分验证问题是否是程序已挂起。

rpcinfo 命令

此命令可生成有关系统上正在运行的 RPC 服务的信息。另外,还可以使用此命令来更改 RPC 服务。许多选项都可用于此命令。请参见 rpcinfo(1M) 手册页。以下是可用于此命令的某些选项的简短概要。

rpcinfo [ -m | -s ] [ hostname ]

rpcinfo -T transport hostname [ progname ]

rpcinfo [ -t | -u ] [ hostname ] [ progname ]

-m

显示 rpcbind 操作的统计信息表

-s

显示所有已注册的 RPC 程序的简表

-T

显示有关使用特定传输或协议的服务的信息

-t

探测使用 TCP 的 RPC 程序

-u

探测使用 UDP 的 RPC 程序

transport

为服务选择传输或协议

hostname

选择需要其中信息的服务器的主机名

progname

选择收集有关其信息的 RPC 程序

如果未指定 hostname 的值,则使用本地主机名。可以将 progname 替换为 RPC 程序编号,但是很多用户可能会记住名称而记不住编号。可以在未运行 NFS 版本 3 软件的系统上使用 -p 选项替换 -s 选项。

此命令生成的数据可包括以下内容:

以下示例收集有关正在服务器上运行的 RPC 服务的信息。此命令生成的文本将通过 sort 命令过滤,以使输出更具可读性。列出 RPC 服务的几行已从本示例中删除。


% rpcinfo -s bee |sort -n

   program version(s) netid(s)                         service     owner

    100000  2,3,4     udp6,tcp6,udp,tcp,ticlts,ticotsord,ticots rpcbind     superuser

    100001  4,3,2     ticlts,udp,udp6                  rstatd      superuser

    100002  3,2       ticots,ticotsord,tcp,tcp6,ticlts,udp,udp6 rusersd     superuser

    100003  3,2       tcp,udp,tcp6,udp6                nfs         superuser

    100005  3,2,1     ticots,ticotsord,tcp,tcp6,ticlts,udp,udp6 mountd      superuser

    100007  1,2,3     ticots,ticotsord,ticlts,tcp,udp,tcp6,udp6 ypbind      superuser

    100008  1         ticlts,udp,udp6                  walld       superuser

    100011  1         ticlts,udp,udp6                  rquotad     superuser

    100012  1         ticlts,udp,udp6                  sprayd      superuser

    100021  4,3,2,1   tcp,udp,tcp6,udp6                nlockmgr    superuser

    100024  1         ticots,ticotsord,ticlts,tcp,udp,tcp6,udp6 status      superuser

    100029  3,2,1     ticots,ticotsord,ticlts          keyserv     superuser

    100068  5         tcp,udp                          cmsd        superuser

    100083  1         tcp,tcp6                         ttdbserverd superuser

    100099  3         ticotsord                        autofs      superuser

    100133  1         ticots,ticotsord,ticlts,tcp,udp,tcp6,udp6 -           superuser

    100134  1         ticotsord                        tokenring   superuser

    100155  1         ticots,ticotsord,tcp,tcp6        smserverd   superuser

    100221  1         tcp,tcp6                         -           superuser

    100227  3,2       tcp,udp,tcp6,udp6                nfs_acl     superuser

    100229  1         tcp,tcp6                         metad       superuser

    100230  1         tcp,tcp6                         metamhd     superuser

    100231  1         ticots,ticotsord,ticlts          -           superuser

    100234  1         ticotsord                        gssd        superuser

    100235  1         tcp,tcp6                         -           superuser

    100242  1         tcp,tcp6                         metamedd    superuser

    100249  1         ticots,ticotsord,ticlts,tcp,udp,tcp6,udp6 -           superuser

    300326  4         tcp,tcp6                         -           superuser

    300598  1         ticots,ticotsord,ticlts,tcp,udp,tcp6,udp6 -           superuser

    390113  1         tcp                              -           unknown

 805306368  1         ticots,ticotsord,ticlts,tcp,udp,tcp6,udp6 -           superuser

1289637086  1,5       tcp                              -           26069

以下两个示例说明如何通过选择特定传输来收集服务器上有关特定 RPC 服务的信息。第一个示例检查通过 TCP 运行的 mountd 服务。第二个示例检查通过 UDP 运行的 NFS 服务。


% rpcinfo -t bee mountd

program 100005 version 1 ready and waiting

program 100005 version 2 ready and waiting

program 100005 version 3 ready and waiting

% rpcinfo -u bee nfs

program 100003 version 2 ready and waiting

program 100003 version 3 ready and waiting

snoop 命令

此命令通常用于查看网络中的包。必须以 root 身份运行 snoop 命令。使用此命令是一种确保网络硬件在客户机和服务器上都正常运行的好方法。可以使用许多选项。请参见 snoop(1M) 手册页。以下是此命令的简短概要:

snoop [ -d device ] [ -o filename ] [ host hostname ]

-d device

指定本地网络接口

-o filename

将所有捕获到的包存储在指定的文件中

hostname

显示仅进出特定主机的包

-d device 选项在那些具有多个网络接口的服务器上非常有用。除了设置主机之外,还可以使用许多表达式。命令表达式与 grep 的组合通常可以生成极其有用的数据。

排除故障时,请确保适当的主机中有包进出。另外,还应查找错误消息。将包保存到文件中可以简化检查数据的过程。

truss 命令

使用此命令可以检查某个进程是否已被挂起。truss 命令必须由相应进程的属主或 root 运行。可以将许多选项用于此命令。请参见 truss(1) 手册页。以下是此命令的简短语法:

truss [ -t syscall ] -p pid

-t syscall

选择要跟踪的系统调用

-p pid

指明要跟踪的进程的 PID

syscall 可以列出要跟踪的系统调用,各系统调用之间以逗号分隔。另外,在 syscall 前面添加 ! 可选择不跟踪所列出的系统调用。

本示例说明进程正在等待来自新客户机的另一个连接请求。


# /usr/bin/truss -p 243

poll(0x00024D50, 2, -1)         (sleeping...)

以上示例表示一个正常响应。如果在发出新连接请求之后该响应未发生变化,则此进程可能会被挂起。请遵照如何重新启动 NFS 服务中的说明来修复被挂起的程序。请检查NFS 疑难解答过程中的说明来充分验证问题是否是程序已挂起。

NFS Over RDMA

从 Solaris 10 发行版开始,NFS 的缺省传输为远程直接内存访问 (Remote Direct Memory Access, RDMA) 协议,这是一种通过高速网络实现内存到内存数据传输的技术。具体来说,RDMA 可提供不受 CPU 干预而直接进出内存的远程数据传输。RDMA 还可提供直接数据放置,这消除了数据副本,进一步消除了 CPU 干预。这样,RDMA 不仅减轻了主机 CPU 的负担,而且还减少了主机内存和 I/O 总线的争用。 为提供此功能,RDMA 将 InfiniBand-on-SPARC 平台的互连 I/O 技术与 Solaris 操作系统相结合。下图说明了 RDMA 与其他协议(如 UDP 和 TCP)的关系。

图 6–1 RDMA 与其他协议的关系

文中对该图形进行了说明。

由于 RDMA 是 NFS 的缺省传输协议,因此,在客户机或服务器上使用 RDMA 时不需要特殊的 sharemount 选项。现有的自动挂载程序映射 vfstab 和 dfstab 可用于 RDMA 传输。如果 SPARC 平台上在客户机和服务器之间存在 InfiniBand 连接,则会以透明方式通过 RDMA 进行 NFS 挂载。如果 RDMA 传输在客户机和服务器上都不可用,则 TCP 传输为首选备用传输协议,如果 TCP 不可用,则会再使用 UDP。但是请注意,如果使用 proto=rdma 挂载选项,则会强制 NFS 挂载仅使用 RDMA。

要指定仅使用 TCP 和 UDP,可以使用 proto=tcp/udp mount 选项。此选项可在 NFS 客户机上禁用 RDMA。有关 NFS 挂载选项的更多信息,请参见 mount_nfs(1M) 手册页和mount 命令


注 –

用于 InfiniBand 的 RDMA 会使用 IP 寻址格式和 IP 查找基础结构来指定对等点。但是,由于 RDMA 是单独的协议栈,因此,它没有完全实现所有的 IP 语义。例如,RDMA 不会使用 IP 寻址来与对等点通信。因此,RDMA 可能会跳过基于 IP 地址的各种安全策略的配置。但是,不会跳过 NFS 和 RPC 管理策略,如 mount 限制和安全 RPC。


NFS 服务如何工作

以下各节介绍了 NFS 软件的一些复杂功能。请注意,本节说明的某些功能仅适用于 NFS 版本 4。


注 –

如果系统启用了区域并且您要在非全局区域中使用此功能,请参见《系统管理指南:Solaris Containers-资源管理和 Solaris Zones》以了解更多信息。


NFS 中的版本协商

NFS 的启动过程包括协商服务器和客户机的协议级别。 如果未指定版本级别,则缺省情况下将选择最佳级别。例如,如果客户机和服务器都可以支持版本 3,则会使用版本 3。如果客户机或服务器只能支持版本 2,则会使用版本 2。

从 Solaris 10 发行版开始,可以在 /etc/default/nfs 文件中设置关键字 NFS_CLIENT_VERSMIN、NFS_CLIENT_VERSMAX、NFS_SERVER_VERSMIN 和 NFS_SERVER_VERSMAX。为服务器和客户机指定的最小值和最大值将取代这些关键字的缺省值。对于客户机和服务器,最小缺省值为 2,最大缺省值为 4。请参见/etc/default/nfs 文件的关键字。为查明服务器所支持的版本,NFS 客户机会从 NFS_CLIENT_VERSMAX 的设置开始,然后依次尝试每个版本,直到遇到 NFS_CLIENT_VERSMIN 的版本设置为止。 一旦查明所支持的版本,此过程便会终止。 例如,如果 NFS_CLIENT_VERSMAX=4 并且 NFS_CLIENT_VERSMIN=2,则客户机会首先尝试版本 4,然后是版本 3,最后是版本 2。如果 NFS_CLIENT_VERSMIN 和 NFS_CLIENT_VERSMAX 设置为相同的值,则客户机会始终使用此版本,并且不会尝试其他任何版本。 如果服务器不提供此版本,挂载将会失败。


注 –

可以使用带有 vers 选项的 mount 命令来覆盖通过协商确定的值。请参见 mount_nfs(1M) 手册页。


有关过程信息,请参阅设置 NFS 服务

NFS 版本 4 的功能

NFS 版本 4 已进行了许多更改。本节提供了这些新增功能的说明。


注 –

从 Solaris 10 发行版开始,NFS 版本 4 不支持 LIPKEY/SPKM 安全特性。另外,NFS 版本 4 也不会使用 mountdnfslogdstatd 守护进程。


有关与使用 NFS 版本 4 相关的过程信息,请参阅设置 NFS 服务

在 NFS 版本 4 中取消共享和重新共享文件系统

如果同时使用 NFS 版本 3 和版本 4,则客户机尝试访问一个已经取消共享的文件系统时,服务器会以错误代码响应。但是,如果使用 NFS 版本 3,则服务器会保留客户机在取消共享文件系统之前所获取的任何锁定。 这样,重新共享文件系统时,NFS 版本 3 客户机即可访问此文件系统,就好像从未取消共享此文件系统一样。

如果使用 NFS 版本 4,则取消共享文件系统时,将破坏此文件系统中任何打开的文件或文件锁定的所有状态。如果客户机尝试访问这些文件或锁定,则会收到一条错误消息。通常会将此错误消息作为 I/O 错误报告给应用程序。但是请注意,通过重新共享当前共享的文件系统来更改选项不会破坏服务器上的任何状态。

有关信息,请参阅NFS 版本 4 中的客户机恢复或参见 unshare_nfs(1M) 手册页。

NFS 版本 4 中的文件系统名称空间

NFS 版本 4 服务器可创建并维护一个伪文件系统,此系统使客户机能够对服务器上所有导出的对象进行无缝访问。在 NFS 版本 4 之前,不存在伪文件系统。那时的客户机会强制挂载每个共享服务器文件系统来进行访问。请参考以下示例。

图 6–2 服务器文件系统和客户机文件系统的视图

文中对该图形进行了说明。

请注意,客户机无法看到 payroll 目录和 nfs4x 目录,因为这些目录未被导出,也没有通向导出目录。但是,客户机可以看到 local 目录,因为 local 是一个导出的目录。客户机还可看到 projects 目录,因为 projects 通向导出目录 nfs4。因此,未显式导出的服务器名称空间部分会与伪文件系统桥接,该系统仅显示导出目录和那些通向服务器导出目录的目录。

伪文件系统是服务器创建的仅包含目录的结构。 伪文件系统允许客户机浏览导出文件系统的分层结构。因此,客户机的伪文件系统视图限制为仅显示通向导出文件系统的路径。

以前的 NFS 版本不允许客户机在未挂载每个文件系统的情况下遍历服务器文件系统。 但是,在 NFS 版本 4 中,服务器名称空间可进行以下操作:

由于与 POSIX 相关的原因,Solaris NFS 版本 4 客户机不会跨越服务器的文件系统边界。如果尝试进行这类操作,则客户机会使目录显示为空。要修正这种情况,必须针对每个服务器的文件系统执行挂载。

NFS 版本 4 中的可变文件句柄

文件句柄是在服务器上创建的,其中包含唯一标识文件和目录的信息。在 NFS 版本 2 和 3 中,服务器会返回持久性文件句柄。这样,客户机即可确保服务器会生成始终引用同一文件的文件句柄。例如:

因此,当服务器从客户机收到包括文件句柄的请求时,解决方案会非常简单,并且文件句柄会始终引用正确的文件。

这种为 NFS 操作标识文件和目录的方法对大多数基于 UNIX 的服务器都很有效。但是,此方法不能在依赖其他标识方法(如文件的路径名)的服务器上实现。为了解决此问题,NFS 版本 4 协议允许服务器声明其文件句柄为可变句柄。这样,即可更改文件句柄。如果文件句柄确实已更改,则客户机必须找到新的文件句柄。

与 NFS 版本 2 和 3 一样,Solaris NFS 版本 4 服务器始终提供持久性文件句柄。但是,访问非 Solaris NFS 版本 4 服务器的 Solaris NFS 版本 4 客户机必须在服务器使用可变文件句柄时支持这些句柄。具体来说,当服务器通知客户机文件句柄可变时,客户机必须高速缓存路径名和文件句柄之间的映射。客户机会一直使用可变文件句柄,直到句柄过期为止。句柄过期后,客户机会执行以下操作:


注 –

服务器会始终通知客户机哪些文件句柄为持久性句柄,哪些文件句柄为可变句柄。


可变文件句柄可能会由于以下任一原因过期:

请注意,如果客户机无法找到新的文件句柄,则会在 syslog 文件中放入一条错误消息。进一步尝试访问此文件会失败,并显示 I/O 错误。

NFS 版本 4 中的客户机恢复

NFS 版本 4 协议为有状态协议。如果客户机和服务器都保留有关以下内容的当前信息,协议即为有状态协议。

出现故障(如服务器崩溃)时,客户机和服务器会协同工作,以重新建立故障之前已存在的打开状态和锁定状态。

服务器崩溃并重新引导时,会丢失其状态。客户机检测到服务器已经重新引导后,将启动帮助服务器重建其状态的进程。此进程称为客户机恢复,因为它是由客户机引导执行的。

客户机发现服务器已经重新引导后,便会立即暂停其当前活动并启动客户机恢复进程。启动恢复进程时,系统错误日志 /var/adm/messages 中会显示如下消息。


NOTICE: Starting recovery server basil.example.company.com

在恢复进程中,客户机会向服务器发送有关客户机以前状态的信息。但是请注意,在此期间,客户机不会向服务器发送任何新请求。 任何打开文件或设置文件锁定的新请求都必须等到服务器完成其恢复期之后才能继续进行。

客户机恢复进程完成时,系统错误日志 /var/adm/messages 中会显示以下消息。


NOTICE: Recovery done for server basil.example.company.com

现在,客户机已经成功地将其状态信息发送给服务器。 不过,尽管此客户机已经完成了此进程,但是其他客户机可能尚未完成将其状态信息发送给服务器的进程。 因此,在一段时间内,服务器不会接受任何打开或锁定请求。指定这段时间(称为宽延期)旨在允许所有客户机完成其恢复。

在宽延期内,如果客户机尝试打开任何新文件或建立任何新锁定,服务器都会拒绝请求并显示 GRACE 错误代码。收到此错误后,客户机必须等到宽延期结束,然后才能向服务器重新发送请求。 在宽延期内,会显示以下消息。


NFS server recovering

请注意,在宽延期内,可以继续执行不打开文件或设置文件锁定的命令。 例如,命令 lscd 不会打开文件或设置文件锁定。因此,这些命令不会暂停执行。但是,cat 之类可打开文件的命令会暂停执行,直到宽延期结束为止。

宽延期结束后,会显示以下消息。


NFS server recovery ok.

现在,客户机即可向服务器发送新的打开和锁定请求。

客户机恢复会因为各种原因而失败。例如,如果服务器重新引导后存在网络分区,则客户机可能无法在宽延期结束之前在服务器上重新建立其状态。 宽延期结束后,服务器不允许客户机重新建立其状态,因为新的状态操作可能会产生冲突。例如,新的文件锁定可能会与客户机尝试恢复的旧的文件锁定发生冲突。发生这种情况时,服务器会将 NO_GRACE 错误代码返回到客户机。

如果恢复某个特定文件的打开操作失败,客户机会将此文件标记为不可用,并显示以下消息。


WARNING: The following NFS file could not be recovered and was marked dead 

(can't reopen:  NFS status 70):  file :  filename

请注意,数字 70 仅是一个示例。

如果在恢复过程中重新建立文件锁定失败,则会显示以下错误消息。


NOTICE: nfs4_send_siglost:  pid PROCESS-ID lost

lock on server SERVER-NAME

在这种情况下,会向进程发送 SIGLOST 信号。SIGLOST 信号的缺省操作是终止此进程。

要从此状态恢复,必须重新启动所有在失败时打开文件的应用程序。请注意,可能会出现以下情况。

因此,一些进程可以访问其他进程无法访问的特定文件。

NFS 版本 4 中的 OPEN 共享支持

NFS 版本 4 协议提供了几种文件共享模式,客户机可以使用这些模式控制其他客户机对文件的访问。客户机可以指定以下内容:

Solaris NFS 版本 4 服务器完全实现了这些文件共享模式。因此,如果客户机尝试打开文件的方式与当前共享模式冲突,则服务器会通过使操作失败来拒绝此尝试。如果这类尝试在打开或创建操作开始时失败,则 Solaris NFS 版本 4 客户机会接收到一条协议错误消息。此错误会映射为应用程序错误 EACCES

尽管此协议提供了几种共享模式,但目前 Solaris 中的打开操作不提供多种共享模式。打开文件时,Solaris NFS 版本 4 客户机只能使用 DENY_NONE 模式。

另外,尽管 Solaris fcntl 系统调用使用 F_SHARE 命令来控制文件共享,但是 fcntl 命令无法在 NFS 版本 4 中正常实现。如果在 NFS 版本 4 客户机上使用这些 fcntl 命令,则客户机会向应用程序返回一条 EAGAIN 错误消息。

NFS 版本 4 的委托

NFS 版本 4 为委托同时提供客户机支持和服务器支持。委托是服务器用于将文件管理委托给客户机的一种技术。例如,服务器可以授予客户机读取委托或写入委托。读取委托可以同时授予多台客户机,因为这些读取委托不会彼此冲突;写入委托只能授予一台客户机,因为写入委托会与其他任何客户机的任何文件访问相冲突。 虽然客户机拥有写入委托,但是它不会向服务器发送各种操作,因为客户机保证具有对文件的独占访问权限。同样,客户机在拥有读取委托时也不会向服务器发送各种操作。这是因为服务器保证任何客户机都不能以写入模式打开文件。通过委托,可显著减少服务器和客户机之间针对被委托文件的交互。因此,可降低网络通信量,并且提高客户机和服务器的性能。但是请注意,性能提高的程度取决于应用程序使用的文件交互的类型和网络和服务器的拥塞量。

是否授予委托完全由服务器决定。客户机不会请求委托。服务器可根据文件的访问模式来决定是否授予委托。如果几台不同的客户机最近以写入模式访问了文件,则服务器可能不会授予委托。原因是此访问模式表明将来可能会发生冲突。

当客户机访问文件的方式与当前授予此文件的委托不一致时,便会发生冲突。例如,如果一台客户机拥有对文件的写入委托,同时另一台客户机打开此文件来进行读取或写入访问,则服务器会撤销第一台客户机的写入委托。同样,如果一台客户机拥有读取委托,同时另一台客户机打开同一个文件进行写入,则服务器会撤销读取委托。请注意,在这两种情况下都不会将委托授予第二台客户机,因为此时存在冲突。发生冲突时,服务器会使用回叫机制来访问当前拥有委托的客户机。收到此回叫后,客户机会向服务器发送文件的更新状态并返回委托。如果客户机无法对回叫做出响应,则服务器会撤销委托。在这些情况下,服务器会拒绝客户机对此文件进行的所有操作,客户机将已请求的操作报告为失败。通常,这些失败作为 I/O 错误报告给应用程序。 要从这些错误中恢复,必须关闭文件,然后再重新打开。当客户机和服务器之间存在网络分区并且客户机拥有委托时,撤销委托会失败。

请注意,一台服务器不能解决对其他服务器上存储的文件的访问冲突。因此,NFS 服务器仅解决它自己存储的文件的冲突。此外,要响应由运行各种 NFS 版本的客户机导致的冲突,NFS 服务器只能对运行 NFS 版本 4 的客户机启动回叫机制。NFS 服务器不能对运行较早 NFS 版本的客户机启动回叫机制。

检测冲突的进程会有所变化。例如,与 NFS 版本 4 不同,因为版本 2 和版本 3 不包括打开过程,所以仅会在客户机尝试读取、写入或锁定文件之后检测冲突。服务器对这些冲突的响应也会有所不同。 例如:

解决了委托冲突之后,便不会存在这些情况。

缺省情况下,会启用服务器委托。可以通过修改 /etc/default/nfs 文件来禁用委托。有关过程信息,请参阅如何在服务器上选择不同版本的 NFS

客户机委托不需要任何关键字。NFS 版本 4 回叫守护进程 nfs4cbd 在客户机上提供了回叫服务。只要启用对 NFS 版本 4 的挂载,此守护进程就会自动启动。缺省情况下,客户机会针对 /etc/netconfig 系统文件中列出的所有 Internet 传输向服务器提供必需的回叫信息。请注意,如果在客户机上启用了 IPv6 并且可以确定客户机名称的 IPv6 地址,则回叫守护进程可接受 IPv6 连接。

回叫守护进程使用临时的程序编号以及动态指定的端口号。 此信息提供给服务器,服务器会在授予任何委托之前测试回叫路径。如果回叫路径测试不成功,则服务器不会授予委托,这是唯一可从外部看到的行为。

请注意,因为回叫信息嵌在 NFS 版本 4 请求中,所以服务器不能通过使用网络地址转换 (Network Address Translation, NAT) 的设备来访问客户机。 另外,回叫守护进程还会使用动态端口号。因此,即使防火墙在端口 2049 上启用了正常的 NFS 流量,服务器可能仍然无法穿越防火墙。在这种情况下,服务器不会授予委托。

NFS 版本 4 中的 ACL 和 nfsmapid

访问控制列表 (access control list, ACL) 通过使文件的属主可以为文件属主、组以及其他特定用户和组定义文件权限来提供更好的文件安全性。ACL 是使用 setfacl 命令在服务器和客户机上设置的。请参见 setfacl(1) 手册页。在 NFS 版本 4 中,ID 映射器 nfsmapid 用于将服务器上的 ACL 项中的用户 ID 或组 ID 映射为客户机上的 ACL 项中的用户 ID 或组 ID。反之也能实现。ACL 项中的用户 ID 和组 ID 必须同时存在于客户机和服务器上。

ID 映射失败的原因

以下情况可能导致 ID 映射失败:

避免 ACL 出现 ID 映射问题

为避免 ID 映射问题,请执行以下操作:

检查未映射的用户 ID 或组 ID

要确定是否有无法在服务器或客户机上映射的用户或组,请使用以下脚本:


#! /usr/sbin/dtrace -Fs



sdt:::nfs4-acl-nobody

{

     printf("validate_idmapping: (%s) in the ACL could not be mapped!", 

stringof(arg0));

}

注 –

此脚本中使用的探测器名称是一个接口,该接口以后可以更改。有关更多信息,请参见《Solaris 动态跟踪指南》中的“稳定性级别”


有关 ACL 或 nfsmapid 的其他信息

请参见以下内容:

UDP 和 TCP 协商

启动过程中,还会协商传输协议。缺省情况下,将选择客户机和服务器同时支持的第一个面向连接的传输。如果此选择未成功,则将使用第一个可用的无连接传输协议。/etc/netconfig 中列出了系统支持的传输协议。TCP 是该发行版支持的面向连接的传输协议。UDP 是无连接传输协议。

如果 NFS 协议版本和传输协议都是通过协商确定的,则 NFS 协议版本优先于传输协议。使用 UDP 的 NFS 版本 3 协议比使用 TCP 的 NFS 版本 2 协议具有更高的优先级。可以使用 mount 命令手动选择 NFS 协议版本和传输协议。请参见 mount_nfs(1M) 手册页。在大多数情况下,允许协商选择最佳选项。

协商文件传输大小

文件传输大小确定在客户机与服务器之间传输数据时使用的缓冲区的大小。一般情况下,较大的传输大小更好。NFS 版本 3 协议的传输大小没有限制。但是,从 Solaris 2.6 发行版开始,软件规定缺省缓冲区大小为 32 KB。如果需要,客户机可以在挂载时规定较小的传输大小,但是在大多数情况下,此规定是没有必要的。

不会与使用 NFS 版本 2 协议的系统协商传输大小。在这种情况下,最大的传输大小设置为 8 KB。

可以在 mount 命令中使用 -rsize-wsize 选项来手动设置传输大小。对于某些 PC 客户机,可能需要减小传输大小。另外,如果将 NFS 服务器配置为使用较大的传输大小,则还可以增大传输大小。


注 –

从 Solaris 10 发行版开始,放宽了对线路传输大小的限制。 传输大小取决于基础传输的能力。 例如,对于 UDP,NFS 的传送限制仍然是 32 KB。 但是,因为 TCP 是流协议,没有 UDP 的数据报限制,因此通过 TCP 的最大传输大小已经增加到 1 MB。


如何挂载文件系统

以下说明适用于 NFS 版本 3 挂载。NFS 版本 4 挂载过程既不包括端口映射服务,也不包括 MOUNT 协议。

客户机需要从服务器挂载文件系统时,客户机必须从服务器获取文件句柄。文件句柄必须与文件系统对应。此过程需要在客户机与服务器之间进行多项事务处理。在本示例中,客户机正在尝试从服务器挂载 /home/terry。此事务处理的 snoop 跟踪如下。


client -> server PORTMAP C GETPORT prog=100005 (MOUNT) vers=3 proto=UDP

server -> client PORTMAP R GETPORT port=33492

client -> server MOUNT3 C Null

server -> client MOUNT3 R Null 

client -> server MOUNT3 C Mount /export/home9/terry

server -> client MOUNT3 R Mount OK FH=9000 Auth=unix

client -> server PORTMAP C GETPORT prog=100003 (NFS) vers=3 proto=TCP

server -> client PORTMAP R GETPORT port=2049

client -> server NFS C NULL3

server -> client NFS R NULL3 

client -> server NFS C FSINFO3 FH=9000

server -> client NFS R FSINFO3 OK

client -> server NFS C GETATTR3 FH=9000

server -> client NFS R GETATTR3 OK

在此跟踪中,客户机首先从 NFS 服务器上的端口映射服务请求挂载端口号。客户机收到挂载端口号 (33492) 后,会使用该端口号测试服务器上的服务的可用性。客户机确定服务正在该端口号上运行后,便会请求挂载。服务器对此请求做出响应时,服务器中包括正在挂载的文件系统 (9000) 的文件句柄。随后,客户机将针对 NFS 端口号发送请求。客户机收到来自服务器的端口号后,客户机便会测试 NFS 服务 (nfsd) 的可用性。另外,客户机还将请求有关使用文件句柄的文件系统的 NFS 信息。

在以下跟踪中,客户机正在使用 public 选项挂载文件系统。


client -> server NFS C LOOKUP3 FH=0000 /export/home9/terry

server -> client NFS R LOOKUP3 OK FH=9000

client -> server NFS C FSINFO3 FH=9000

server -> client NFS R FSINFO3 OK

client -> server NFS C GETATTR3 FH=9000

server -> client NFS R GETATTR3 OK

通过使用缺省的公共文件句柄(即 0000),系统将跳过所有要从端口映射服务获取信息并要确定 NFS 端口号的事务。


注 –

NFS 版本 4 提供对可变文件句柄的支持。有关更多信息,请参阅NFS 版本 4 中的可变文件句柄


挂载时 -public 选项和 NFS URL 的作用

使用 -public 选项可能造成导致挂载失败的条件。添加 NFS URL 也可产生导致失败的情形。以下列表介绍了如何使用这些选项挂载文件系统的具体细节。

客户端故障转移

通过使用客户端故障转移,NFS 客户机可以识别出使相同数据可用的多个服务器,并且在当前服务器不可用时可以切换到备用服务器。如果发生以下情况之一,则文件系统就会变得不可用。

在上述情况下执行的故障转移通常对用户是透明的。因此,故障转移可以随时进行,而不会中断客户机上正在运行的进程。

故障转移要求采用只读方式挂载文件系统。文件系统必须相同,故障转移才能成功进行。有关使文件系统相同的因素的说明,请参见什么是复制的文件系统?。静态文件系统或不经常被更改的文件系统是故障转移的最佳候选系统。

您不能对同一 NFS 挂载同时使用 CacheFS 和客户端故障转移。系统针对每个 CacheFS 文件系统存储了额外信息。故障转移期间不能更新此信息,因此挂载文件系统时只能使用这两个功能之一。

需要为每个文件系统建立的副本数目取决于许多因素。理想的情况是,应该至少具有两个服务器。每个服务器都应该支持多个子网。此设置比每个子网上具有唯一一个服务器更好。该过程要求检查列出的每个服务器。 因此,列出的服务器越多,每个挂载的速度就越慢。

故障转移术语

要完全领会该过程,需要了解两个术语。

什么是复制的文件系统?

为了实现故障转移,当其中每个文件大小都相同且文件大小或文件类型与原始文件系统相同时,可以将这样的文件系统称为副本。不考虑权限、创建日期和其他文件属性。如果文件大小或文件类型不同,则重映射将失败,且该过程将挂起,直到旧的服务器可用为止。在 NFS 版本 4 中,该行为是不同的。请参见NFS 版本 4 中的客户端故障转移

可以使用 rdistcpio 或其他文件传输机制来维护复制的文件系统。由于更新复制的文件系统会导致不一致,因此,为实现最佳效果应考虑以下预防措施:

故障转移和 NFS 锁定

某些软件包需要对文件进行读取锁定。为防止这些产品被破坏,允许对只读文件系统进行读取锁定,但是读取锁定仅对客户端是可见的。这些锁定在重映射后不会发生变化,因为服务器不“知晓”有关锁定的信息。由于文件不会发生更改,因此您不需要在服务器端锁定文件。

NFS 版本 4 中的客户端故障转移

在 NFS 版本 4 中,如果由于文件大小不同或文件类型不同而无法建立副本,则将发生以下情况。


注 –

如果重新启动应用程序并再次尝试访问该文件,则应该会成功。


在 NFS 版本 4 中,您不会再收到因不同大小的目录而导致的复制错误。在以前的 NFS 版本中,这种情况被视为错误且会阻碍重映射过程。

此外,在 NFS 版本 4 中,如果目录读取操作未成功,则将由列出的下一个服务器执行该操作。在以前的 NFS 版本中,未成功的读取操作将导致重映射失败且该过程挂起,直到原始服务器可用为止。

大文件

从 Solaris 2.6 发行版开始,Solaris OS 支持超过 2 GB 的文件。缺省情况下,UFS 文件系统是使用 -largefiles 选项挂载的,因而支持此新功能。以前的发行版不能处理此大小的文件。有关说明,请参见如何在 NFS 服务器上禁用大文件

如果服务器的文件系统是使用 -largefiles 选项挂载的,则 Solaris 2.6 NFS 客户机可以访问大文件,而不需进行更改。但是,并不是所有的 Solaris 2.6 命令都可以处理这些大文件。有关可处理大文件的命令的列表,请参见 largefile(5)。不能支持具有大文件扩展的 NFS 版本 3 协议的客户机不能访问任何大文件。尽管运行 Solaris 2.5 发行版的客户机可以使用 NFS 版本 3 协议,但是该发行版不提供大文件支持。

NFS 服务器日志如何工作

NFS 服务器日志记录提供 NFS 读写记录,以及修改文件系统的操作记录。此数据可用于跟踪对信息的访问。此外,记录可以提供用于度量信息重要性的定量方法。

访问启用日志记录的文件系统时,内核会将原始数据写入缓冲区文件。此数据包括以下内容:

nfslogd 守护进程会将此原始数据转换为日志文件中存储的 ASCII 记录。转换期间,IP 地址将被修改为主机名,UID 将被修改为登录名(如果已启用的名称服务可以找到匹配项)。文件句柄也被转换为路径名。为了完成转换,该守护进程将跟踪文件句柄并在单独的文件句柄到路径表中存储信息。这样,每次访问文件句柄时,就不必再次识别路径了。由于在 nfslogd 关闭时不会在文件句柄到路径表中对映射进行任何更改,因此必须始终使该守护进程保持运行状态。


注 –

NFS 版本 4 不支持服务器日志记录。


WebNFS 服务如何工作

WebNFS 服务通过使用公共文件句柄使目录中的文件可用于客户机。文件句柄是内核生成的地址,可标识 NFS 客户机的文件。公共文件句柄具有预定义的值,因此服务器不需要为客户机生成文件句柄。通过删除 MOUNT 协议,可以使用此预定义文件句柄来减少网络通信流量。此能力还会加速客户机的进程处理。

缺省情况下,系统将在根文件系统上建立 NFS 服务器上的公共文件句柄。此缺省设置为 WebNFS 提供了对已在服务器上具有挂载的任何客户机的访问权限。通过使用 share 命令,可以更改公共文件句柄以指向任何文件系统。

当客户机具有与文件系统对应的文件句柄时,将会运行 LOOKUP,以确定与要访问的文件对应的文件句柄。NFS 协议一次只允许评估一个路径名组件。目录分层结构的每个附加层都需要运行一次 LOOKUP。当 LOOKUP 与公共文件句柄有关时,WebNFS 服务器可以使用单个多组件查找事务来评估整个路径名。多组件查找使 WebNFS 服务器可以将该文件句柄传送到所需的文件,而不针对路径名中的每一目录层交换文件句柄。

此外,NFS 客户机还可以通过单一 TCP 连接启动并发下载。此连接提供快速访问,而不会在服务器上产生因设置多个连接而导致的负载增加。尽管 Web 浏览器应用程序支持多个文件的并发下载,但每个文件都有各自的连接。通过使用某个连接,WebNFS 软件可以减少服务器上的系统开销。

如果路径名中的最终组件是指向其他文件系统的符号链接,则客户机可以访问文件(如果客户机已具备通过正常的 NFS 活动进行访问的权限)。

通常,NFS URL 是相对于公共文件句柄进行评估的。通过在路径的开始位置添加一个附加的斜杠,可以更改评估,使其相对于服务器的根文件系统。在本示例中,如果已在 /export/ftp 文件系统上建立了公共文件句柄,则这两个 NFS URL 是等效的。


nfs://server/junk

nfs://server//export/ftp/junk

注 –

NFS 版本 4 协议优先于 WebNFS 服务。NFS 版本 4 完全集成了已添加到 MOUNT 协议和 WebNFS 服务中的所有安全协商。


WebNFS 安全协商如何工作

Solaris 8 发行版包括一个新协议,该协议使 WebNFS 客户机可以与 WebNFS 服务器协商选定的安全机制。 新协议使用安全协商多组件查找功能,该功能是对早期版本的 WebNFS 协议中使用的多组件查找功能的扩展。

WebNFS 客户机通过使用公共文件句柄来发出常规多组件查找请求,进而启动过程。由于客户机不知道服务器保护路径的方式,因此将使用缺省的安全机制。如果缺省的安全机制不够,则服务器将使用 AUTH_TOOWEAK 错误进行回复。此回复表明缺省机制无效。客户机需要使用更强大的缺省机制。

客户机收到 AUTH_TOOWEAK 错误后,会向服务器发送请求,以确定需要哪种安全机制。如果请求成功,则服务器将使用指定路径所需的安全机制数组进行响应。根据安全机制数组的大小,客户机可能必须发出更多请求才能获取完整的数组。如果服务器不支持 WebNFS 安全协商,则请求将失败。

成功请求后,WebNFS 客户机将从其支持的数组中选择第一个安全机制。然后,该客户机将使用选定的安全机制发出常规多组件查找请求,以获取文件句柄。所有后续的 NFS 请求都是使用选定安全机制和文件句柄发出的。


注 –

NFS 版本 4 协议优先于 WebNFS 服务。NFS 版本 4 完全集成了已添加到 MOUNT 协议和 WebNFS 服务中的所有安全协商。


有关 Web 浏览器使用的 WebNFS 限制

WebNFS 软件不支持使用 HTTP 的 Web 站点可以提供的多项功能。这些差异源自 NFS 服务器仅发送文件的事实,因此必须在客户机上执行特殊处理。如果需要为 WebNFS 和 HTTP 访问配置一个 Web 站点,则应考虑以下问题:

安全 NFS 系统

NFS 环境是用于在具有不同计算机体系结构和操作系统的网络中共享文件系统的一种强大而便捷的方式。但是,这些通过 NFS 操作使文件系统共享非常便利的功能同时还会造成一些安全问题。以前,大多数 NFS 实现使用 UNIX(或 AUTH_SYS)验证,但是也可以使用更强大的验证方法(如 AUTH_DH)。使用 UNIX 验证时,NFS 服务器通过验证发出请求的计算机(而不是用户)来验证文件请求。因此,客户机用户可以运行 su 并模仿文件的属主。如果使用 DH 验证,则 NFS 服务器将验证用户,这使这类模仿非常困难。

凭借超级用户权限和对网络编程的了解,任何人都可以将任意数据引入网络,并从网络中提取任何数据。最危险的攻击就是涉及数据引入的那些攻击。例如,通过生成适当的包或通过记录“会话”并稍候重放来模仿用户。这些攻击将影响数据的完整性。涉及被动窃听(仅侦听网络通信流量,而不模仿任何人)的攻击不是很危险,因为不会损害数据完整性。用户可通过对通过网络发送的数据进行加密来保护敏感信息的保密性。

解决网络安全问题的常见方法是针对每个应用程序都单独制定解决方案。更好的方法是在涉及所有应用程序的层上实现标准验证系统。

Solaris 操作系统包括位于远程过程调用 (remote procedure call, RPC) 层上的验证系统(NFS 操作所依赖的机制)。此系统(称为安全 RPC)可以大大提高网络环境的安全性,并能为 NFS 系统等服务提供附加安全性。当 NFS 系统使用由安全 RPC 提供的功能时,该系统称为安全 NFS 系统。

安全 RPC

安全 RPC 是安全 NFS 系统的基础。 安全 RPC 的目标是建立至少与分时系统一样安全的系统。 在分时系统中,所有用户共享单个计算机。分时系统通过登录口令验证用户。使用数据加密标准 (Data Encryption Standard, DES) 验证,可以完成相同的验证过程。用户可以登录任何远程计算机,就像登录本地终端一样。用户的登录口令是其网络安全的保证。在时间共享环境中,系统管理员在道义上不会更改口令以模仿某人。在安全 RPC 中,网络管理员是受信任的,不会更改存储公钥的数据库中的项。

为了解 RPC 验证系统,您需要熟悉两个术语:凭证和检验器。以 ID 证件为例,凭证就是标识用户的具体内容:姓名、地址和生日。检验器就是附加到证件上的照片。通过对照携带该证件的人员检查该证件上的照片,可以确定该证件未被盗用。在 RPC 中,客户机进程会使用每个 RPC 请求将凭证和检验器发送到服务器。服务器仅发回检验器,因为客户机已经“知晓”服务器的凭证。

RPC 验证是开放式的,这表示可以在其中插入各种验证系统,如 UNIX、DH 和 KERB。

当 UNIX 验证由网络服务使用时,凭证包含客户机的主机名、UID、GID 和组访问列表。但是,检验器不包含任何内容。由于不存在检验器,因此超级用户可以使用如 su 等命令来伪造相应的凭证。UNIX 验证的另一个问题是 UNIX 验证将假设网络中的所有计算机都是 UNIX 计算机。UNIX 验证在应用于异构网络中的其他操作系统时将会中断。

为克服 UNIX 验证问题,安全 RPC 使用 DH 验证。

DH 验证

DH 验证使用数据加密标准 (Data Encryption Standard, DES) 和 Diffie-Hellman 公钥密码学来验证网络中的用户和计算机。DES 是标准加密机制。Diffie-Hellman 公钥密码学是包含两个密钥的密码系统:一个公钥和一个私钥。公钥和私钥存储在名称空间中。NIS 将密钥存储在公钥映射中。这些映射包含所有潜在用户的公钥和私钥。有关如何设置映射的更多信息,请参见《系统管理指南:名称和目录服务(DNS、NIS 和 LDAP)》

DH 验证的安全性依赖于发件人加密当前时间的能力,随后收件人可以对该时间进行解密,并对照自己的时钟进行检查。时间标记是使用 DES 进行加密的。使此方案正常工作的要求如下所示:

如果网络运行时间同步程序,则系统将自动同步客户机和服务器上的时间。如果时间同步程序不可用,则可以使用服务器的时间(而不是网络时间)来计算时间标记。启动 RPC 会话之前,客户机将询问服务器时间,然后计算其自己的时钟与服务器时钟之间的时间差值。计算时间标记时会使用该差值来调整客户机的时钟。如果客户机与服务器的时钟未同步,则服务器将开始拒绝客户机的请求。客户机上的 DH 验证系统将与服务器重新进行同步。

客户机和服务器使用同一个加密密钥,具体方法是:生成一个随机的对话密钥(也称为会话密钥)并使用公钥密码学推导公用密钥。公用密钥是只有客户机和服务器才能推导的密钥。对话密钥用于加密和解密客户机的时间标记。公用密钥用于加密和解密对话密钥。

KERB 验证

Kerberos 是 MIT 开发的验证系统。Kerberos 提供各种加密类型,包括 DES。Kerberos 支持不再作为安全 RPC 的一部分来提供,但是从 Solaris 9 发行版开始,包括服务器端和客户端实现。有关 Kerberos 验证实现的更多信息,请参见《系统管理指南:安全性服务》中的第 20  章 “Kerberos 服务介绍”

在 NFS 中使用安全 RPC

如果计划使用安全 RPC,请注意以下几点:

Autofs 映射

Autofs 使用三种类型的映射:

Autofs 主映射

auto_master 映射将目录与映射相关联。该映射是指定 autofs 应检查的所有映射的主列表。以下示例说明 auto_master 文件可能包含的内容。


示例 6–3 样例 /etc/auto_master 文件


# Master map for automounter 

# 

+auto_master 

/net            -hosts           -nosuid,nobrowse 

/home           auto_home        -nobrowse 

/-              auto_direct     -ro  

本示例说明在常规 auto_master 文件中额外增加了 auto_direct 映射。主映射 /etc/auto_master 中的每一行都具有以下语法:

mount-point map-name [ mount-options ]

mount-point

mount-point 是目录的全(绝对)路径名。如果目录不存在,则 autofs 将创建该目录(如果可能)。如果目录存在且不为空,则在该目录上挂载会隐藏该目录的内容。在这种情况下,autofs 将发出警告。

作为挂载点的表示法 /- 指示此特定映射是直接映射。该表示法还表示没有特定的挂载点与该映射关联。

map-name

map-name 是 autofs 用于查找位置说明或挂载信息的映射。如果名称前面有一个斜杠 (/),则 autofs 会将该名称解释为本地文件。否则,autofs 会使用在名称服务转换器配置文件 (/etc/nsswitch.conf) 中指定的搜索项来搜索挂载信息。特殊映射还可用于 /net。有关更多信息,请参见挂载点 /net

mount-options

mount-options 是可选的以逗号分隔的选项列表,其中的选项适用于挂载在映射名称中指定的项,除非映射名称中的项列出了其他选项。每种特定类型的文件系统的选项都列在该文件系统的挂载手册页中。例如,有关特定于 NFS 的挂载选项,请参见 mount_nfs(1M) 手册页。对于特定于 NFS 的挂载点,bg(后台)和 fg(前台)选项都不适用。

# 开头的行是注释。# 之后直到行尾的所有文本都将被忽略。

要将较长的行拆分为较短的行,请在行尾放置一个反斜杠 (\)。项的最大字符数为 1024。


注 –

如果在两个项中使用了同一挂载点,则 automount 命令会使用第一项。第二项将被忽略。


挂载点 /home

挂载点 /home/etc/auto_home(间接映射)中列出的项将要挂载到的目录。


注 –

缺省情况下,Autofs 可以在所有计算机上运行且支持 /net/home(自动挂载的起始目录)。这些缺省值可以被 NIS auto.master 映射或 NIS+ auto_master 表中的项覆盖,也可以被 /etc/auto_master 本地文件中的项覆盖。


挂载点 /net

Autofs 将在目录 /net 下挂载特殊映射 -hosts 中的所有项。该映射是仅使用主机数据库的内置映射。假设计算机 gumbo 位于主机数据库中,且可以导出其任何文件系统。以下命令会将当前目录更改为计算机 gumbo 的根目录。


% cd /net/gumbo

Autofs 只能挂载主机 gumbo已导出文件系统,即服务器上可供网络用户使用的那些文件系统,而不是本地磁盘上的那些文件系统。因此,gumbo 中的所有文件和目录可能都无法通过 /net/gumbo 使用。

使用 /net 访问方法时,服务器名称位于路径中,且与位置相关。如果要将导出的文件系统从一个服务器移动到另一个服务器,则该路径可能无法再正常工作。应针对所需的文件系统在映射中特别设置一项,而不应使用 /net


注 –

Autofs 仅在挂载时检查服务器的导出列表。挂载服务器的文件系统之后,在自动取消挂载该服务器的文件系统之前,autofs 不会再次检查服务器。因此,只有在取消挂载客户机上的文件系统,然后重新挂载之后,才能“看到”新导出的文件系统。


Autofs 直接映射

直接映射是自动挂载点。使用直接映射时,客户机上的挂载点与服务器上的目录之间存在直接关联。直接映射具有全路径名并显式指示这种关系。以下是典型的 /etc/auto_direct 映射:


/usr/local          -ro \

   /bin                   ivy:/export/local/sun4 \

   /share                 ivy:/export/local/share \

   /src                   ivy:/export/local/src

/usr/man            -ro   oak:/usr/man \

                          rose:/usr/man \

                          willow:/usr/man 

/usr/games          -ro   peach:/usr/games 

/usr/spool/news     -ro   pine:/usr/spool/news \

                          willow:/var/spool/news 

直接映射中的行具有以下语法:

key [ mount-options ] location

key

key 是直接映射中挂载点的路径名。

mount-options

mount-options 是要应用于此特定挂载的选项。仅在这些选项不同于映射缺省值时,才需要这些选项。每种特定类型的文件系统的选项都列在该文件系统的挂载手册页中。例如,有关特定于 CacheFS 的挂载选项,请参见 mount_cachefs(1M) 手册页。有关在不同 NFS 版本中使用 CacheFS 选项的信息,请参见使用 CacheFS 访问 NFS 文件系统

location

location 是文件系统的位置。对于 NFS 文件系统和高层 Sierra 文件系统 (High Sierra file system, HSFS),分别以 server:pathname 和 :devicename 形式指定一个或多个文件系统指定。


注 –

pathname 不应包括自动挂载的挂载点。pathname 应该为文件系统的实际绝对路径。例如,起始目录的位置应列为 server:/export/home/username,而不是 server:/home/username


与主映射一样,以 # 开头的行是注释。# 之后直到行尾的所有文本都将被忽略。要将较长的行拆分为较短的行,请在行尾放置一个反斜杠。

在所有的映射中,直接映射中的项最类似于 /etc/vfstab 中相应的项。/etc/vfstab 中可能存在如下所示的项:


dancer:/usr/local - /usr/local/tmp nfs - yes ro 

其等效的项则以如下形式出现在直接映射中:


/usr/local/tmp     -ro     dancer:/usr/local

注 –

自动挂载程序映射之间不会出现任何选项关联。添加到自动挂载程序映射中的任何选项将覆盖以前搜索到的映射中列出的所有选项。例如,auto_master 映射中包含的选项将被任何其他映射中的相应项所覆盖。


有关与此类型的映射关联的其他重要功能,请参见Autofs 如何为客户机选择最近的只读文件(多个位置)

挂载点 /-

示例 6–3 中,挂载点 /- 通知 autofs 不要将 auto_direct 中的项与任何特定挂载点关联。间接映射使用在 auto_master 文件中定义的挂载点。直接映射使用在已命名映射中指定的挂载点。请记住,在直接映射中,关键字或挂载点是全路径名。

NIS 或 NIS+ auto_master 文件只能具有一个直接映射项,因为在名称空间中挂载点必须是唯一的值。作为本地文件的 auto_master 文件可以具有任意数目的直接映射项(如果这些项不重复)。

Autofs 间接映射

间接映射使用关键字的替代值在客户机上的挂载点与服务器上的目录之间建立关联。间接映射对于访问特定文件系统(如起始目录)非常有用。auto_home 映射便是间接映射。

间接映射中的行具有以下通用语法:

key [ mount-options ] location

key

key 是间接映射中的简单名称(不含斜杠)。

mount-options

mount-options 是要应用于此特定挂载的选项。仅在这些选项不同于映射缺省值时,才需要这些选项。每种特定类型的文件系统的选项都列在该文件系统的挂载手册页中。例如,有关特定于 NFS 的挂载选项,请参见 mount_nfs(1M) 手册页。

location

location 是文件系统的位置。可以 server:pathname 形式指定一个或多个文件系统。


注 –

pathname 不应包括自动挂载的挂载点。pathname 应该为文件系统的实际绝对路径。例如,目录的位置应列为 server:/usr/local,而不要列为 server:/net/server/usr/local


与主映射一样,以 # 开头的行是注释。# 之后直到行尾的所有文本都将被忽略。要将较长的行拆分为较短的行,请在行尾放置一个反斜杠 (\)。示例 6–3 说明包含以下项的 auto_master 映射:


/home      auto_home        -nobrowse    

auto_home 是包含要在 /home 下挂载的项的间接映射的名称。典型的 auto_home 映射可能包含以下内容:


david                  willow:/export/home/david

rob                    cypress:/export/home/rob

gordon                 poplar:/export/home/gordon

rajan                  pine:/export/home/rajan

tammy                  apple:/export/home/tammy

jim                    ivy:/export/home/jim

linda    -rw,nosuid    peach:/export/home/linda

例如,假设上面的映射在主机 oak 上。假设用户 linda 在口令数据库中有一项,该项将她的起始目录指定为 /home/linda。只要 linda 登录计算机 oak,autofs 就会挂载位于计算机 peach 上的目录 /export/home/linda。她的起始目录以读写方式和 nosuid 进行挂载。

假设发生以下情况:用户 linda 的起始目录在口令数据库中列为 /home/linda。任何人(包括 Linda)都可以从使用特定主映射(引用上一个示例中的映射的主映射)设置的任何计算机访问此路径。

在上述情况下,用户 linda 可以在其中的任何一台计算机上运行 loginrlogin,并且已为她挂载了起始目录。

而且,此时 Linda 还可以键入以下命令:


% cd ~david

autofs 将为她挂载 David 的起始目录(如果允许所有权限)。


注 –

自动挂载程序映射之间不会出现任何选项关联。添加到自动挂载程序映射中的任何选项将覆盖以前搜索到的映射中列出的所有选项。例如,将使用任何其他映射中对应的项覆盖 auto_master 映射中包括的选项。


在没有名称服务的网络中,必须更改网络中所有系统上的所有相关文件(如 /etc/passwd)以允许 Linda 访问其文件。在运行 NIS 的网络中,应在 NIS 主服务器上进行更改并将相关的数据库传播到从属服务器。在运行 NIS+ 的网络中,执行更改后会自动将相关的数据库传播到从属服务器。

Autofs 如何工作

Autofs 是一项可自动挂载相应文件系统的客户端服务。以下是协同工作以完成自动挂载的组件:

自动挂载服务 svc:/system/filesystem/autofs 是在系统启动时调用的,可读取主映射文件 auto_master 以创建最初的一组 autofs 挂载。这些 autofs 挂载在启动时不会自动挂载。这些挂载是一些点,以后将会在这些点之下挂载文件系统。这些点也称为触发节点。

设置 autofs 挂载后,这些挂载可以触发要在其下挂载的文件系统。例如,当 autofs 收到访问当前未挂载的文件系统的请求时,autofs 将调用实际挂载所请求的文件系统的 automountd

最初挂载 autofs 挂载后,可以使用 automount 命令根据需要更新 autofs 挂载。该命令将比较 auto_master 映射中的挂载列表和挂载表文件 /etc/mnttab(以前为 /etc/mtab)中的已挂载文件系统的列表。随后,automount 将进行相应的更改。该进程允许系统管理员更改 auto_master 中的挂载信息,并使 autofs 进程可以使用这些更改,而无需停止并重新启动 autofs 守护进程。挂载文件系统后,在自动取消挂载文件系统之前,进一步进行访问不需要 automountd 执行任何操作。

mount 不同,automount 不会读取 /etc/vfstab 文件(特定于每台计算机)以获取要挂载的文件系统的列表。在域中和计算机上 automount 命令是通过名称空间或本地文件进行控制的。

以下是有关 autofs 工作方式的简要概述。

自动挂载守护进程 automountd 是在引导时由服务 svc:/system/filesystem/autofs 启动的。请参见图 6–3。此服务还运行 automount 命令,后者读取主映射并安装 autofs 挂载点。有关更多信息,请参见Autofs 如何启动导航进程(主映射)

图 6–3 svc:/system/filesystem/autofs 服务启动 automount

文中对该图形进行了说明。

Autofs 是支持自动挂载和取消挂载的内核文件系统。

请求访问 autofs 挂载点处的文件系统时,将发生下列情况:

  1. Autofs 拦截请求。

  2. Autofs 将消息发送到 automountd,以便挂载请求的文件系统。

  3. automountd 在映射中查找文件系统信息,创建触发节点并执行挂载。

  4. Autofs 允许继续处理被拦截的请求。

  5. 当文件系统在一段时间内没有活动后,Autofs 取消挂载该文件系统。


注 –

不应手动挂载或取消挂载通过 autofs 服务管理的挂载。即使手动操作成功,autofs 服务也不会检查是否已取消挂载该对象,从而可能导致不一致。重新引导时将清除所有 autofs 挂载点。


Autofs 如何在网络中进行导航(映射)

Autofs 将搜索一系列映射以在网络中进行导航。映射是包含诸如网络中的所有用户的口令项或网络中的所有主机名称等信息的文件。实际上,这些映射包含网络范围内与 UNIX 管理文件等效的文件。可以在本地或通过网络名称服务(如 NIS 或 NIS+)使用映射。可以使用 Solaris Management Console 工具创建映射,以满足环境的需要。请参见修改 Autofs 导航网络的方式(修改映射)

Autofs 如何启动导航进程(主映射)

automount 命令在系统启动时读取主映射。主映射中的每一项都包含直接映射名或间接映射名、映射路径和映射的挂载选项,如图 6–4 所示。项的特定顺序并不重要。automount 会将主映射中的项与挂载表中的项进行比较,以生成最新列表。

图 6–4 在主映射中进行导航

文中对该图形进行了说明。

Autofs 挂载过程

触发挂载请求时,autofs 服务执行的具体操作取决于自动挂载程序映射的配置方式。一般情况下,挂载过程对于所有挂载都是相同的。但是,最终结果会因指定的挂载点和映射的复杂性而异。从 Solaris 2.6 发行版开始,也对挂载过程进行了更改,使其包括触发节点的创建。

简单 Autofs 挂载

为帮助说明 autofs 挂载过程,假设已安装了以下文件。


$ cat /etc/auto_master

# Master map for automounter

#

+auto_master

/net        -hosts        -nosuid,nobrowse

/home       auto_home     -nobrowse

/share      auto_share

$ cat /etc/auto_share

# share directory map for automounter

#

ws          gumbo:/export/share/ws

访问 /share 目录时,autofs 服务将为 /share/ws 创建触发节点,/share/ws 是 /etc/mnttab 中类似于以下项的项:


-hosts  /share/ws     autofs  nosuid,nobrowse,ignore,nest,dev=###

访问 /share/ws 目录时,autofs 服务将通过以下步骤完成该过程:

  1. 检查服务器的挂载服务的可用性。

  2. /share 下挂载请求的文件系统。此时,/etc/mnttab 文件包含以下项。


    -hosts  /share/ws     autofs  nosuid,nobrowse,ignore,nest,dev=###
    
    gumbo:/export/share/ws /share/ws   nfs   nosuid,dev=####    #####

分层挂载

在自动挂载程序文件中定义了多层后,挂载过程将变得更加复杂。假设您对上一个示例中的 /etc/auto_shared 文件进行了扩展,使其包含以下内容:


# share directory map for automounter

#

ws       /       gumbo:/export/share/ws

         /usr    gumbo:/export/share/ws/usr

该挂载过程基本上与上一个示例中访问 /share/ws 挂载点时的情况相同。此外,下一层 (/usr) 的触发节点是在 /share/ws 文件系统中创建的,因此可以挂载下一层(如果可以对其进行访问)。在本示例中,/export/share/ws/usr 必须存在于 NFS 服务器上,才能创建触发节点。


注意 – 注意 –

指定分层递阶时,请勿使用 -soft 选项。有关此限制的说明,请参阅Autofs 取消挂载


Autofs 取消挂载

一段空闲时间后将按相反的顺序(与挂载顺序相反)执行取消挂载过程。如果分层结构中的较高层上的某个目录处于繁忙状态,则只取消挂载该目录下面的文件系统。在取消挂载过程中,将先删除所有触发节点,然后再取消挂载文件系统。如果文件系统处于繁忙状态,则取消挂载将失败并将重新安装触发节点。


注意 – 注意 –

指定分层递阶时,请勿使用 -soft 选项。如果使用 -soft 选项,则重新安装触发节点的请求可能会超时。如果重新安装触发节点失败,将不能再访问下一层挂载。解决此问题的唯一方法是让自动挂载程序取消挂载分层结构中的所有组件。自动挂载程序通过等待文件系统自动取消挂载或重新引导系统来完成取消挂载。


Autofs 如何为客户机选择最近的只读文件(多个位置)

该直接映射示例包含以下内容:


/usr/local          -ro \

   /bin                   ivy:/export/local/sun4\

   /share                 ivy:/export/local/share\

   /src                   ivy:/export/local/src

/usr/man            -ro   oak:/usr/man \

                          rose:/usr/man \

                          willow:/usr/man

/usr/games          -ro   peach:/usr/games

/usr/spool/news     -ro   pine:/usr/spool/news \

                          willow:/var/spool/news 

挂载点 /usr/man/usr/spool/news 列出了多个位置,第一个挂载点有三个位置,第二个挂载点有两个位置。 任何复制的位置都可以向任何用户提供相同的服务。只有在挂载只读文件系统时此过程才有意义,因为您必须对要写入或修改的文件位置进行某些控制。您需要避免在某个时候修改某个服务器上的文件,然后在几分钟后又去修改其他服务器上的“同一个”文件。这样做的优点是,将自动使用可用性最佳的服务器,而无需执行用户所需的任何工作。

如果已将文件系统配置为副本(请参见什么是复制的文件系统?),则客户机可以利用故障转移。这样,不仅可以自动确定最佳的服务器,而且在该服务器不可用时,客户机还会自动使用下一个最佳服务器。故障转移最先在 Solaris 2.6 发行版中得以实现。

将好的文件系统配置为副本的示例是手册页。在大型网络中,多个服务器可以导出当前的一组手册页。如果服务器正在运行且正在导出其文件系统,则从哪个服务器挂载手册页并不重要。在前面示例中,多个挂载位置在映射项中被表示为挂载位置的列表。


/usr/man -ro oak:/usr/man rose:/usr/man willow:/usr/man 

在本示例中,可以从服务器 oakrosewillow 挂载手册页。哪个服务器最好取决于很多因素,其中包括:

排序期间,将对支持各版本的 NFS 协议的服务器进行计数。大多数服务器支持的协议版本将成为要使用的缺省协议。此选择为客户机提供最多可依赖的服务器。

找到包含同一版本协议的最大的服务器子集后,服务器列表将按邻近度进行排序。为确定邻近度,将检查 IPv4 地址。根据 IPv4 地址可显示每个子网中的服务器。本地子网中的服务器优先于远程子网中的服务器。首选最近的服务器可以减少延迟时间和网络通信流量。


注 –

不能确定使用 IPv6 地址的副本的邻近度。


图 6–5 说明了服务器的邻近度。

图 6–5 服务器邻近度

文中对该图形进行了说明。

如果支持同一协议的多个服务器位于本地子网中,则系统将确定连接每个服务器的时间并将使用最快的服务器。使用加权也会影响排序(请参见Autofs 和加权)。

例如,如果版本 4 服务器比较多,则版本 4 将成为要使用的缺省协议。但是,现在排序过程更加复杂了。以下是如何进行排序的一些示例。


注 –

/etc/default/nfs 文件中的关键字值也会影响加权。具体来说,NFS_SERVER_VERSMIN、NFS_CLIENT_VERSMIN、NFS_SERVER_VERSMAX 和 NFS_CLIENT_VERSMAX 的值可以从排序过程中排除某些版本。有关这些关键字的更多信息,请参见/etc/default/nfs 文件的关键字


选择服务器之后,可以在挂载时使用故障转移检查排序方式。在个别服务器可能无法临时导出其文件系统的环境中,多个位置是非常有用的。

在具有许多子网的大型网络中,故障转移特别有用。Autofs 将选择适当的服务器,并且能够将 NFS 网络通信限制在本地网络段。如果服务器具有多个网络接口,则可以列出与每个网络接口关联的主机名,就像接口是单独的服务器一样。Autofs 将选择离客户机最近的接口。


注 –

对于手动挂载,不会执行任何加权和邻近度检查。mount 命令将对从左到右列出的服务器设置优先级。


有关更多信息,请参见 automount(1M) 手册页。

Autofs 和加权

对 autofs 映射增加加权值可影响对处于同一邻近度级别的服务器的选择。例如:


/usr/man -ro oak,rose(1),willow(2):/usr/man

括号中的数字指示加权。不含加权的服务器的值为零,因此最有可能被选择。加权值越高,服务器被选中的几率越低。


注 –

所有其他的服务器选择因素都比加权重要。只有在网络邻近度相同的服务器之间进行选择时,才考虑加权。


映射项中的变量

通过在客户机名称前加一个美元符号 ($) 前缀可以创建特定于该客户机的变量。该变量有助于了解正在访问同一个文件系统位置的不同体系结构类型。还可以使用花括号将变量名与附加字母或数字分隔开。表 6–2 显示了预定义映射变量。

表 6–2 预定义映射变量

变量 

含义 

源自 

示例 

ARCH

体系结构类型 

uname -m

sun4u

CPU

处理器类型 

uname -p

sparc

HOST

主机名 

uname -n

dinky

OSNAME

操作系统名称 

uname -s

SunOS

OSREL

操作系统发行版 

uname -r

5.8

OSVERS

操作系统版本(发行版的版本) 

uname -v

GENERIC

可以在项所在行的任何位置使用变量,但关键字除外。例如,假设您的文件服务器分别从 /usr/local/bin/sparc/usr/local/bin/x86 中导出 SPARC 和 x86 体系结构的二进制文件。客户机可以通过如下映射项进行挂载:


/usr/local/bin	   -ro	server:/usr/local/bin/$CPU

现在,所有客户机的同一项将应用于所有体系结构。


注 –

针对任何 sun4 体系结构编写的大多数应用程序可以在所有 sun4 平台上运行。-ARCH 变量硬编码为 sun4


引用其他映射的映射

文件映射中使用的映射项 +mapname 将导致自动挂载读取指定的映射,就好像该映射包含在当前文件中一样。如果 mapname 前面没有斜杠,则 autofs 会将映射名视为字符串,并使用名称服务转换器策略查找映射名。如果路径名是绝对路径名,则 automount 将检查该名称的本地映射。如果映射名以破折号 (-) 开头,则 automount 将访问相应的内置映射,如 hosts

此名称服务转换器文件包含标记为 automount 的 autofs 的一个项,其中包含搜索名称服务的顺序。以下文件是名称服务转换器文件的示例。


#

# /etc/nsswitch.nis:

#

# An example file that could be copied over to /etc/nsswitch.conf;

# it uses NIS (YP) in conjunction with files.

#

# "hosts:" and "services:" in this file are used only if the /etc/netconfig

# file contains "switch.so" as a nametoaddr library for "inet" transports.

# the following two lines obviate the "+" entry in /etc/passwd and /etc/group.

passwd:         files nis

group:          files nis



# consult /etc "files" only if nis is down.

hosts:          nis [NOTFOUND=return] files

networks:       nis [NOTFOUND=return] files

protocols:      nis [NOTFOUND=return] files

rpc:            nis [NOTFOUND=return] files

ethers:         nis [NOTFOUND=return] files

netmasks:       nis [NOTFOUND=return] files

bootparams:     nis [NOTFOUND=return] files

publickey:      nis [NOTFOUND=return] files

netgroup:       nis

automount:      files nis

aliases:        files nis

# for efficient getservbyname() avoid nis

services:       files nis 

在本示例中,会在搜索 NIS 映射之前先搜索本地映射。因此,可以在本地 /etc/auto_home 映射中为最常访问的起始目录包含几个项。然后,可以使用转换器回退到 NIS 映射以查找其他项。


bill               cs.csc.edu:/export/home/bill

bonny              cs.csc.edu:/export/home/bonny

搜索包括的映射后,如果找不到匹配项,automount 将继续扫描当前映射。因此,可以在 + 项之后添加更多项。


bill               cs.csc.edu:/export/home/bill

bonny              cs.csc.edu:/export/home/bonny

+auto_home 

包括的映射可以是本地文件,也可以是内置映射。请记住,只有本地文件可以包含 + 项。


+auto_home_finance      # NIS+ map

+auto_home_sales        # NIS+ map

+auto_home_engineering  # NIS+ map

+/etc/auto_mystuff      # local map

+auto_home              # NIS+ map

+-hosts                 # built-in hosts map 

注 –

不能在 NIS+ 或 NIS 映射中使用 + 项。


Autofs 可执行映射

可以创建能执行某些命令以生成 autofs 挂载点的 autofs 映射。如果需要根据数据库或平面文件创建 autofs 结构,则使用 autofs 可执行映射将非常有用。使用可执行映射的缺点是,需要在每台主机上安装该映射。可执行映射不能包括在 NIS 或 NIS+ 名称服务中。

可执行映射的项必须位于 auto_master 文件中。


/execute    auto_execute

以下是可执行映射的示例:


#!/bin/ksh

#

# executable map for autofs

#



case $1 in

	         src)  echo '-nosuid,hard bee:/export1' ;;

esac

为使本示例正常工作,该文件必须作为 /etc/auto_execute 进行安装,且必须设置可执行位。将权限设置为 744。在上述情况下,运行以下命令将导致从 bee 挂载 /export1 文件系统:


% ls /execute/src

修改 Autofs 导航网络的方式(修改映射)

可以在映射中修改、删除或添加项,以满足环境的需要。用户所需的应用程序和其他文件系统更改其位置时,映射必须反映这些更改。可以随时修改 autofs 映射。所做修改在 automountd 下次挂载文件系统时是否生效取决于修改的映射和修改类型。

使用名称服务时的缺省 Autofs 行为

引导时服务 svc:/system/filesystem/autofs 将调用 autofs,然后 autofs 将检查 auto_master 主映射。Autofs 遵循下文讨论的规则。

Autofs 使用在 /etc/nsswitch.conf 文件的自动挂载项中指定名称服务。如果指定了 NIS+(而不是本地文件或 NIS),则使用所有映射的原有映射名。如果选择了 NIS,且 autofs 找不到其所需的映射,而找到包含一个或多个下划线的映射名,则会将下划线改为点。这种更改允许旧的 NIS 文件名仍然有效。然后,autofs 将再次检查映射,如图 6–6 所示。

图 6–6 Autofs 使用名称服务的方式

文中对该图形进行了说明。

此会话的屏幕活动与以下示例类似。


$ grep /home /etc/auto_master

/home           auto_home



$ ypmatch brent auto_home

Can't match key brent in map auto_home.  Reason: no such map in

server's domain.



$ ypmatch brent auto.home

diskus:/export/home/diskus1/&

如果选择 "files" 作为名称服务,则所有的映射都被假定为 /etc 目录中的本地文件。Autofs 会将以斜杠 (/) 开头的映射名解释为本地文件,无论 autofs 使用哪种名称服务。

Autofs 参考

本章的其余几节介绍更高级的 autofs 功能和主题。

Autofs 和元字符

Autofs 会将某些字符识别为具有特殊含义。某些字符用于替换,而某些字符用于保护其他字符不被 autofs 映射解析器解析。

& 号 (&)

如果您的映射中指定了许多子目录(如下所示),请考虑使用字符串替换。


john        willow:/home/john

mary        willow:/home/mary

joe         willow:/home/joe

able        pine:/export/able

baker       peach:/export/baker

可以使用 & 号字符 (&) 替换所有关键字。如果使用 & 号,则上一个映射会更改为以下形式:


john        willow:/home/&

mary        willow:/home/&

joe         willow:/home/&

able        pine:/export/&

baker       peach:/export/&

在如下情况下,还可以在直接映射中使用关键字替换:


/usr/man						willow,cedar,poplar:/usr/man

也可以按照以下方式进一步简化项:


/usr/man						willow,cedar,poplar:&

请注意,& 号替换使用整个关键字字符串。因此,如果直接映射中的关键字以 /(按原样)开头,则替换中应包括斜杠。因此,例如,您不能执行以下操作:


/progs				&1,&2,&3:/export/src/progs 

原因是 autofs 会将示例解释为以下内容:


/progs 				/progs1,/progs2,/progs3:/export/src/progs

星号 (*)

可以使用通用替换字符星号 (*) 与任何关键字匹配。可以通过以下映射项从所有主机挂载 /export 文件系统。


*						&:/export

每个 & 号均替换为任何给定关键字的值。Autofs 会将星号解释为文件结束字符。

Autofs 和特殊字符

如果您的映射项包含特殊字符,则可能必须挂载其名称令 autofs 映射解析器迷惑的目录。autofs 解析器对于包含如冒号、逗号和空格等的名称非常敏感。应该用双引号括住这些名称,如下所示:


/vms    -ro    vmsserver: -  -  - "rc0:dk1 - "

/mac    -ro    gator:/ - "Mr Disk - "