23.3. 网络文件系统(NFS)

Reorganized and enhanced by Tom Rhodes. Written by Bill Swingle.

网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统在网络上与它人共享目录和文件。通过使用NFS,用户和程序可以象访问本地文件 一样访问远端系统上的文件。

以下是NFS最显而易见的好处:

23.3.1. NFS是如何工作的

NFS至少有两个主要部分:一台服务器和一 台(或者更多)客户机。客户机远程访问存放在服务器上的数据。为了 正常工作,一些进程需要被配置并运行。

Note: 在 FreeBSD 5.X上面,portmaprpcbind替换了。而且,在FreeBSD 5.X上面, the user is required to replace every instance of portmap with rpcbind in the forthcoming examples。

服务器必须运行以下服务:

服务 描述
nfsd NFS,为来自NFS客户端的 请求服务。
mountd NFS挂载服务,处理nfsd(8)递交过来的请求。
portmap portmap服务允许 NFS客户端查看NFS服务在用的端口。

客户端同样运行一些进程,比如 nfsiodnfsiod处理来自NFS的请求。 这是可选的,而且可以提高性能,对于普通和正确的操作来说并不是必须的。 参考nfsiod(8)手册获得更多信息。

23.3.2. 配置NFS

NFS的配置过程相对简单。这个过程只需要 对/etc/rc.conf文件作一些简单修改。

NFS服务器这端,确认/etc/rc.conf 文件里头以下开关都配上了:

portmap_enable="YES"
nfs_server_enable="YES"
mountd_flags="-r"

只要NFS服务被置为enable,mountd 就能自动运行。

在客户端一侧,确认下面这个开关出现在 /etc/rc.conf里头:

nfs_client_enable="YES"

/etc/exports文件指定了哪个文件系统 NFS应该输出(有时被称为“共享”)。 /etc/exports里面每行指定一个输出的文件系统和 哪些机器可以访问该文件系统。在指定机器访问权限的同时,访问选项 开关也可以被指定。有很多开关可以被用在这个文件里头,不过不会在这 里详细谈。您可以通过阅读exports(5) 手册来发现这些开关。

以下是一些/etc/exports的例子:

紧接着的这个例子说明了如何输出一个文件系统,尽管具体设定和您 的环境以及网络配置有关。作为实例,为了输出/cdrom 到三个的例子机器,它们有同样域名(因此他们的域名不大对)或者在您的 /etc/hosts文件里头有记录。-ro 标志将被输出的文件系统置为只读。由于这个标志,远程系统将无法在被输出 的文件系统上写入任何变动。

/cdrom -ro host1 host2 host3

下面的例子可以输出/home给三个以IP地址方式表示的主机。 对于在没有配置DNS服务器的私有网络里头,这很有用。 此外,the /etc/hosts 文件也可以用以配置主机名;参看 hosts(5)-alldirs 标记允许子目录被作为挂载点。 也就是说,客户端可以根据需要挂载需要的目录。

/home  -alldirs  10.0.0.2 10.0.0.3 10.0.0.4

下面几行输出 /a ,以便两个来自不同域的客户端可以访问文件系统。 -maproot=root 标记授权远端系统上的 root 用户在被输出的文件系统上以root身份进行读写。 如果没有特别指定 -maproot=root 标记, 则即使用户在远端系统上是 root 身份, 也不能修改被输出文件系统上的文件。

/a  -maproot=root  host.example.com box.example.org

为了能够访问到被输出的文件系统,客户端必须被授权。 请确认客户端在您的 /etc/exports 被列出。

/etc/exports 里头,每一行里面,输出信息和文件系统一一对应。 一个远程主机每次只能对应一个文件系统。而且只能有一个默认入口。比如,假设 /usr 是独立的文件系统。这个 /etc/exports 就是无效的:

/usr/src   client
/usr/ports client

一个文件系统,/usr, 有两行指定输出到同一主机, client. 解决这一问题的正确的格式是:

/usr/src /usr/ports  client

The properties of one filesystem exported to a given host must all occur on one line. Lines without a client specified are treated as a single host. This limits how you can export filesystems, but for most people this is not an issue.

下面是一个有效输出列表的例子, /usr and /exports 是本地文件系统:

# Export src and ports to client01 and client02, but only
# client01 has root privileges on it
/usr/src /usr/ports -maproot=root    client01
/usr/src /usr/ports               client02
# The client machines have root and can mount anywhere
# on /exports. Anyone in the world can mount /exports/obj read-only
/exports -alldirs -maproot=root      client01 client02
/exports/obj -ro

一旦修改 /etc/exports 了之后, 为了让变动生效,您必须重启 mountd。 可以通过对mountd 进程发送HUP信号重启:

# kill -HUP `cat /var/run/mountd.pid`

另外,系统重启动可以让FreeBSD把一切都弄好。尽管如此,重启不是必须的。 以 root 身份执行下面的命令可以搞定一切。

NFS 服务器端:

# portmap
# nfsd -u -t -n 4
# mountd -r

NFS 客户端:

# nfsiod -n 4

现在每件事情都应该就绪,以备挂载一个远端文件系统。 在这些例子里头, 服务器名字将是:server ,而客户端的名字将是: client。 如果您只打算临时挂载一个远端文件系统或者只是打算作测试配置正确与否, 只要在客户端以 root 身份执行下面的命令:

# mount server:/home /mnt

这条命令会把服务端的 /home 目录挂载到客户端的 /mnt 上。 如果配置正确,您应该可以进入客户端的 /mnt 目录并且看到所有服务端的文件。

如果您打算让系统每次在重启动的时候都自动挂载远端的文件系统,把那个文件系统加到 /etc/fstab 文件里头去。下面是例子:

server:/home   /mnt    nfs rw  0   0

fstab(5) 手册里有所有可用的开关。

23.3.3. 实际应用

NFS 有很多实际应用。下面是比较常见的一些:

23.3.4. 使用 amd 自动挂载 ** 翻译进行中 **

Contributed by Wylie Stilwell. Rewritten by Chern Lee.

23.3.5. Problems Integrating with Other Systems ** 翻译进行中 **

Contributed by John Lind.