Server Side
安装必要依赖:
apt install nfs-kernel-server nfs-common
编辑配置文件: vi /etc/exports
/media/share *(ro,sync,no_root_squash,no_subtree_check,insecure)
字段 | |
---|---|
/media/share | 要共享的目录 |
* | 指定可访问的IP, *表示全部来源 特定网段:192.168.123.0/24 特定IP:192.168.123.2 |
rw / ro | 读写 |
sync / async | 文件同步写入到内存与硬盘中 / 文件会先暂存于内存中 |
root_squash / no_root_squash | - 当NFS客户端以root用户身份访问时,映射为NFS服务器的nfs nobody用户 - 当NFS客户端以root身份访问时,映射为NFS服务器的root用户 |
subtree_check / no_subtree_check | 是否强制检查父目录权限 |
secure / insecure | 是否允许客户端从大于1024的tcp/ip端口连接服务器(Finder出现“找不到服务器“的错误可以设置为insecure |
anonuid 、anongid | 将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户和用户组 |
每次修改完 exportfs
文件,都需要应用并导出分享:exportfs -ra
。
流量默认从 2049 端口通过,注意放通防火墙规则
查看当前导出访问的目录情况:exportfs -v
。想要了解更多可用选项,在终端输入man exports
。
Client Side(MacOS)
由于从 Catalina 开始,根文件系统现在是只读的。所以需要将挂载点新建在用户可写的文件系统/系统/卷/数据:mkdir -p /Users/wayjam/nfs
然后使用挂载命令: mount -t nfs 192.168.123.2:/media/share /Users/wayjam/nfs
然后发现挂载失败:
nfs mount -t nfs 192.168.123.2:/media/share /Users/wayjam/nfs
mount_nfs: can't mount with remote locks when server (192.168.123.2) is not running rpc.statd: RPC prog. not avail nfs
mount: /Users/wayjam/nfs failed with 74
使用一些调试命令看了情况都正常
rpcinfo -p 192.168.123.2
查看 RPC 连接情况showmount -e 192.168.123.2
显示挂载情况nfsstat -m
查看 NFS 情况
后来查到是没有指定 NFS 版本,编辑配置sudo vi /etc/nfs.conf
,加入
nfs.client.mount.options = vers=4
然后再使用上面的挂载命令就可以挂载成功了。或者说在每次挂载的时候指定 NFS 版本:
mount -t nfs -o soft,nfsvers=4 192.168.123.2:/media/share /Users/wayjam/nfs
如果要使用 FInder 的“连接到服务器”来挂载,则需要按这种格式来指定 NFS 版本:
nfs://vers=4,192.168.123.2:/media/share
自动挂载
创建挂载点:mkdir /Users/wayjam/nfs
,然后修改 master 映射配置 sudo vi /etc/auto_master
/Users/wayjam/nfs auto_nfs
创建 /etc/auto_nfs
映射文件:
nas_data -rw,resvport,noowners,nfsv4,soft 192.168.123.2:/media/share
然后应用配置sudo automount -vc
,另外/etc/autofs.conf
还有一些挂载超时时间等配置可定制。
写入权限问题
有以下几种思路
- 配置
no_root_squash
并且使用 root 用户写入 - server 端增加与 client 端相同 uid 的用户,并给共享的目录增加读写权限
- 配置
all_squash
,并通过设置ACL规则的方式赋予 nfsnobody 用户读写执行权限setfacl -m u:nfsnobody:rw /media/share
- 使用非 root 用户写入,server 端给 other 加写入权限
比如使用以下配置,所有用户皆映射到 root 用户,但这样有安全风险:
/media/share *(rw,sync,all_squash,anonuid=0,anongid=0,no_subtree_check,insecure)