一个 NFS 的简介

NFS(网络文件系统,Network File System)是一个分布式的文件系统,可以用于在局域网中共享文件。它通常运用在 Unix 与类 Unix 操作系统中。对于 Linux 服务器之间的文件共享来说,NFS 相比于其他的方案(如 Samba)更加方便,性能也更好。对于应用程序来说,NFS 也是透明的。

简单配置 NFS

我们以两台 Debian 10 的机器为例1简单配置 NFS 服务端。其余的发行版可以查询各自的手册以获取详细信息。

在绝大多数情况下,NFS 支持已经安装在 Linux 内核中。我们可以使用以下命令安装内核态的 NFS 服务器实现:

sudo apt install nfs-kernel-server

(如果有兼容 NFSv2 和 NFSv3 的需求,需要安装 portmap

出于安全性的考虑2,我们假设 NFS 共享的根目录是 /srv/nfs4。 如果需要共享的目录在其他位置,可以使用 bind mount 的方式挂载上去。(当然,对于简单的配置来说,不这样做问题也不大)

mount --bind 实际放置文件的目录 /srv/nfs/your_folder_name

编辑 /etc/exports,设置共享文件夹的位置、允许访问的 IP、权限等,以下是一个示例。

/srv/nfs4/Downloads 192.168.124.0/24(rw,sync)

这里设置了 /srv/nfs4/Downloads 可以被 192.168.124.0/24 的子网访问,如果希望所有人都可以访问,可以用星号 * 代替这里的网段。参数为可读写 (rw),同步 (sync,即更改操作完成之后才会返回用户的请求)。更多的参数细节可以至 man exports 查看。

接下来,重启 NFS 服务,服务器端就配置好了。

sudo systemctl restart nfs-kernel-server

接下来配置一下客户端。安装 nfs-common,之后就可以愉快地挂载了。

sudo mount -t nfs4 192.168.124.18:/srv/nfs4/Downloads /mnt/nfs_mount/

此处将服务器 192.168.124.18 上的 NFS 共享挂载到了 /mnt/nfs_mount/ 文件夹下。可以看到服务器的文件显示在了客户端中,可以正常打开。

可以使用 showmount -e 服务器名称或 IP 来查看某台服务器上可挂载的 NFS 共享。

如果发现写入没有权限的话,这是由于客户端用户访问时的权限在服务器端会变为匿名用户 (nobody. uid, gid = 65534) 以保障安全性。可以调整文件夹的权限、调整「匿名用户」为指定的 UID 和 GID,或者设置导出参数 no_root_squash,使客户端用户权限可以在服务端保持(很危险,因为在挂载点中,客户端的 root 和服务端的 root 是一样的)。

Windows 和 macOS 也支持(当客户端)吗?

当然啦。(虽然可能有点麻烦)

Windows

下面以一台在同一局域网的 Windows 10 机器为例。在「启用或关闭 Windows 功能」中添加 NFS 客户端支持。

Windows 功能 => NFS 服务 => NFS 客户端

此客户端会在系统中安装 mount 等工具。

Windows 版本 mount 的使用帮助

如果我们需要挂载上面那个服务器的共享,可以输入以下命令:

mount \\服务器名称\共享路径 设备名(盘符)
大概是成功挂载了

只不过……好像哪里不太对劲?

中文的文件名变成了乱码

Windows 中官方的 NFS 支持提供的 mount 不支持 UTF-8 编码,导致了乱码的产生。如果需要 Windows 支持,考虑以下一些方法:

  • 使用 fuse-convmvfs 修改服务端文件的编码,详见此 Super User 上的回答
  • 找一个别的 Windows 的 NFS 客户端。
  • 如果正在使用新版的 Windows 10,在区域设置中启用 Beta 版本的 UTF-8 支持。注意这可能会导致一部分软件出现乱码。

如果要取消挂载,使用 umount 即可。

macOS

相比于 Windows 的挂载体验来说,macOS 由于是 Unix 系的操作系统,挂载 NFS 就方便一些。直接把 Linux 的命令复制过来就……

$ sudo mount -t nfs4 192.168.124.18:/srv/nfs4/Downloads nfs_mount
Password:
mount: exec /Library/Filesystems/nfs4.fs/Contents/Resources/mount_nfs4 for /Users/tao/nfs_mount: No such file or directory

诶?稍微调整一下……

$ sudo mount -t nfs 192.168.124.18:/srv/nfs4/Downloads nfs_mount
mount_nfs: can't mount /srv/nfs4/Downloads from 192.168.124.18 onto /Users/tao/nfs_mount: Operation not permitted

这是因为 NFS 服务器默认配置要求来源端口小于 1024 以「保障安全」(因为这样的端口只有 root 用户可以开)。当然 macOS 中 mount_nfs 的文档里面也这样吐槽:

resvport: Use a reserved socket port number.

This is useful for mounting servers that require clients to use a reserved port number on the mistaken belief that this makes NFS more secure. (For the rare case where the client has a trusted root account but untrustworthy users and the network cables are in secure areas this does help, but for normal desktop clients this does not apply.)

BSD System Manager’s Manual, mount_nfs

有两个解决方案:

  • 服务器端参数加入 insecure。这样的话 Finder 也可以轻松挂载。
  • 命令行加入 -o resvport 参数。

挂载之后,在 Finder 侧边栏也会显示。编码显示非常正常。MS 出来挨打

在 mirrors 中的实践

在新的存储等设备买来配置好之前,我们的 mirrors 服务由服务器 mirrors2 提供。随着各种镜像逐年增大,我们的 ZFS pool 的空间越来越小,尤其是在同步的时候。这个月已经出现了多次空间吃光的情况,出现时会导致导致同步任务堆积无法完成,系统负载达到 100 以上,I/O 性能急剧下降。

我们对日志分析后发现,bioc 仓库(R 语言的分子生物学软件仓库)访问量很小,但是空间占用巨大(约 1.4 TB)。由于我们前段时间多出一台闲置的服务器(命名为 mirrors3),目前我们将 bioc 放置在了 mirrors3 上,同步任务也由 mirrors3 完成,NFS 到 mirrors2 上继续正常提供服务。这一项工作主要由付佳伟同学完成。多出来的磁盘空间应该可以维持比较长一段时间的稳定工作。

在一部分细节方面,服务器还没有配置完成,在 status 页面的显示也比较奇怪,这是因为此页面读取的是 mirrors2 的数据。我们未来会进行改进,如果你在使用 bioc 仓库时遇到问题,也欢迎通过发送邮件到 lug@ustc.edu.cn 或者在 https://github.com/ustclug/discussions/ 中提交 issue 进行反馈。


另外,planet 已经有将近一年的时间处于死寂的状态。我写的其实不太好,此次更新主要是希望能够引起大家的注意,收到更多的稿件。另外有一些(未完成的)稿件在我们的草稿箱里,我会去给对应的作者催稿的(

由于 WordPress 的用户权限配置问题,你在注册账号后可能找不到投稿的地方。直接发送邮件到 planet@ustclug.org 跟我们说吧(当然 lug@ustc.edu.cn 也行,我也会处理的)!也欢迎提供你的博客的 RSS 地址,我们可以选择文章转载到这里。

  1. https://wiki.debian.org/NFSServerSetup
  2. https://wiki.archlinux.org/index.php/NFS#Server

发表评论

电子邮件地址不会被公开。 必填项已用*标注