我有两个 Linode 容器。Box A 是我们的通用 Web 服务器。它偶尔需要访问 Box B,后者设置为 NFS 服务器。
当 Box B 重新启动时,无论我做什么,Box A 都无法访问任何 NFS 共享。经过几个小时的故障排除,我终于能够将其缩小到一步修复。
Box B 重启后:
$ sudo service nfs restart
这两个都是 CentOS 6.8 系统,都是最新的。我相信 NFS 相关的软件包都是通过 yum 安装的。我确实在设置整个系统时遇到了一些麻烦;这不是一个顺利的过程,但在重新启动 nfs 服务后,一切都运行良好。
如果我
$ sudo service --status-all
重启前后没有任何区别。也许是时间问题?但我不知道如何开始解决这个问题。我该怎么办?
其他注意事项:
我正在使用 autofs 自动按需从 Box A 挂载共享,但共享也无法手动挂载
我每天都在 Windows 和 Mac 桌面和服务器上度过,但多年来我一直在 Linux 上运行网站。我精通我需要做的事情,但这不是我的舒适区,我花了很多时间在谷歌上搜索如何做新的事情。
我甚至不知道该检查哪里。我在日志中没有看到任何明显的信息,但请告诉我要查找什么,我会发布。
更新
在方框 B 上:
[shorowitz@BoxB ~]$ sudo chkconfig --list nfs
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[shorowitz@BoxB ~]$ sudo chkconfig --list nfslock
nfslock 0:off 1:off 2:on 3:on 4:on 5:on 6:off
更新 2
重新启动 BoxB 后,运行
$ sudo showmount -e BoxB
BoxA 显示预期的挂载点,但我无法挂载它们。只需在 BoxB 上重新启动 nfs
$ sudo service nfs restart
Shutting down NFS daemon: [ OK ]
Shutting down NFS mountd: [ OK ]
Shutting down NFS services: [ OK ]
Shutting down RPC idmapd: [ OK ]
FATAL: Module nfsd not found.
FATAL: Error running install command for nfsd
Starting NFS services: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
并且挂载立即在 BoxA 上可用。当 NFS 已在工作时,这些致命错误也会在后续重新启动时出现,所以我不知道它们有多大相关性(我以为我已经发布了它们)。
附加日志信息
我在11月15日9点29分发出了重启命令
grep -i "nfs" /var/log/message*
messages:Nov 15 09:29:08 BoxB kernel: nfsd: last server has exited, flushing export cache
messages:Nov 15 09:29:54 BoxB kernel: RPC: Registered tcp NFSv4.1 backchannel transport module.
messages:Nov 15 09:29:54 BoxB kernel: FS-Cache: Netfs 'nfs' registered for caching
messages:Nov 15 09:29:54 BoxB kernel: NFS: Registering the id_resolver key type
messages:Nov 15 09:29:54 BoxB kernel: nfs4filelayout_init: NFSv4 File Layout Driver Registering...
messages:Nov 15 09:29:54 BoxB kernel: Installing knfsd (copyright (C) 1996 [email protected]).
messages:Nov 15 09:29:54 BoxB kernel: xenfs: not registering filesystem on non-xen platform
messages:Nov 15 09:29:54 BoxB rpc.mountd[2740]: NFS v4 mounts will be disabled unless fsid=0
messages:Nov 15 09:29:54 BoxB kernel: NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory
messages:Nov 15 09:29:54 BoxB kernel: NFSD: starting 90-second grace period (net ****************)
messages:Nov 15 09:33:39 BoxB kernel: nfsd: last server has exited, flushing export cache
messages:Nov 15 09:33:40 BoxB kernel: NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory
messages:Nov 15 09:33:40 BoxB kernel: NFSD: starting 90-second grace period (net ****************)
更新 3:
盒子B
[shorowitz@BoxB ~]$ sudo chkconfig --list | egrep "nfs|rpc"
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
nfslock 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rpcgssd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
rpcsvcgssd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[shorowitz@BoxB ~]$ sudo iptables --list -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 REJECT all -- !lo * 127.0.0.0/8 0.0.0.0/0 reject-with icmp-port-unreachable
18 710 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW icmp type 8
471 26200 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 state NEW
204K 393M ACCEPT all -- * * {BoxA IP} 0.0.0.0/0
6721 754K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2859 168K LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `iptables_INPUT_denied: '
9229 628K REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `iptables_FORWARD_denied: '
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT 278K packets, 8386M bytes)
pkts bytes target prot opt in out source destination
[shorowitz@BoxB ~]$ sudo rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 38148 status
100024 1 tcp 45681 status
100005 1 udp 37846 mountd
100005 1 tcp 59259 mountd
100005 2 udp 59934 mountd
100005 2 tcp 42645 mountd
100005 3 udp 33867 mountd
100005 3 tcp 41823 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 37287 nlockmgr
100021 3 udp 37287 nlockmgr
100021 4 udp 37287 nlockmgr
100021 1 tcp 37579 nlockmgr
100021 3 tcp 37579 nlockmgr
100021 4 tcp 37579 nlockmgr
这不返回任何内容:
grep -v "^#" /etc/sysconfig/nfs
盒子A
$ chkconfig --list | egrep "nfs|rpc"
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
nfslock 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rpcgssd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
rpcsvcgssd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
$ iptables --list -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
390K 58M ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 REJECT all -- * * 0.0.0.0/0 127.0.0.0/8 reject-with icmp-port-unreachable
990K 7850M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 DROP all -- * * 43.255.188.145 0.0.0.0/0
8 388 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:587
11864 608K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25
1 40 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:636
4545 238K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
9759 553K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
24 960 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
320 19152 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
85 5681 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
3254 194K LOG all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 5/min burst 5 LOG flags 0 level 7 prefix `iptables denied: '
3634 227K DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1360K 1907M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
$ rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 55882 status
100024 1 tcp 58283 status
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 43136 mountd
100005 1 tcp 55047 mountd
100005 2 udp 51117 mountd
100005 2 tcp 42791 mountd
100005 3 udp 44511 mountd
100005 3 tcp 46535 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 43509 nlockmgr
100021 3 udp 43509 nlockmgr
100021 4 udp 43509 nlockmgr
100021 1 tcp 38725 nlockmgr
100021 3 tcp 38725 nlockmgr
100021 4 tcp 38725 nlockmgr
$ mount | grep nfs
nfsd on /proc/fs/nfsd type nfsd (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
11月14日更新
BoxA:
$ cat /etc/auto.master.d/nfs
xdata -rw boxb:/srv/nfs/xdata
xbackup -rw boxb:/srv/nfs/xbackup
zbackups -rw boxb:/srv/nfs/zbackups
$ mount | grep nfs
mount |grep nfs
nfsd on /proc/fs/nfsd type nfsd (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
boxb:/srv/nfs/xdata on /mnt/nfs/xdata type nfs (rw,sloppy,vers=4,addr={boxb ip},clientaddr={boxa ip})
答案1
您能否用更多信息更新您的问题?
在 NFS 服务器上运行
chkconfig --list | egrep "nfs|rpc"
iptables --list -n -v
rpcinfo -p
如果您的 nfs 服务器设置未定制,则下一个应该不会返回任何内容。
grep -v "^#" /etc/sysconfig/nfs
但是如果你正在运行 iptables - 它应该被定制。参见这里
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/s2-nfs-nfs-firewall-config.html
在您的客户端运行
chkconfig --list | egrep "nfs|rpc"
iptables --list -n -v
rpcinfo -p
mount | grep nfs
如果您正在运行 NFSV2 或 NFSV3,您还需要在客户端上运行 nfslock
启动 NFS 时,输出中有什么奇怪的地方 - 是下面这行吗?
FATAL: Module nfsd not found.
FATAL: Error running install command for nfsd
我刚刚意识到一件事 - 由于您正在 openvz 上运行 - 以下链接适用于您的情况。看看这是否有帮助
https://openvz.org/NFS_server_inside_container
编辑1:
我今天在 openvz 容器上运行了测试。
您看到的消息
FATAL: Module nfsd not found.
FATAL: Error running install command for nfsd
是无害的。这里描述了https://openvz.org/NFS_server_inside_container
我无法重现您的问题。重启 nfs 服务器后 - nfs 客户端仍然能够浏览文件、创建新文件、从 nfs 共享中删除文件。
您现在可以发布自动挂载配置以及输出吗
mount|grep nfs
从 Box A,您已经这样做了。但是您在自动挂载文件系统卸载时执行了此操作。因此现在在 Box A 上 cd 到自动挂载目录,然后运行上述命令。这将提供有关挂载期间使用了哪些选项的信息。
另外,下次您重新启动 Box B 时,如果出现此自动挂载问题,请从站点 A 运行此命令
netstat -anp|grep ipofB
这将提供有关涉及哪些端口的信息。
在这种情况下,收集 B 和 A 上的 tcpdump 也是不错的选择。
我倾向于认为您的配置没有问题 - 但 vzhosts 上的 iptables 出现了一些奇怪的问题。不是在您的容器中,而是在主机上。
您还可以尝试在主机 A 上安装 nmap,并在出现问题时扫描主机 B,查看从 A 的角度来看哪些端口是打开的(有些人可能会建议使用 netstat 或 ss,但在这种情况下,容器前面还有 openvz 主机防火墙,我们不知道它们是否阻止了某些东西)
编辑 2(11 月 25 日) 您的挂载选项有些奇怪
比较你的输出
$ mount | grep nfs
mount |grep nfs
nfsd on /proc/fs/nfsd type nfsd (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
boxb:/srv/nfs/xdata on /mnt/nfs/xdata type nfs (rw,sloppy,vers=4,addr={boxb ip},clientaddr={boxa ip})
下面是我的。这是我的 /etc/auto.misc。第 6 行是默认的。第 16 行是我添加的
[root@vznfsclient /]# egrep -vn "^#|^$" /etc/auto.misc
6:cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
16:nfs -fstype=nfs 192.168.0.54:/nfs_export
因此,当我使用 cd 转到 /misc/nfs 时,我的共享就被挂载了。但是看看第 12 行的默认选项。
[root@vznfsclient ~]# mount|egrep -n "nfs|auto"
4:nfsd on /proc/fs/nfsd type nfsd (rw,relatime)
5:sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
10:/etc/auto.misc on /misc type autofs (rw,relatime,fd=6,pgrp=768,timeout=300,minproto=5,maxproto=5,indirect)
11:-hosts on /net type autofs (rw,relatime,fd=12,pgrp=768,timeout=300,minproto=5,maxproto=5,indirect)
12:192.168.0.54:/nfs_export/ on /misc/nfs type nfs (rw,relatime,vers=3,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.0.54,mountvers=3,mountport=42089,mountproto=udp,local_lock=none,addr=192.168.0.54)
首先是 nfsv3,它使用 udp。好的,我们可以通过将 /etc/auto.misc 更改为 tcp
[root@vznfsclient /]# egrep -vn "^#|^$" /etc/auto.misc
6:cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
16:nfs -fstype=nfs,proto=tcp 192.168.0.54:/nfs_export
安装选项将更改为
192.168.0.54:/nfs_export/ on /misc/nfs type nfs (rw,relatime,vers=3,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.0.54,mountvers=3,mountport=45378,mountproto=tcp,local_lock=none,addr=192.168.0.54)
当我尝试在 /etc/auto.misc 中使用时-fstype=nfs4
- 我甚至无法 cd 到 /misc/nfs,这是有道理的,因为每个 openvz nfsv4 都不支持容器内部https://openvz.org/NFS_server_inside_container
请注意,您的挂载选项中有sloppy
和 simple rw
。这基本上意味着
- 传递给 mount.nfs 的选项并不完全正确,因此它正在尝试解决此问题。阅读 man mount.nfs 并搜索 /sloppy。
- 我猜想它正在尝试使用 nfsv4。如果容器内部不支持它,甚至不知道它如何工作。
我建议将你的自动挂载映射更改为正确的语法(参见我的示例)或参见此处的示例https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/s2-nfs-config-autofs.html
然后进行测试。我刚刚在两个不同的 openvz 主机上运行的相同两个容器中使用 autofs 进行了测试 - 并且在 nfs 服务器重启后 - 客户端仍然正常运行。
编辑3 我甚至无法重现您的情况。我将 /etc/auto.misc 更改为以下内容,这与您所拥有的几乎相同
[root@vznfsclient nfs]# egrep -nv "^#|^$" /etc/auto.misc
6:cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
16:nfs -rw 192.168.0.54:/nfs_export
重启并 cd /misc/nfs 后,我仍然有这个
[root@vznfsclient nfs]# mount|grep nfs
nfsd on /proc/fs/nfsd type nfsd (rw,relatime)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
192.168.0.54:/nfs_export/ on /misc/nfs type nfs (rw,relatime,vers=3,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.0.54,mountvers=3,mountport=46453,mountproto=udp,local_lock=none,addr=192.168.0.54)
所以就我而言,它正确地尝试使用 nfsv3。
现在唯一要做的就是
在 /etc/autofs.conf 中激活调试
[root@vznfsclient nfs]# grep -i debug /etc/autofs.conf|grep -v "^#"
logging = debug
启用要发送到的调试严重性/var/log/messages
。/etc/rsyslog.conf
更改此
[root@vznfsclient nfs]# grep info /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none -/var/log/messages
至此(.info 至 .debug)
[root@vznfsclient nfs]# grep debug /etc/rsyslog.conf
*.debug;mail.none;authpriv.none;cron.none -/var/log/messages
重新启动 autofs 和 rsyslog,然后当你切换到自动挂载位置时,你应该会在/var/log/messages
这是我的测试系统的输出
Nov 25 03:06:00 vznfsclient automount[583]: attempting to mount entry /misc/nfs
Nov 25 03:06:00 vznfsclient automount[583]: lookup_mount: lookup(file): looking up nfs
Nov 25 03:06:00 vznfsclient automount[583]: lookup_mount: lookup(file): nfs -> -rw#011#011#011192.168.0.54:/nfs_export
Nov 25 03:06:00 vznfsclient automount[583]: parse_mount: parse(sun): expanded entry: -rw#011#011#011192.168.0.54:/nfs_export
Nov 25 03:06:00 vznfsclient automount[583]: parse_mount: parse(sun): gathered options: rw
Nov 25 03:06:00 vznfsclient automount[583]: parse_mount: parse(sun): dequote("192.168.0.54:/nfs_export") -> 192.168.0.54:/nfs_export
Nov 25 03:06:00 vznfsclient automount[583]: parse_mount: parse(sun): core of entry: options=rw, loc=192.168.0.54:/nfs_export
Nov 25 03:06:00 vznfsclient automount[583]: sun_mount: parse(sun): mounting root /misc, mountpoint nfs, what 192.168.0.54:/nfs_export, fstype nfs, options rw
Nov 25 03:06:00 vznfsclient automount[583]: mount_mount: mount(nfs): root=/misc name=nfs what=192.168.0.54:/nfs_export, fstype=nfs, options=rw
Nov 25 03:06:00 vznfsclient automount[583]: mount_mount: mount(nfs): nfs options="rw", nobind=0, nosymlink=0, ro=0
Nov 25 03:06:00 vznfsclient automount[583]: get_nfs_info: called with host 192.168.0.54(192.168.0.54) proto 6 version 0x40
Nov 25 03:06:00 vznfsclient automount[583]: get_nfs_info: called with host 192.168.0.54(192.168.0.54) proto 6 version 0x70
Nov 25 03:06:00 vznfsclient automount[583]: get_nfs_info: nfs v3 rpc ping time: 0.000366
Nov 25 03:06:00 vznfsclient automount[583]: get_nfs_info: host 192.168.0.54 cost 365 weight 0
Nov 25 03:06:00 vznfsclient automount[583]: get_nfs_info: called with host 192.168.0.54(192.168.0.54) proto 17 version 0x70
Nov 25 03:06:00 vznfsclient automount[583]: get_nfs_info: nfs v3 rpc ping time: 0.000507
Nov 25 03:06:00 vznfsclient automount[583]: get_nfs_info: nfs v2 rpc ping time: 0.000692
Nov 25 03:06:00 vznfsclient automount[583]: get_nfs_info: host 192.168.0.54 cost 599 weight 0
Nov 25 03:06:00 vznfsclient automount[583]: prune_host_list: selected subset of hosts that support NFS3 over TCP
Nov 25 03:06:00 vznfsclient automount[583]: mount_mount: mount(nfs): calling mkdir_path /misc/nfs
Nov 25 03:06:00 vznfsclient automount[583]: mount_mount: mount(nfs): calling mount -t nfs -s -o rw 192.168.0.54:/nfs_export /misc/nfs
Nov 25 03:06:00 vznfsclient automount[583]: spawn_mount: mtab link detected, passing -n to mount
Nov 25 03:06:00 vznfsclient automount[583]: mount(nfs): mounted 192.168.0.54:/nfs_export on /misc/nfs
Nov 25 03:06:00 vznfsclient automount[583]: ioctl_send_ready: token = 28
Nov 25 03:06:00 vznfsclient automount[583]: mounted /misc/nfs
答案2
答案3
首先,NFS 通常不太可靠,无法在服务器之间共享文件。如果 BoxB 重新启动,或者在 BoxA 处于活动挂载状态时变得不可用,那么问题就如同从正在运行的系统中拔出驱动器一样。各种情况都可能处于奇怪的状态。
您没有向我们提供太多有关您使用挂载的原因的信息,但请考虑 NFS 的替代方案。如果您能说明这样做的原因,我可能会建议替代方案。GFS、GlusterFS、rsync、lsyncd 或基于 HTTP(S) 的服务是可能至少在某些情况下适用的可能性。
至于您目前的情况,我猜想当 BoxB 停机时,您的安装上还留有一些东西,而服务器重启的重要部分是关闭正在运行的程序。如果是这样,那么您应该能够关闭两个盒子,然后启动 BoxA,然后启动 BoxB,安装应该仍然可以正常启动。如果我没记错的话,那么我认为 BoxA 上的日志比您与我们分享的 BoxB 上的日志更有意义。我也会查看安装表以寻找线索。