使用 NFSv4 时列表目录很慢

gon*_*one 5 nfs mac-osx ubuntu-18.04

我目前正在我的 Mac 客户端 (Macos 10.14.1) 和 Raspberry Pi3 服务器 (U16.04.1 LTS) 之间设置基于 NFS 的文件共享。当我双启动我的 Mac (MacOS/Ubuntu18) 时,我想将我的 Pi 与 NFS(我已经有 Samba 运行良好,但它不处理 Unix 权限)作为一个共同的家,以减少文件重复并简化版本控制. 在我让 MacOS 正常工作后,我将处理 Ubuntu 设置。

我目前有两个共享设置,一个使用 NFS3 (anonymous),另一个使用 NFSv4 (home/user1)。读取/写入文件到任一共享都非常快且运行良好(UID/GID 不匹配除外)。我遇到的问题是,虽然在 NFS3 共享上列出文件也非常快,但在 NFSv4 共享上列出文件非常慢,我不知道为什么。

以下是我正在使用的所有设置。我没有mount --bind在服务器上使用过,因为我认为没有必要并且与我的问题没有任何关系,但我可能是错的。

几天来我一直在寻找这个问题的解决方案,但是我读过的任何内容都没有解决我的问题,其他人总是抱怨目录包含大量文件,也没有我看到的任何建议解决了我的问题. 原来,它已经与终端我的颜色设置做的,看到更新下面

最终,我想在我的 Mac 和 Pi 之间同步 UID/GID,但这是另一个问题,因为我现在不太了解使用(但希望没有)Kerberos 设置 LDAP(或使用 NIS?)。另外,我现在没有域控制器设置。

提前感谢您抽出时间阅读我的问题和您的建议。

服务器端
/etc/exports:

/srv/anonymous *(rw,sync,insecure,no_subtree_check,all_squash)
/srv/home/user1 *(rw,sync,fsid=0,insecure,crossmnt,no_subtree_check,no_root_squash)
Run Code Online (Sandbox Code Playgroud)

/etc/default/nfs-common:

NEED_STATD=
NEED_IDMAPD=yes
STATDOPTS="--port 4000 --outgoing-port 4001"
NEED_GSSD=
Run Code Online (Sandbox Code Playgroud)

/etc/default/nfs-kernel-server:

RPCNFSDCOUNT=8
RPCNFSDPRIORITY=0
RPCMOUNTDOPTS="--manage-gids -p 4002"
NEED_SVCGSSD=""
RPCSVCGSSDOPTS=""
RPCNFSDOPTS=""
Run Code Online (Sandbox Code Playgroud)

/etc/idmapd.conf:

[General]
Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs

[Translation]
   Method=static
[Static]
   user1@mac.local = user1

[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup
Run Code Online (Sandbox Code Playgroud)

/etc/modprobe.d/blacklist.conf:

blacklist rpcsec_gss_krb5
Run Code Online (Sandbox Code Playgroud)

/etc/modprobe.d/options.conf:

options lockd nlm_udpport=4001 nlm_tcpport=4001
Run Code Online (Sandbox Code Playgroud)

/etc/模块:

lockd
Run Code Online (Sandbox Code Playgroud)

/sys/module/nfsd/parameters/nfs4_disable_idmapping:

Y  (I've tried manually setting this to "N" but it gets overwritten)
   (So I'm using nfs-common to manage this via the 'NEED_IDMAPD=yes' option
Run Code Online (Sandbox Code Playgroud)

客户端
安装使用:

mount -v -t nfs -o proto=tcp,port=2049 raspberry.local:/srv/anonymous ~/ranonymous
mount -v -t nfs -o rsize=32768,wsize=32768,proto=tcp,port=2049,sec=sys raspberry.local:/srv/home/user1 ~/ruser1
Run Code Online (Sandbox Code Playgroud)

时间 ls /share 的结果:

user1@mac:[ 6:13]$ time ls ranonymous/
a1        putty.zip test

real    0m0.013s
user    0m0.002s
sys     0m0.004s
user1@mac:[ 6:13]$ time ls ruser1/
a1        a2        a3        a4        a5        me        me copy   myScripts you       you1      you2      you3

real    0m6.044s
user    0m0.002s
sys     0m0.004s
Run Code Online (Sandbox Code Playgroud)

更新 我已经为缓慢的ls时间制定了部分答案,这与颜色的使用有关。通过export CLICOLOR=1在我的 bash 配置文件中注释掉,我现在获得了正常的速度。这是一种耻辱,因为我确实希望在我的终端中有颜色。

1)为什么这个问题只发生在 NFSv4 上?
2)为什么这个问题只影响根文件夹而不影响子文件夹,即使颜色仍然存在,我也能很快得到列表。3)有什么方法可以设置我的 bash 配置文件,以便我在列出本地文件夹时有颜色,但在不使用不同命令的情况下列出共享时没有颜色?
4)是否有可能在不牺牲色彩的情况下实现快速性能?

我还有另一个相关问题:在终端中,我根据挂载点(~/ruse​​r1)访问共享驱动器。但是,在 Finder 中,挂载点被重命名为(~/user1),即服务器共享的基本目录。有没有办法让它保持一致?