# 16.8 NFS 服务器

## NFS 概述

NFS（Network File System，网络文件系统）最初由 Sun Microsystems 于 1984 年开发，是一种用于在不同操作系统之间共享文件的分布式文件系统协议。NFS 采用远程过程调用（Remote Procedure Call，RPC）机制实现透明的文件访问，使客户端能够像访问本地文件系统一样访问远程服务器上的文件。其设计目标是实现异构系统间的文件共享，无需考虑底层操作系统差异。

## 共享目录配置

配置 NFS 服务器首先需要编辑 `/etc/exports` 文件，按照手册页的指示，添加一行内容：

```ini
/usr/home/logs -alldirs 192.168.5.15
```

该配置会将本地 `/usr/home/logs` 目录及其所有子目录共享给远程主机 192.168.5.15，对应的目录可在远程挂载访问。

## 相关文件结构

```sh
/
├── etc
│   ├── exports         # NFS 共享目录配置文件
│   └── rc.conf         # 系统启动配置文件
├── usr
│   └── home
│       └── logs        # NFS 共享目录
├── mnt                 # NFS 客户端默认挂载点
└── var
    └── log
        └── messages    # 系统日志文件
```

## 服务启动配置

配置好共享目录后，接下来需要设置并启动相关服务，确保 NFS 服务能够正常运行。

* 在 `/etc/rc.conf` 中加入：

```ini
rpcbind_enable="YES"      # 启用 RPC 服务以支持 NFS
nfs_server_enable="YES"   # 启用 NFS 服务
mountd_enable="YES"       # 启用 NFS 挂载守护进程
```

* 启动 NFS 服务：

```sh
# service nfsd start
```

* 重新加载 NFS 挂载守护进程的配置：

```sh
# service mountd reload
```

* 在之前配置的客户端上，启用 NFS 客户端服务：

```sh
# sysrc nfs_client_enable="YES"
```

## 客户端挂载

将远程服务器 `server` 的 `/usr/home/logs` 目录挂载到本地默认挂载点 `/mnt`：

```sh
# mount server:/usr/home/logs /mnt
```

## 故障排除与未竟事宜

### 共享目录因使用软链接导致错误

> **技巧**
>
> 在新版 FreeBSD（14.0-RELEASE 及以上）中，`/home` [不再是](https://cgit.freebsd.org/src/commit/?id=bbb2d2ce4220) 指向 `/usr/home` 的软链接，该提交修改了默认目录结构，此问题已不复存在。

```sh
mount.nfs: access denied by server while mounting
```

这里的 `access denied` 并非用户权限问题，而是挂载请求被 NFS 服务端拒绝，真正的问题出在服务端配置不正确。

查看系统日志内容：

```sh
# cat /var/log/messages
```

在系统日志中显示如下记录：

```sh
bad exports list line '/home/logs': symbolic link in export path or statfs failed
```

该记录表明问题原因在于 `/home/logs` 路径中存在软链接，因此无法共享。在 FreeBSD 中，`/home` 曾是指向 `/usr/home` 的软链接，这与部分 Linux 发行版的行为不同。

然后将 `/etc/exports` 文件中的

```ini
/home/logs -alldirs 192.168.5.15
```

替换如下（将本地 `/usr/home/logs` 目录及子目录同步到远程主机 192.168.5.15）：

```ini
/usr/home/logs -alldirs 192.168.5.15
```

* 重新加载 NFS 挂载守护进程的配置：

```sh
# service mountd reload
```

* 回到客户端上，运行如下命令挂载远程服务器 server 的 `/usr/home/logs` 目录到本地默认挂载点 `/mnt`：

```sh
# mount server:/usr/home/logs /mnt
```

此时远程目录已成功挂载到本地挂载点 `/mnt`。

## 参考文献

* FreeBSD 中文社区. 32.3.网络文件系统(NFS) | FreeBSD 中文手册\[EB/OL]. \[2026-03-25]. <https://handbook.bsdcn.org/di-32-zhang-wang-luo-fu-wu-qi/32.3.-wang-luo-wen-jian-xi-tong-nfs>. 该中文文档详细介绍了 FreeBSD 上 NFS 服务的配置与使用方法。
* FreeBSD Project. mount\_nfs -- mount NFS file systems\[EB/OL]. \[2026-03-25]. <https://www.freebsd.org/cgi/man.cgi?mount_nfs(8)>. 该手册页提供了 mount\_nfs 命令的完整参数说明。
* 李守中. 李守中的技术笔记\[EB/OL]. \[2026-03-25]. <https://note.lishouzhong.com>. 该站点包含大量 Unix/Linux 技术文档的中文翻译。
* chhquan. freebsd nfs 挂载遇到的问题\[EB/OL]. \[2026-03-25]. <https://blog.51cto.com/chhquan/1708250>. 该文章分析了 FreeBSD NFS 挂载常见问题及解决方案。

## 课后习题

1. 在 FreeBSD 上配置 NFSv4 服务，启用 Kerberos 认证，创建测试共享目录并验证客户端可安全挂载访问。
2. 分析 NFS 的 RPC 机制与远程过程调用设计，查看其服务发现与请求路由方式。
3. 修改 NFS 的默认导出配置，添加 root\_squash 与 no\_root\_squash 的对比测试，验证行为变化。
