前言
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
所记录的属性为 UID
,GID
,而非账号与群组名。那一般 Linux 主机会主动的以自己的 /etc/passwd
, /etc/group
来查询对应的使用者、组名。所以当来自客户端的操作进入到该目录后,会参照服务器的使用者与组名。但是由于该目录的档案主要来自服务器 ,所以可能就会发生如下情况。
- 服务器/客户端刚好有相同的账号与群组:则此时使用者可以直接交互。
- 客户端发送的
UID
在客户端对应 $A$ ,在服务器对应 $B$ :客户端在服务器上的操作会被映射为 $B$ ,这会导致严重的安全问题。所以 NFS 会根据配置文件将操作映射为指定的用户。极端情况是发送的UID
的值为 $0$ 时,即对应root
时,就可以任意搞事随意操作了。 - 服务器并没有客户端发送的
UID
的信息:建立的各项数据在服务器端来看,就会属于无拥有者的资料。
因此,配置文件按照下列格式书写,一行一条。
[共享目录] | [网段] | ([配置]) | 注释 |
---|---|---|---|
/www/wwwroot | 0.0.0.0/0 | (rw,sync,no_subtree_check) | 所有IP可读写,所做更改立即写入磁盘,不检查子树。 |
/www/wwwroot | 192.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
的概念,因此常常需要通过注册表指定 UID
和 GID
。
1.在运行中输入 regedit
,打开注册表编辑器。
2.进入 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default
条目。
3.选择新建- QWORD值,新建 AnonymousUid
,AnonymousGid
两个值,值为对应的 UID
和 GID
。可以全部设置为 $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 解除全部挂载
版权声明:本文是原创文章,版权归 星雾月雨 所有。
本文链接:https://www.ariels.xyz/archives/866.html
本站所有下方标记为「允许规范转载」的原创文章均采用 署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。
您可以自由地转载,但请务必注明文章来源且不可用于商业目的。
One comment
NIce。学习了。。。。