7. 故障排除

7.1. 无法在挂载的文件系统上看到文件

首先,检查文件系统是否实际挂载。有几种方法可以做到这一点。最可靠的方法是查看文件/proc/mounts它将列出所有已挂载的文件系统并提供有关它们的详细信息。如果这不起作用(例如,如果您没有将/proc文件系统编译到您的内核中),您可以键入mount -f尽管您获得的信息较少。

如果文件系统似乎已挂载,那么您可能在它上面挂载了另一个文件系统(在这种情况下,您应该卸载并重新挂载这两个卷),或者您可能在挂载之前在服务器上导出了该文件系统,在这种情况下,NFS正在导出底层的挂载点(如果是这样,则需要在服务器上重新启动NFS)。

如果文件系统未挂载,请尝试挂载它。如果这不起作用,请参阅症状3

7.2. 文件请求挂起或超时,等待访问文件。

这通常意味着客户端无法与服务器通信。请参阅症状3中的b。

7.3. 无法挂载文件系统

当mount无法挂载卷时,会产生两个常见的错误。 它们是

  1. failed, reason given by server(失败,服务器给出的原因)Permission denied(权限被拒绝)

    这意味着服务器不承认您有权访问该卷。

    1. 检查您的/etc/exports文件,并确保已导出该卷,并且您的客户端具有正确的访问权限。 例如,如果客户端只有读取权限,则必须使用ro选项而不是rw选项来挂载该卷。

    2. 确保您已告知NFS通过运行exportfs命令来注册您对/etc/exports在启动nfsd之后所做的任何更改。 请务必键入exportfs -ra,以确保重新读取导出。

    3. 检查文件/proc/fs/nfs/exports并确保正确列出了卷和客户端。(您也可以查看文件/var/lib/nfs/xtab以获得所有活动导出选项设置方式的完整列表。)如果未列出它们,则您尚未正确重新导出。 如果已列出,请确保服务器将您的客户端识别为您认为的计算机。 例如,您可能在/etc/hosts中有一个旧的客户端列表,该列表正在关闭服务器,或者您可能未列出客户端的完整地址,并且它可能正在解析为不同域中的计算机。 一种技巧是从客户端通过sshtelnet登录到服务器; 如果然后键入who,则其中一个列表应该是您的登录会话和服务器看到的客户端计算机的名称。 尝试在您的/etc/exports条目中使用此计算机名称。 最后,尝试从服务器ping客户端,然后尝试从客户端ping服务器。 如果这不起作用,或者存在数据包丢失,则可能存在较低级别的网络问题。

    4. 不可能同时导出目录及其子目录(例如,同时导出/usr/usr/local)。您应该使用必要的权限导出父目录,然后可以使用相同的权限挂载其所有子目录。

  2. RPC: Program Not Registered(RPC:程序未注册):(或其他“RPC”错误)

    这意味着客户端未检测到服务器上正在运行的NFS。这可能是出于几个原因。

    1. 首先,通过在服务器上键入rpcinfo -p来检查NFS是否实际在服务器上运行。您应该看到类似以下内容
         program vers proto   port
          100000    2   tcp    111  portmapper
          100000    2   udp    111  portmapper
          100011    1   udp    749  rquotad
          100011    2   udp    749  rquotad
          100005    1   udp    759  mountd
          100005    1   tcp    761  mountd
          100005    2   udp    764  mountd
          100005    2   tcp    766  mountd
          100005    3   udp    769  mountd
          100005    3   tcp    771  mountd
          100003    2   udp   2049  nfs
          100003    3   udp   2049  nfs
          300019    1   tcp    830  amd
          300019    1   udp    831  amd
          100024    1   udp    944  status
          100024    1   tcp    946  status
          100021    1   udp   1042  nlockmgr
          100021    3   udp   1042  nlockmgr
          100021    4   udp   1042  nlockmgr
          100021    1   tcp   1629  nlockmgr
          100021    3   tcp   1629  nlockmgr
          100021    4   tcp   1629  nlockmgr
        
      这表示我们有NFS版本2和3,rpc.statd版本1,网络锁管理器(rpc.lockd的服务名称)版本1、3和4。 还有不同的服务列表,具体取决于NFS是通过TCP还是UDP传输。除非明确要求使用TCP,否则UDP通常(但并非总是)是默认设置。

      如果您至少没有看到portmappernfsmountd,则需要重新启动NFS。 如果您无法成功重新启动,请继续症状9

    2. 现在,检查以确保您可以从客户端看到它。 在客户端上,键入rpcinfo -p server,其中server是服务器的DNS名称或IP地址。

      如果您得到一个列表,请确保支持您尝试执行的挂载类型。 例如,如果您尝试使用版本3 NFS挂载,请确保已列出版本3; 如果您尝试通过TCP使用NFS挂载,请确保已注册。 (某些非Linux客户端默认为TCP)。 键入man rpcinfo以获取有关如何读取输出的更多详细信息。 如果未列出您尝试执行的挂载类型,请尝试其他挂载类型。

      如果您收到错误No Remote Programs Registered(未注册远程程序),则需要检查服务器上的/etc/hosts.allow/etc/hosts.deny文件,并确保您的客户端实际上被允许访问。 同样,如果条目显示正确,请检查/etc/hosts(或您的DNS服务器),并确保机器已正确列出,并确保您可以从客户端ping服务器。 另请检查系统上的错误日志以获取有用的消息:来自错误/etc/hosts.allow条目的身份验证错误通常会出现在/var/log/messages中,但可能会出现在其他位置,具体取决于您的系统日志的设置方式。 的手册页syslog可以帮助您弄清楚日志的设置方式。 最后,当两台机器之间的路由不对称时,某些较旧的操作系统可能会出现异常行为。 尝试从客户端键入tracepath [server],看看输出中是否出现“不对称”一词。 如果是这样,则可能会导致数据包丢失。 但是,不对称路由通常在最近的Linux发行版上不是问题。

      如果您收到错误Remote system error - No route to host(远程系统错误 - 没有到主机的路由),但是您可以正确ping服务器,那么您就是过度热情的防火墙的受害者。 检查可能已设置的任何防火墙,无论是在服务器上还是在客户端和服务器之间的任何路由器上。 查看ipchainsnetfilteripfwadm的手册页,以及IPChains-HOWTOFirewall-HOWTO以获得帮助。

7.4. 我没有权限访问已挂载卷上的文件。

这可能是两个问题之一。

如果是写权限问题,请通过查看服务器上的导出选项来检查/proc/fs/nfs/exports并确保文件系统不是以只读方式导出的。 如果是这样,您将需要以读/写方式重新导出它(不要忘记在编辑后运行exportfs -ra/etc/exports)。 此外,请检查/proc/mounts并确保卷以读/写方式挂载(尽管如果是以只读方式挂载,则应该收到更具体的消息)。 如果不是,那么您需要使用rw选项来挂载该卷。

第二个问题与用户名映射有关,并且根据您是以root用户身份还是以非root用户身份尝试执行此操作而有所不同。

如果您不是root用户,则客户端和服务器上的用户名可能不同步。 在客户端和服务器上键入id [user],并确保它们提供相同的UID编号。 如果没有,则您在使用NIS、NIS+、rsync或您用来同步用户名的任何系统时遇到问题。 检查组名以确保它们也匹配。 另外,请确保您没有使用all_squash选项进行导出。 如果用户名匹配,则该用户具有与NFS无关的更一般的权限问题。

如果您是root用户,则您可能没有使用no_root_squash选项进行导出; 请在服务器上检查/proc/fs/nfs/exports/var/lib/nfs/xtab,并确保已列出该选项。 总的来说,能够以root用户身份写入NFS服务器是一个坏主意,除非您有紧急需要 - 这就是为什么Linux NFS默认情况下会阻止它。 有关详细信息,请参阅第6节

如果您有root权限压缩,则要保留它,并且您只是想让root用户对文件具有与用户nobody相同的权限,那么请记住,服务器确定root用户映射到的uid。 默认情况下,服务器使用/etc/passwd文件中的nobodyUIDGID,但是也可以使用anonuidanongid选项覆盖/etc/exports文件。 确保客户端和服务器就nobody映射到的UID达成一致。

7.5. 当我传输非常大的文件时,NFS会占用服务器上的所有CPU周期,并且服务器会停止运行。

这是fsync()函数在2.2内核中出现的问题,该函数导致所有同步到磁盘的请求都是累积的,从而导致写入时间与文件大小成二次方关系。 如果可以,升级到2.4内核应该可以解决该问题。 此外,使用no_wdelay选项导出强制程序使用o_sync()代替,这可能会更快。

7.6. 奇怪的错误或日志消息

  1. 以下格式的消息

     Jan 7 09:15:29 server kernel: fh_verify: mail/guest permission failure, acc=4, error=13
     Jan 7 09:23:51 server kernel: fh_verify: ekonomi/test permission failure, acc=4, error=13
      

    当在您没有写入权限的文件上尝试NFSsetattr操作时,会发生这种情况。 这些消息是无害的。

  2. 以下消息经常出现在日志中

     kernel: nfs: server server.domain.name not responding, still trying
     kernel: nfs: task 10754 can't get a request slot
     kernel: nfs: server server.domain.name OK
     

    “can't get a request slot”消息表示客户端RPC代码检测到大量超时(可能是由于网络拥塞,也可能是由于服务器过载),并且正在限制并发的未完成请求数,以尝试减轻负载。 这些消息的原因基本上是性能迟缓。 有关详细信息,请参阅第5节

  3. 挂载后,客户端上出现以下消息

    nfs warning: mount version older than kernel
      

    它的意思很明确:您应该升级您的挂载包和/或am-utils。(如果由于某些原因升级是一个问题,您可能可以通过重新编译它们来解决问题,以便在编译时识别较新的内核功能)。

  4. 启动/关闭日志中出现lockd的错误

    您可能会在启动日志中看到以下类型的消息:
    nfslock: rpc.lockd startup failed
     

    这些消息是无害的。 旧版本的 rpc.lockd 需要手动启动,但新版本由 nfsd 自动启动。 许多默认启动脚本仍然尝试手动启动 lockd,以防需要。 如果您希望这些消息消失,您可以修改您的启动脚本。

  5. 以下消息出现在日志中:

    kmem_create: forcing size word alignment - nfs_fh
       

    这是由于文件句柄是 16 位,而不是 32 位的倍数,这会让内核不满。 这是无害的。

7.7. 实际权限与文件中设置的不匹配/etc/exports.

/etc/exports对空格非常敏感 - 因此以下语句并不相同:
/export/dir hostname(rw,no_root_squash) 
/export/dir hostname (rw,no_root_squash) 
 
第一个将授予hostname rw访问/export/dir而不会压缩 root 权限。 第二个将授予hostname rw权限,并进行root 权限压缩并且它将授予所有人读/写访问权限,而不会压缩 root 权限。 很棒,不是吗?

7.8. 不稳定和不可靠的行为

ls 这样的简单命令可以工作,但是任何传输大量信息的命令都会导致挂载点锁定。

这可能是以下两个问题之一:

  1. 如果您在服务器和/或客户端上启用了 ipchains,并且您不允许分段数据包通过链,则会发生这种情况。 允许来自远程主机的片段,您就可以再次正常工作。 有关如何执行此操作的详细信息,请参阅 第 6.4 节

  2. 您可能使用了更大的rsizewsize挂载选项,服务器不支持。 尝试将rsizewsize降低到 1024,看看问题是否消失。 如果是这样,那么慢慢地将它们增加到一个更合理的值。

7.9. nfsd 无法启动

检查文件/etc/exports并确保 root 具有读取权限。 检查二进制文件,确保它们是可执行的。 确保您的内核已编译了 NFS 服务器支持。 如果这些方法都无济于事,您可能需要重新安装您的二进制文件。

7.10. 使用多个客户端时的文件损坏

如果文件在其上次修改后的一秒内被修改并且大小保持不变,它将继续生成相同的 inode 号。 因此,多个客户端对文件进行持续的读写操作可能会导致文件损坏。 修复此错误需要在文件系统层进行深入的更改,因此这是一个 2.5 版本的问题。