DigitalOcean上有许多Linux使用教程。其中NFS的这篇以分步的形式,讲解了NFS的安装、权限配置(包括防火墙ufw)、NFS自身的设置等。然而,这篇文章遗漏了一些讲解,而新手可能会因此搞不清楚自己的NFS服务究竟是开了还没有开。(测不准定理)因此这篇文章中我们就来拾下遗,希望能够帮助到大家。

Q:为什么我的NFS一直处于active(exited)的状态?

输入sudo systemctl status nfs-kernel-server,小伙伴们可能会得到如下的输出:

bash# systemctl status nfs-kernel-server

● nfs-server.service - NFS server and services
     Loaded: loaded (/lib/systemd/system/nfs-server.service; enabled; vendor pr>
    Drop-In: /run/systemd/generator/nfs-server.service.d
             └─order-with-mounts.conf
     Active: active (exited) since Fri 2022-02-25 20:06:33 CST; 22min ago
    Process: 2950 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS>
    Process: 2951 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, statu,status=0/SUCCESS>
   Main PID: 2951 (code=exited, status=0/SUCCESS)
        CPU: 15ms
Feb 25 20:43:48 devs systemd[1]: Starting NFS server and services...
Feb 25 20:43:50 devs systemd[1]: Finished NFS server and services.

其实这个输出反而是提示了NFS 服务端已经启动了(正不正常不好说)。在superuser.com的这篇问答中有明确的答案,翻译一下是这样的:

    因为NFS服务器在内核空间运行,它没有运行在用户空间的进程。

    rpc.nfsd唯一做的事就是叫内核启动NFS server kthreads,但这些被启动的新进程与rpc.nfsd毫无联系,即使rpc.nfsd退出,也会一直运行下去。

    所以systemd中的服务的行为是正常的(这也是它所有能做的)。这和启动iptables和nftables很类似,它们也没有运行在用户空间的守护进程。

然后这位老哥(老姐)也给了正确查看NFS是否在运作的方法:

  • 使用ps axf或者htop显示kthreads,然后找有没有名字叫[nfsd]
  • /proc/fs/nfsd查看相关信息

Q:为什么我的NFS开了,客户端那边却显示服务器未开启?

排除了网络连接,防火墙等问题后,有可能是因为服务器上的rpc-statd服务没有启动,启动了就好了。这个方案居然是在一篇日文回答里找到的。

Q:Mac客户端连接返回Operation not permitted

在共享中打开insecure选项。这个secure据说只是指只允许从安全端口访问。

Q:Permission denied?

这个其实有很多原因,比如NFS使用的匿名用户(或者映射后的用户)没有足够的权限访问该文件夹,但如果你已经把anonuid都设置为0了,文件夹权限设置成777了,还是提示权限不够,那就得看看是不是/etc/exports里头,IP地址设置错了。为了方便排障,可以先把它设置成*。我就是以为这个是对的(因为是本地虚拟机)就一直调,谁知道子网第一个地址不是宿主机...

感觉Mac上NFS的挂载要比SMB要快得多(也有可能是在本地几乎没有延时的缘故)根据2016年的一篇性能测试,NFS在小文件读写上性能是优于SMB的,但是他这个测试环境是群晖,对比协议是NFSv4和SMBv2协议(注意Linux的SMB协议实现是基于逆向工程的Samba)如果是使用Windows来开SMB的话有没有可能快点呢?以后有时间可以测试一下。

那么就是这么多了,希望能帮各位节省几分钟的生命。

Feature Photo by Klara Kulikova on Unsplash