前言

NFS 是 Network File System 的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由 Sun 公司开发,于 1984 年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类 Unix 系统间实现磁盘文件共享的一种方法。

NFS 的基本原则是“容许不同的客户端及服务端通过一组 RPC 「分享相同的文件系统」,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。

定义

  • 导出目录:与客户端系统共享的目录。

实验环境

  • 服务器:Ubuntu 20.04 LTS arm64
  • 客户端:Windows 10 企业版 20H2

服务器部署NFS服务

准备工作

更新软件

首先为了防止各种奇怪问题,笔者建议读者将服务器上的软件等更新到最新版。使用sudo apt update等更新软件包信息。

防火墙处理

由于笔者使用的是实验环境,故防火墙被关闭。

使用下面的命令关闭防火墙。

$ sudo ufw disable

如需同时使用防火墙和NFS服务,请放行指定IP。

$ sudo ufw allow from 0.0.0.0/0 to any port nfs

使用下面的命令检查防火墙状态。

$ sudo ufw status

安装NFS内核服务器

$ sudo apt install nfs-kernel-server -y

通过NFS导出文件为客户端分配服务器访问权限

NFS 使用 /etc/exports 文件记录访问权限,使用如下命令编辑。读者也可以自行选用其他编辑器,记得 sudo 就完事了。

$ sudo nano /etc/exports

笔者此处将/www/wwwroot/作为导出目录。假定该目录已经存在。下面介绍该文件的格式。

由于 NFS 使用基于 IP 的授权管理方式,因为 NFS 本身的服务并没有进行身份登入的识别,因此 NFS 会将所有的操作映射为某个用户的操作,注意到文件系统的 inode 所记录的属性为 UIDGID,而非账号与群组名。那一般 Linux 主机会主动的以自己的 /etc/passwd /etc/group 来查询对应的使用者、组名。所以当来自客户端的操作进入到该目录后,会参照服务器的使用者与组名。但是由于该目录的档案主要来自服务器 ,所以可能就会发生如下情况。

  • 服务器/客户端刚好有相同的账号与群组:则此时使用者可以直接交互。
  • 客户端发送的 UID 在客户端对应 $A$ ,在服务器对应 $B$ :客户端在服务器上的操作会被映射为 $B$ ,这会导致严重的安全问题。所以 NFS 会根据配置文件将操作映射为指定的用户。极端情况是发送的 UID 的值为 $0$ 时,即对应 root 时,就可以任意搞事随意操作了。
  • 服务器并没有客户端发送的 UID 的信息:建立的各项数据在服务器端来看,就会属于无拥有者的资料。

因此,配置文件按照下列格式书写,一行一条。

[共享目录][网段]([配置])注释
/www/wwwroot0.0.0.0/0(rw,sync,no_subtree_check)所有IP可读写,所做更改立即写入磁盘,不检查子树。
/www/wwwroot192.168.1.1/24(ro,sync,no_root_squash)192.168.1.1/24 网段可读不可写,所做更改在内存中缓存,所做行为视为 root 操作。

你的文件长这样(以井号开头的行为注释)。

/www/wwwroot 0.0.0.0/0(rw,sync,no_subtree_check)
/www/wwwroot 192.168.1.1/24(ro,sync,no_root_squash)

各个配置的解释如下表。

参数值内容说明可选
`rw\ro`该目录分享的权限是可读写或只读。但最终能不能读写,还与文件系统及身份有关。
`sync\async`sync代表数据会同步写入到内存与硬盘中,async则代表数据会先暂存于内存当中,而非直接写入硬盘。
no_root_squash, root_squash当登录账户为root 或匿名时,所作行为按照 root 用户权限判断或所作行为按照匿名用户判断。
all_squash当登录账户为root 或匿名时,所作行为按照匿名用户的权限判断。
anonuid=114514无论如何所作行为按照UID 为 $114514$ 的用户的权限判断。
anongid=1919无论如何所作行为按照GID 为 $1919$ 的用户的权限判断。

处理文件夹权限问题

如果没有其他服务需要使用该目录(比如 Nginx),建议直接授予匿名用户访问权限。使用下面的命令授予匿名用户访问权限。

$ sudo chown nobody:nogroup /www/wwwroot/

考虑到 Windows 没有诸如 UID 的概念,因此常常需要通过注册表指定 UIDGID

1.在运行中输入 regedit ,打开注册表编辑器。
2.进入 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default 条目。
3.选择新建- QWORD值,新建 AnonymousUidAnonymousGid 两个值,值为对应的 UIDGID 。可以全部设置为 $0$ 以获得 root 身份。
4.重新启动计算机。

重启服务器服务

$ sudo exportfs -a
$ sudo systemctl restart nfs-kernel-server

客户端配置

请勿使用资源管理器挂载,因为那玩意一般都很毒瘤。

安装可选功能

控制面板

在控制面板-可选功能中安装如图所示的功能。

检查连通性

showmount -e [server]    显示 NFS 服务器导出的所有共享。
showmount -a [server]    列出客户端主机名或 IP 地址,以及使用“主机:目录”格式显示的安装目录。
showmount -d [server]    显示 NFS 服务器上当前由某些 NFS 客户端安装的目录。

挂载

mount [远端地址] [挂载点路径]

解除挂载

umount 盘符      解除指定挂载
umount -f -a     解除全部挂载
Last modification:February 23, 2021
如果您觉得我的文章有用,给颗糖糖吧~