外观
NFS 共享:给 Linux 和虚拟化平台用
NFS 是 Linux 和 Unix 的原生文件共享协议,开销小,PVE、ESXi 这类虚拟化平台也常拿它当存储。做完这一篇,OMV 会把共享文件夹导出给指定的客户端,你能在 Linux 上挂载并正确读写。
NFS 没有用户认证,只信任客户端地址和 UID、GID
- 影响范围:NFS 不验证用户名和密码。服务器只相信客户端的地址,以及客户端自己报上来的 UID 和 GID。客户端填成
*或范围过大的网段,网络里的任何设备都能挂载并读取;使用no_root_squash时,客户端的 root 就是服务器上的 root。 - 前置条件:只在可信的内网里用;客户端填具体的 IP 或最小的网段;保持默认的
root_squash,确实需要才改;不要做端口映射,也不要暴露到互联网,远程需要时用 VPN,见 远程访问。 - 回退:删除 NFS 共享或改小客户端范围,必要时取消勾选 NFS 服务的 已启动,点击顶部黄色提示条上的 应用(Apply),再到客户端卸载。
开始之前
- 已经有共享文件夹。它的相对路径里不能有空格,否则 OMV 创建 NFS 共享时会报错。
- 知道客户端的 IP 或网段。NAS 的 IP 最好固定,见 网络接口。
- 弄懂下文的「UID、GID 与 squash」,这是 NFS 权限问题的根源。
启用 NFS 服务
- 打开
服务 → NFS → 设置(Services → NFS → Settings)。 - 勾选 已启动(Enabled)。
- 版本(Versions)是多选,至少选一个,可选 NFSv2、NFSv3、NFSv4、NFSv4.1、NFSv4.2。全新安装的默认值是 3、4、4.1、4.2。保持默认,不要选 NFSv2。如果所有客户端都能用 NFSv4,只勾 NFSv4 系列,防火墙会更好管,因为 NFSv4 只需要 TCP 2049。
- 点击 保存(Save),再点击 应用。
添加 NFS 共享
打开
服务 → NFS → 共享(Services → NFS → Shares),点击 创建(Create)。填写表单:
字段 说明 共享文件夹(Shared folder) 要导出的共享文件夹。提示文字写着,共享会出现在服务器的 /export/<名称>。创建后不能再改客户端(Client) 必填。允许挂载的主机:单个 IP、主机名、CIDR 网段(如 192.168.178.0/24)或通配符。每条共享只能填一个客户端权限(Permission) 默认只读;也可选读/写。它直接写进导出选项( ro或rw),和共享文件夹的 权限 按钮不是一回事扩展选项(Extra options) 默认 subtree_check,insecure。逗号分隔的exports(5)选项,只能写字母、下划线,或名字=值(值里只能有字母数字下划线和@、:、/)。你写的内容会替换默认值,想保留默认值就把它们也写进去标签(Tags) 备注 点击 保存,再点击 应用。
要给多个客户端,就为同一个共享文件夹再添加一条,填不同的客户端。按 OMV 生成配置的规则,同一个共享文件夹的多条记录会合并成同一行导出(这一点按源码推断,没有在实机上验证)。
OMV 在背后做了什么
- 把共享文件夹绑定挂载到
/export/<名称>,这个挂载记录由 OMV 管理,不要手动改。你改共享文件夹所在的文件系统或相对路径时,OMV 会跟着调整它。 - 在
/etc/exports里为每个共享写一行,形如/export/<名称> <客户端>(fsid=<UUID>,ro,subtree_check,insecure)。这个文件由 OMV 生成,改动会被覆盖。 - 另外导出一个 NFSv4 伪根
/export,选项是ro,fsid=0,root_squash,subtree_check,secure。如果某个客户端的共享用了insecure,伪根对这个客户端也会用insecure。 - 所以:NFSv3 客户端挂载
/export/<名称>;NFSv4 客户端挂载/<名称>(相对于伪根)。
诊断 → 服务 → NFS(Diagnostics → Services → NFS)显示 exportfs -v 的输出,能看到实际导出的内容。
UID、GID 与 squash
NFS 的权限靠数字 UID 和 GID 对应:客户端上 UID 1000 的用户,到了服务器上就是 UID 1000,不管他叫什么名字。官方文档的说法是,NFS 依赖两端 UID 和 GID 的匹配,本身不提供任何认证和安全,基本的安全靠网络范围限制和 squash 选项。
NFS 默认启用 root_squash:客户端的 root(UID 0)被映射成匿名用户(默认是 65534,nobody)。所以在客户端以 root 写文件,在服务器上会变成 nobody 所有,或者因权限不够而失败。
常见的处理办法:
| 办法 | 扩展选项 | 适合 | 代价 |
|---|---|---|---|
| 对齐 UID、GID | 默认 | 家里的 Linux 电脑:让客户端用户在 OMV 里有相同的 UID,并加入 users 组 | 要两边维护用户 |
| 全部映射成一个用户 | all_squash,anonuid=<UID>,anongid=<GID> | 想让所有客户端都用同一个专用用户读写 | 不能再区分客户端上的不同用户 |
| 不压缩 root | no_root_squash | PVE 等虚拟化平台,通常需要以 root 读写 | 客户端 root 等于服务器 root,只给可信的单个 IP |
例如把所有客户端映射成 OMV 的专用用户 nfsuser(先用 id nfsuser 查它的 UID 和 GID,这里假设是 1001 和 100),扩展选项 写成:
text
subtree_check,insecure,all_squash,anonuid=1001,anongid=100保留 subtree_check,insecure 是因为你的输入会替换默认值。insecure 允许客户端使用 1024 以上的源端口,macOS 和不少非特权客户端需要它,OMV 默认带上。导出目录本身在文件系统层仍要允许映射后的用户访问,见 三层权限。
在客户端挂载
Linux 客户端(在客户端电脑上,先安装 NFS 客户端,Debian 和 Ubuntu 是 nfs-common):
sh
sudo mkdir -p /mnt/nas
# NFSv4
sudo mount -t nfs4 <NAS 地址>:/<共享名> /mnt/nas
# NFSv3
sudo mount -t nfs -o vers=3 <NAS 地址>:/export/<共享名> /mnt/nas要开机自动挂载,在客户端的 /etc/fstab 里加一行(这是客户端的文件,不是 OMV 的):
text
<NAS 地址>:/<共享名> /mnt/nas nfs4 defaults,_netdev,nofail 0 0macOS:OMV 官方文档给的例子是 sudo mount -t nfs -o resvport,rw <NAS 地址>:/export/<共享名> <本地挂载点>。OMV 默认的扩展选项里已经有 insecure,通常不需要 resvport。
PVE、ESXi 等虚拟化平台:它们通常以 root 身份读写 NFS。常见做法是给这台主机的单个 IP 单独建一条 NFS 共享,选「读/写」,扩展选项加上 no_root_squash,或者改用 all_squash 加专用用户。各平台的具体要求以它们的文档为准,PVE 一侧的添加方法见姊妹站的 挂载 NFS 与 SMB/CIFS 存储。
检查结果
在
诊断 → 服务 → NFS里看到/export/<名称>,对应的客户端和选项符合预期。在客户端挂载成功,
df -h /mnt/nas能看到容量。在客户端写一个测试文件,再到 OMV 的 shell(SSH 或本机控制台,root 身份)里看它的属主数字:
shls -ln <共享文件夹的绝对路径>属主和属组的数字,应该就是你预期的 UID 和 GID(用了
all_squash时是你设置的anonuid和anongid)。
常见问题
access denied by server。 客户端的地址不在 客户端 允许的范围内;没点应用;或者挂载路径写错了:NFSv3 用 /export/<名称>,NFSv4 用 /<名称>。
能挂载,但写文件提示 Permission denied。 检查:共享的 权限 是不是还是只读;客户端的 UID 在服务器上有没有对应的目录权限;是不是被 root_squash 映射成了 nobody。
文件的属主显示成 nobody 或 65534。 这是 squash 的结果,见上文。
创建 NFS 共享时报错,提示相对路径含空格。 把共享文件夹的相对路径改成没有空格的。
符号链接在客户端不工作。 指向导出路径之外的符号链接,NFS 不会跟随。用相对路径的链接。
macOS 挂载失败。 确认扩展选项里保留了 insecure,或者挂载时加 resvport。
参考资料
- OMV 官方文档:NFS
- Linux 手册页:exports(5),
root_squash默认开启、anonuid和anongid默认 65534、insecure与subtree_check的说明 - OMV 源码:
NFSRPC(绑定挂载逻辑)、srv/salt/omv/deploy/nfs/files/etc-exports.j2(导出行的生成规则)