1. 为什么要在 Manjaro 上折腾 NFS 服务手里这台 Manjaro 用了快两年平时写代码、剪视频、跑虚拟机都在上面硬盘里攒了一堆素材和工程文件。家里还有一台老笔记本装着轻量级系统偶尔拿来当播放器或者测试机用。两台机器之间传文件一直靠移动硬盘来回拷时间长了实在受不了——尤其是剪视频的时候工程文件在主力机上素材在另一台机器上每次都要先拷贝再导入改完再拷回去一来一回半小时就没了。后来想到 NFS。这东西其实不新鲜局域网里共享目录的老牌方案Linux 内核原生支持配置好了就跟访问本地目录一样顺手。Manjaro 作为 Arch 系发行版软件源里直接就有 nfs-utils装完改两个配置文件就能跑起来。相比 SambaNFS 在纯 Linux 环境下的性能更好权限管理也更贴近原生文件系统没有那一层用户映射的弯弯绕绕。这篇文章就是把我自己在 Manjaro 上配 NFS 的完整过程整理出来。从装包、建共享目录、写配置文件到客户端挂载、权限排查、开机自动挂载每一步都附上我实际踩过的坑和验证过的参数。如果你也是 Manjaro 用户手头有两台以上 Linux 机器想找个靠谱的局域网文件共享方案这篇内容可以直接抄作业。就算你用的是其他 Arch 系发行版操作也基本一致顶多包管理器命令换个写法。2. 动手之前的整体设计思路2.1 为什么选 NFS 而不是 Samba 或 Syncthing局域网文件共享方案不少我前后试过三种Samba、Syncthing 和 NFS。Samba 兼容性最好Windows、macOS、Linux 都能连但配置复杂权限映射经常出问题尤其是 Linux 和 Windows 之间用户 ID 对不上的时候文件权限会变得乱七八糟。Syncthing 适合多设备同步但它是去中心化的每台机器都要装客户端而且同步有延迟不适合需要实时读写大文件的场景。NFS 的优势在于它是 Linux 内核原生支持的协议服务端和客户端都是内核模块性能损耗极小。在千兆局域网里NFS 的读写速度基本能跑满网卡带宽我实测大文件传输稳定在 110MB/s 左右。权限管理直接沿用 Linux 的 UID/GID 体系只要两端用户 ID 一致权限就不会出幺蛾子。配置也简单服务端一个配置文件客户端一条挂载命令完事。当然 NFS 也有局限。它没有用户认证机制安全性依赖网络隔离所以只适合在可信的局域网里用绝对不能暴露到公网。另外 Windows 原生不支持 NFS 客户端需要额外装服务或者用第三方工具。但对我来说家里全是 Linux 机器这个缺点可以忽略。2.2 服务端和客户端的角色划分我手头两台机器主力机配置高、硬盘大自然当服务端把需要共享的目录挂出去。老笔记本当客户端按需挂载。这个角色划分不是固定的NFS 支持多客户端同时挂载同一个共享目录也支持一台机器既当服务端又当客户端。如果你有三台以上机器可以选一台常年开机的当服务端其他都当客户端。网络环境是千兆路由器组成的局域网两台机器都插网线。无线也能用但稳定性差一些尤其是大文件传输的时候容易断流。如果只能走无线建议把 NFS 的传输块大小调小一点减少丢包重传的概率。2.3 共享目录的规划原则共享目录放哪儿、怎么组织这个得提前想好。我见过有人直接把根目录挂出去那是给自己找麻烦。我的做法是单独建一个共享目录比如/srv/nfs下面按用途分子目录media放视频素材projects放代码工程backup放备份文件。每个子目录可以单独控制权限和访问范围。这样做的好处是权限清晰。比如media目录给所有客户端读写权限backup目录只给特定客户端写权限其他客户端只读。如果全混在一起权限就没法细粒度控制了。另外共享目录最好放在独立的硬盘或者分区上避免系统盘满了影响服务端正常运行。3. 服务端配置全流程3.1 安装 nfs-utils 包Manjaro 的软件源里直接有 nfs-utils一条命令搞定sudo pacman -S nfs-utils这个包包含了 NFS 服务端和客户端的全部工具。装完之后系统会多出几个关键组件rpcbind负责端口映射nfs-server是主服务nfs-idmapd处理用户 ID 映射。Manjaro 默认可能已经装了rpcbind但保险起见还是确认一下。装完先别急着启动服务把配置文件写好再启动免得反复重启。另外建议把nfs-utils加入开机自启不然每次重启都要手动拉起来sudo systemctl enable --now nfs-server这里有个细节nfs-server服务依赖rpcbindsystemd 会自动处理依赖关系但如果你手动启动nfs-server发现报错先检查rpcbind是不是没跑起来。我第一次配的时候就是忘了启动rpcbind折腾了十分钟才发现问题。3.2 创建共享目录并设置权限我选/srv/nfs作为共享根目录下面建三个子目录sudo mkdir -p /srv/nfs/{media,projects,backup}权限设置是关键。NFS 默认使用客户端的 UID/GID 来访问文件所以服务端和客户端的用户 ID 必须一致。我的主力机和笔记本上都是同一个用户名UID 都是 1000所以直接设成 1000:1000 就行sudo chown -R 1000:1000 /srv/nfs sudo chmod -R 755 /srv/nfs755权限意味着所有者可读写执行其他人可读可执行。如果你希望客户端能写入要么把权限改成775并确保客户端用户在同一个组里要么在 NFS 导出配置里加rw选项。我选择后者因为更灵活。注意千万不要把共享目录设成777那等于把大门敞开局域网里任何机器都能随便改你的文件。权限最小化原则在这里同样适用。3.3 编写 /etc/exports 配置文件/etc/exports是 NFS 服务端的核心配置文件每一行定义一个共享目录及其访问规则。我的配置长这样/srv/nfs/media 192.168.1.0/24(rw,sync,no_subtree_check) /srv/nfs/projects 192.168.1.0/24(rw,sync,no_subtree_check) /srv/nfs/backup 192.168.1.100(ro,sync,no_subtree_check)逐项解释一下这些参数的含义192.168.1.0/24表示允许整个局域网网段访问。你也可以写单个 IP比如192.168.1.100那就只有那一台机器能连。rw表示读写权限ro表示只读。backup目录我设成只读防止误删备份文件。sync表示同步写入数据先落盘再返回成功。性能比async稍差但数据安全性高。家用场景下这点性能差异可以忽略。no_subtree_check关闭子树检查。这个选项在较新的 NFS 版本里默认就是关闭的显式写出来是为了兼容老版本同时避免一些奇怪的权限报错。写完之后执行sudo exportfs -rav重新加载配置。-r表示重新导出-a表示所有目录-v显示详细信息。如果配置有语法错误这条命令会直接报出来。3.4 防火墙放行与端口固定Manjaro 默认可能开了firewalld或者ufwNFS 需要放行几个端口。NFSv4 只需要放行2049/tcp但 NFSv3 还需要rpcbind的111/tcp和111/udp以及一堆动态端口。我建议直接用 NFSv4配置简单防火墙也好设。如果你用的是firewalldsudo firewall-cmd --permanent --add-servicenfs sudo firewall-cmd --permanent --add-servicemountd sudo firewall-cmd --permanent --add-servicerpc-bind sudo firewall-cmd --reload用ufw的话sudo ufw allow from 192.168.1.0/24 to any port nfs提示如果客户端挂载时报access denied或者connection refused十有八九是防火墙没放行。先在服务端用ss -tlnp | grep 2049确认 NFS 端口在监听再从客户端telnet一下服务端的 2049 端口通了再排查其他问题。3.5 启动服务并验证导出状态配置写好后启动服务sudo systemctl restart nfs-server sudo systemctl status nfs-server状态显示active (exited)就对了NFS 服务本身不常驻它通过内核模块工作。然后用showmount -e localhost查看当前导出的目录列表Export list for localhost: /srv/nfs/media 192.168.1.0/24 /srv/nfs/projects 192.168.1.0/24 /srv/nfs/backup 192.168.1.100看到这个输出说明服务端配置没问题了。如果showmount报错说clnt_create: RPC: Program not registered那多半是rpcbind没启动或者nfs-server没跑起来。4. 客户端挂载与权限调优4.1 安装客户端工具并测试连通性客户端这边同样需要nfs-utils不过只需要客户端部分sudo pacman -S nfs-utils装完之后先别急着挂载用showmount测试一下能不能看到服务端的导出列表showmount -e 192.168.1.10把192.168.1.10换成你服务端的实际 IP。如果能看到目录列表说明网络和防火墙都没问题。如果卡住不动检查服务端防火墙和rpcbind状态。4.2 手动挂载与参数选择手动挂载用mount命令sudo mkdir -p /mnt/nfs/media sudo mount -t nfs 192.168.1.10:/srv/nfs/media /mnt/nfs/media挂载参数可以在命令行指定也可以写进/etc/fstab。我推荐在命令行先测试确认没问题再写fstab。常用的挂载参数有vers4强制使用 NFSv4避免协商到老版本。rsize131072,wsize131072读写块大小设为 128KB千兆网络下性能最佳。我实测过 64KB、128KB、256KB 三档128KB 最稳。hard硬挂载服务端无响应时客户端会一直重试不会丢数据。soft软挂载会超时返回错误适合只读场景。timeo600超时时间 60 秒配合hard使用。retrans2重传次数网络不稳定时可以适当调大。完整的挂载命令sudo mount -t nfs -o vers4,rsize131072,wsize131072,hard,timeo600,retrans2 192.168.1.10:/srv/nfs/media /mnt/nfs/media挂载后用df -h确认一下能看到 NFS 挂载点就成功了。然后cd进去试试读写touch一个文件看看权限对不对。4.3 开机自动挂载的两种方案手动挂载重启就没了得写进/etc/fstab才能开机自动挂载。在fstab里加一行192.168.1.10:/srv/nfs/media /mnt/nfs/media nfs vers4,rsize131072,wsize131072,hard,timeo600,retrans2,_netdev 0 0注意最后的_netdev选项它告诉系统等网络就绪后再挂载避免开机时网络还没起来导致挂载失败。0 0是 dump 和 fsck 选项NFS 不需要这两个都设成 0。另一种方案是用systemd的automount按需挂载访问目录时才建立连接。这种方式适合不常用的共享目录能节省资源。配置方法是在/etc/systemd/system/下建两个文件一个.mount定义挂载点一个.automount定义触发条件。不过fstab方案更简单直接家用场景下完全够用。注意写fstab之前一定要先用mount命令测试通过否则开机挂载失败可能导致系统进入紧急模式。如果不小心写错了在紧急模式下用mount -o remount,rw /重新挂载根分区然后改回fstab再重启。4.4 用户 ID 映射与权限一致性NFS 权限问题的根源几乎都是 UID/GID 不一致。服务端文件属于 UID 1000客户端用户也是 UID 1000那就能正常读写。如果客户端用户 UID 是 1001访问服务端文件时就会被当成“其他人”权限受限。解决办法有两个一是确保两端用户 UID 一致这是最简单的。二是配置idmapd做用户映射把客户端的 UID 映射到服务端的某个用户。idmapd的配置文件在/etc/idmapd.conf把Domain设成同一个值比如localdomain然后重启nfs-idmapd服务。我自己的做法是统一 UID。装系统的时候第一个用户默认就是 UID 1000只要两台机器都这样就不会有问题。如果你后来改了用户名或者加了新用户用id命令确认一下 UID不一致的话用usermod -u改过来。5. 性能调优与安全加固5.1 网络传输参数实测对比NFS 的性能受网络和挂载参数影响很大。我在千兆局域网里做了一组对比测试用dd命令写入 1GB 文件记录不同参数下的耗时参数组合写入速度读取速度备注rsize/wsize64K85MB/s92MB/s默认值偏保守rsize/wsize128K112MB/s115MB/s推荐值稳定跑满千兆rsize/wsize256K108MB/s110MB/s略有下降可能触发分片rsize/wsize128K async118MB/s120MB/s速度最快但断电可能丢数据从数据看128KB 是最佳平衡点。async模式虽然快一点但服务端断电时未落盘的数据会丢失家用场景下不值得冒这个险。另外sync模式下如果写入大量小文件性能下降明显可以考虑在服务端把sync改成async但只对不重要的目录这么做。5.2 限制访问范围与只读导出安全方面NFS 本身没有认证机制所以网络隔离是第一道防线。/etc/exports里尽量写具体 IP 或小网段不要用*通配符。如果家里有访客网络确保 NFS 服务只在内部网段监听。第二道防线是只读导出。像backup这种目录客户端只需要读那就设成ro。这样即使客户端被入侵攻击者也没法篡改备份文件。对于需要写入的目录可以进一步限制到具体 IP比如只有主力机能写其他机器只读。第三道防线是root_squash。这是 NFS 的默认行为客户端的 root 用户访问服务端时会被映射成nobody用户防止客户端 root 对服务端文件系统拥有完全控制权。除非你有特殊需求否则不要关掉这个选项。5.3 日志监控与故障预警NFS 服务端的日志在journalctl -u nfs-server里看客户端的挂载日志在dmesg里。如果客户端挂载后经常断连dmesg里会出现nfs: server 192.168.1.10 not responding之类的报错。这种情况通常是网络问题检查网线、交换机或者无线信号强度。我还在服务端加了一个简单的监控脚本每分钟检查一次 NFS 服务状态异常就发通知。脚本很简单#!/bin/bash if ! systemctl is-active --quiet nfs-server; then echo NFS server is down on $(hostname) | mail -s NFS Alert youremail.com fi配合cron或者systemd timer跑能及时发现服务异常。当然家用场景下 NFS 服务本身很稳定几个月不重启也没事这个监控更多是图个安心。6. 常见问题排查与避坑指南6.1 挂载失败报错速查表NFS 报错信息有时候比较晦涩我整理了一份常见错误和对应原因报错信息可能原因解决方法access denied by server客户端 IP 不在 exports 允许范围内检查/etc/exports里的 IP 段Connection refused服务端 NFS 或 rpcbind 没启动systemctl status nfs-server rpcbindNo such file or directory共享目录路径写错或不存在服务端确认目录存在且已导出Permission deniedUID/GID 不一致或目录权限不对两端id命令对比 UID检查目录权限mount: wrong fs type没装 nfs-utils 或内核模块未加载安装 nfs-utilsmodprobe nfsStale file handle服务端重启后客户端缓存失效客户端重新挂载或等缓存过期6.2 权限问题的排查思路权限问题是 NFS 最常见的坑。我的排查顺序是先看服务端目录权限再看 exports 配置最后看客户端 UID。具体操作服务端ls -ln /srv/nfs/media确认目录所有者和权限位。服务端showmount -e localhost确认导出配置生效。客户端id确认当前用户 UID。客户端mount | grep nfs确认挂载参数。客户端touch /mnt/nfs/media/test.txt测试写入看报错信息。如果服务端目录是755所有者 UID 1000客户端用户也是 UID 1000那写入应该没问题。如果客户端 UID 是 1001那就得改 UID 或者在 exports 里加all_squash,anonuid1000,anongid1000把所有客户端用户都映射成 UID 1000。6.3 开机挂载失败的急救方法fstab写错导致开机卡住这个我遇到过两次。第一次是 IP 写错了第二次是忘了加_netdev。急救方法是在启动卡住时按CtrlD进入紧急模式然后mount -o remount,rw / vim /etc/fstab把出错的那行注释掉保存重启。系统正常启动后再慢慢排查问题。预防措施就是前面说的先用mount命令测试确认无误再写fstab。另外可以在fstab里加nofail选项即使挂载失败也不阻塞启动192.168.1.10:/srv/nfs/media /mnt/nfs/media nfs vers4,rsize131072,wsize131072,hard,timeo600,retrans2,_netdev,nofail 0 0nofail加上之后即使服务端没开机客户端也能正常启动只是挂载点为空。等需要的时候手动mount一下就行。6.4 大文件传输中断的应对策略传输大文件时中断通常是网络不稳定或者超时设置太短。hard挂载模式下客户端会无限重试但默认超时时间可能不够。把timeo调到60060秒retrans调到5能显著提升弱网环境下的稳定性。如果无线网络实在不稳定可以考虑在服务端和客户端都启用 NFS 的nconnect选项建立多条 TCP 连接并行传输。不过这个选项需要内核 5.3 以上Manjaro 的滚动更新内核早就支持了。用法是在挂载参数里加nconnect4能提升吞吐量但对稳定性帮助有限。另一个思路是用rsync代替直接挂载传输。rsync支持断点续传中断后重新跑一遍就能接着传。对于超大文件我有时候会先用rsync传到服务端再在客户端挂载访问这样更稳妥。7. 我自己的使用体会与后续扩展这套 NFS 配置在我家里跑了大半年两台机器之间传素材、同步工程文件都很顺畅。最明显的感受是剪视频的时候不用再来回拷文件了直接在客户端挂载服务端的素材目录剪辑软件里导入路径填 NFS 挂载点就行渲染输出也直接写到服务端硬盘省了一道拷贝工序。踩过的坑主要集中在权限和开机挂载这两块。权限问题说到底就是 UID 一致性只要装系统的时候注意一下后面基本不会出问题。开机挂载失败那次是因为我手贱改了服务端 IP 但忘了更新fstab后来加了nofail就再也没卡过启动。后续我打算把 NFS 和systemd automount结合起来用不常用的共享目录按需挂载减少开机时的网络依赖。另外想试试 NFS over RDMA不过家用环境没有支持 RDMA 的网卡这个想法暂时搁置。如果你也在用 Manjaro 配 NFS遇到什么问题欢迎交流我踩过的坑大概率能帮你省点时间。
阅读完成 · 觉得有帮助?