Linux安装使用NFS

起因

台式机存了很多模型,500G硬盘不够用了,为了读取速度,还不能把模型放到其他机器上,那就把一些读取速度要求不高的放出去吧。 Samba搞一堆缓存,文件权限还有点乱,不太舒服,还是换NFS吧,NFS是专为Linux设计的,速度快,配置简单。

安装

服务端

sudo apt update
sudo apt-get install nfs-kernel-server

修改/etc/exports,写入如下配置

/srv/nfs4        192.168.1.0/24(rw,sync,fsid=0,crossmnt,no_subtree_check)

然后使用如下命令,动态生效。

sudo exportfs -arv

以下配置说明来自AI

配置结构拆解

/srv/nfs4        192.168.1.0/24(rw,sync,fsid=0,crossmnt,no_subtree_check)
└── 1 ──┘        ─── 2 ──┘ ────────────────────── 3 ──────────────────────
  1. /srv/nfs4(共享路径):服务器上实际存在的本地目录,被指定为 NFSv4 导出的基础根路径。
  2. 192.168.1.0/24(客户端限制):指定允许连接的客户端IP范围。
  3. (…)(挂载选项):定义了该共享目录的访问控制、性能和行为参数。

核心参数详细说明

  • 安全与认证 (192.168.1.0/24):基于网络的信任。只要客户端的 IP 地址在这个网段内,服务器就直接信任该机器。

常规控制参数 (rw, sync)

  • rw (Read-Write):允许客户端对该共享目录进行读写访问。
  • sync:同步写入模式。服务器收到客户端的数据写入请求后,必须将数据同步写入到物理磁盘中才向客户端返回确认。这种方式数据更安全,但写入性能比 async(异步)稍低。

NFSv4 特有参数 (fsid=0, crossmnt)

  • fsid=0(或 fsid=root):将此目录指定为 NFSv4 导出的虚拟根目录(伪根)。
    • NFSv4 要求所有导出的目录都必须处于一个统一的目录树下。
    • 客户端在挂载时,不需要写绝对路径 /srv/nfs4,只需挂载服务器的 / 根路径即可(例如:mount -t nfs4 server_ip:/ /mnt/nfs)。
  • crossmnt (Cross Mount):允许客户端透明地复制和访问子挂载点。
    • 如果你在 /srv/nfs4/ 目录下又挂载了其他的独立硬盘分区(例如 /srv/nfs4/data1),设置此参数后,客户端访问到该子目录时,NFS 会自动在后台帮客户端把它也挂载上,无需客户端手动逐个挂载。

性能与底层参数 (no_subtree_check)

  • no_subtree_check:禁用子树检查。
    • 如果一个共享目录只是某分区下的一个普通子目录,NFS 默认会检查客户端请求的文件是否真的在该子树内,这会消耗额外的 CPU 并引发一些文件句柄问题。
    • 由于此处 /srv/nfs4 已经是专用的导出根目录,禁用子树检查可以提升文件操作的吞吐性能并提高连接稳定性。

客户端

sudo apt update
sudo apt install nfs-common

挂载

先创建挂载点

sudo mkdir -p /mnt/nfs

执行mount挂载

sudo mount -t nfs4 192.168.1.2:/ /mnt/nfs

自动挂载

也可以写入/etc/fstab,开机自动挂载

192.168.1.2:/  /mnt/nfs  nfs4  defaults,_netdev,noatime  0  0

注意点

fsid=0会导致NFSv4的挂载路径是根目录/,并且如果其他挂载点不在/srv/nfs4下,客户端是无法访问的,所以如果有其他挂载点需要共享,必须在/srv/nfs4下创建目录,然后挂载到这个目录下。 简单点的话,可以去掉这个fsid=0虚拟根目录,直接是什么目录就写什么路径。


最后修改于 2026-07-23