系统管理指南:网络服务

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 使用哪种名称服务。