在最近从 SLES 9.3 升级到 10.2 的机器上,我看到以下问题:
在升级之前,NFS 挂载(通过 yast 定义,即它出现在 中/etc/fstab
)正常工作。但是,在升级之后,它失败了。网络跟踪显示它正在通过 TCP 与 NFS 服务器建立初始连接(对于 portmapper RPC),但随后切换到 UDP 以进行后续 MOUNT 调用;由于 NFS 服务器不允许 UDP(有充分的理由,由于可能存在数据损坏问题,如 中所示nfs(5)
),连接将无法通过。
添加 TCP 选项(无论是在 fstab 中,还是在命令行等处)都没有效果。
在对此进行故障排除的过程中,我发现 /var/adm/messages 报告在引导期间发生以下情况:
Failed services in runlevel 3: network
(我应该注意,尽管有此错误消息,但显然至少启动了一些网络服务,因为该框可通过 SSH 访问。)
那么我的问题:
- 我应该看什么来确定服务启动失败的原因?
- 这确实会导致上述 NFS 的问题吗?
- 如果 (2) 的答案是否定的,那么关于寻找什么的任何建议?
编辑以添加与以下答案相关的一些信息。
事实证明,网络服务在启动时失败,因为其中一个接口(此框中有两个)使用 DHCP,而此时该接口尚不可用。所以我暂时禁用它,停止/重新启动网络服务和 NFS 客户端服务,但仍然得到相同的结果。
客户端没有防火墙。此外,客户端的 iptables -L 表明一切都被接受;/etc/hosts.allow 或 /etc/hosts.deny 中没有条目。
在 NFS 服务器端,没有任何变化。远程 nfsserver 确实在宣传它允许 TCP 和 UDP 用于所有 NFS 服务(尽管有一个 iptables 规则阻止 UDP)。
/etc/fstab 条目是非常基本的——在 yast 中设置它会得到什么:
x.x.x.x:/volume /localdir nfs defaults 0 0
客户端框的 rpcinfo -p 仅显示正在运行的 portmapper v2,同时通告 TCP 和 UDP。对于服务器,它显示了所有常用服务:
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 4047 status
100024 1 tcp 4047 status
100011 1 udp 4049 rquotad
100021 1 udp 4045 nlockmgr
100021 3 udp 4045 nlockmgr
100021 4 udp 4045 nlockmgr
100021 1 tcp 4045 nlockmgr
100021 3 tcp 4045 nlockmgr
100021 4 tcp 4045 nlockmgr
100005 1 udp 4046 mountd
100005 1 tcp 4046 mountd
100005 2 udp 4046 mountd
100005 2 tcp 4046 mountd
100005 3 udp 4046 mountd
100005 3 tcp 4046 mountd
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
上面的 /etc/fstab 条目的 mount 调用很简单:
mount /localdir
虽然我也尝试过各种选项,如 tcp、v3 等。
/etc/fstab 条目(因此挂载)和 rpcinfo -p 调用都使用 IP 地址,因此不涉及 DNS 解析问题。
出于类似原因,请检查以确保
/etc/hosts.deny
不包含 和 的条目。对于它的价值,我通常清除并使用来控制访问。mountd
hosts.allow
hosts.deny
iptables
用于
rpcinfo -p nfsserver
确保mountd
确实是在宣传 TCP——有一个选项-n
可以禁用 TCP 侦听,这(SuSE 上的 IIRC)可能会设置在其中/etc/sysconfig/nfs
或附近。据我了解您的问题,您可以执行以下操作:
rpcinfo
到服务器但是您无法在 nfs 客户端上从 nfs 服务器挂载文件系统,并且您不会收到任何错误消息。
rpcinfo
your和mount
call有什么区别?您是否在一个中使用 ip 地址而在另一个中使用 fqdn?能否请您发布带有输出和返回码的两个命令?几件事。首先,您在开始时声明
since the NFS server doesn't allow UDP
,然后在您的编辑中提及The remote nfsserver is indeed advertising that it allows both TCP and UDP for all of the NFS services
。这似乎有点奇怪。为什么服务器会宣传它不允许的内容?其次,您是在尝试使用 NFS 版本 2 还是版本 3?版本 2 仅支持 UDP,而 TCP 需要版本 3。也许在挂载选项中手动指定版本 3 会有所帮助?(vers=3) 如果它默认为 2,那么即使指定 TCP 也对您没有任何好处。
当服务器不太支持它时,我也遇到了尝试使用版本 4 的新客户端的问题。您的 SLES 升级可能导致不同的默认版本。更有理由明确指定它。
你为什么不在 /etc/fstab 中发布条目呢?
service network restart
并查看您收到的消息。那里应该有一些信息。尝试明确地设置事物,看看你会得到什么。例如,在 /etc/fstab 中:
这至少应该绕过端口映射器并显式尝试连接到您上面列出的 TCP 端口,并在调试期间更容易跟踪每个通道。
作为参考,以防其他人遇到此问题并想要答案:
我终于在这方面向 Novell 开了一张票。事实证明,这是 SLES 10.2 中的一个已知错误(491140:mount ignores "proto=" for "nfs"),并且有一个补丁(util-linux-2.12r-35.35.2.x86_64.rpm) . 安装后,挂载按预期工作,所有请求都通过 TCP 发出。(Novell 支持人员还告诉我,这已在 SLES 10.3 中合并。)