Failure to automatically mount a NFS after reboot

当然这是NFS客户端的问题,服务端不存在这个问题。所有需要挂载NFS服务端开放的网络系统资源的机器都是NFS客户端。

假设你有一台机器 172.168.0.22master.nfs.local.org)开放了/share可供172.168.0.0/255.255.255.0 子网中的机器使用。在子网任意一台机器上

showmount -e 172.168.0.22
## or
showmount -e master.nfs.local.org

即可查看到所有22号机器开放的系统资源,/share将在其中。我们使用mount 172.168.0.22:/share /mnt将该网络资源挂载到本地使用。通常为了保证使用的持续性,我们会将这种NFS系统资源挂载写进/etc/fstab中,目的是机器重启后将自动完成类似挂载,下面是追加到/etc/fstab中的信息

172.168.0.22:/share /mnt nfs defaults 0 0
## or 
master.nfs.local.org:/share /mnt nfs defaults 0 0

默认情况下这种挂载方式在机器启动时将由automounter按照type nfs4 (rw,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys)参数尝试挂载(数据来源Ubuntu系统)。

问题是这种默认挂载未必都能成功而且可能会阻塞系统正常启动,理由如下:

  • 启动时网络服务不可用

系统重启时各种服务都要重新加载和配置,加上软硬件上的延迟,很难保证当我们尝试挂载NFS资源的时候系统的网络服务已经就绪。这将导致机器无法访问网络资源,即使是内网。我们可以给mount添加_netdev参数,迫使机器在自身网络服务可用的时候再尝试获取NFS资源。

_netdev

The filesystem resides on a device that requires network access (used to prevent the 
system from attempting to mount these filesystems until the network has been enabled on the system). 

在默认设置下,如果出现请求NFS资源前机器的网络服务尚未就绪,请求NFS资源的客户机将无限等待,机器的网络服务也永不可能就绪,机器陷入死锁,无法启动。

  • 启动时网络资源不可用

这个问题在机房断电的时候应该是最容易碰到的。复电后所有机器同时上电启动,那么机器启动时候尝试挂载NFS网络资源的时候很可能NFS服务端机器还没有完成启动或启动失败,客户机将不能一次性完成NFS资源的挂载。我们这里假设 启动时网络服务不可用 的问题不存在。

启动时尝试挂载NFS资源而NFS资源暂时没有就绪不是大问题,因为在默认设置下所有客户机会不停询问NFS服务端是否就绪、NFS资源是否可用,当客户端与服务端建立链接并顺利挂载了资源客户端将继续初始化其他服务来完成系统启动。所以,当NFS服务端还没有完成启动、NFS资源还没有准备好的时候,所有客户机只是等待,直到服务端启动完毕且客户端从服务端拿到数据为止,但客户机最终能够顺利完成启动。

如果时服务端启动失败,那NFS资源将永不可用,在默认设置下所有机器将陷入无尽等待,整个集群将无法正常工作。

我们需要为NFS挂载服务设置 soft, bg参数,目的是让让客户机只执行有限次尝试,如果在有限次尝试中挂载失败,将挂载尝试转为后台任务继续尝试,而前台程序将能够继续往下执行而不受阻塞。

soft / hard

Determines the recovery behavior of the NFS client after an NFS request times out.  
If neither option is specified (or if the hard option is specified), NFS requests are 
retried indefinitely.  If the soft option is  specified, then the NFS client fails an NFS 
request after retrans retransmissions have been sent, causing the NFS client to return 
an error to the calling application.
bg / fg

Determines how the mount(8) command behaves if an attempt to mount an export fails.  
The fg option causes mount(8) to exit with an error status if any part of the mount request 
times out or fails outright.  This is called a "foreground" mount, and is the default behavior 
if neither the fg nor bg mount option is specified.                                                                                                                

If the bg option is specified, a timeout or failure causes the mount(8) command to fork 
a child which continues to attempt to mount the export.  The parent immediately 
returns with a zero exit code.  This is  known as a "background" mount.

If  the local mount point directory is missing, the mount(8) command acts as if the 
mount request timed out.  This permits nested NFS mounts specified in /etc/fstab 
to proceed in any order during system initializa‐ tion, even if some NFS servers are 
not yet available.  Alternatively these issues can be addressed using an automounter 
(refer to automount(8) for details).    

所以为了让机器在NFS资源不可用,网络服务不可用的情况下能够先顺利开机(这样才能ssh管理),我们可以将默认的NFS资源挂载参数改成如下设置:

172.168.0.22:/share /mnt nfs defaults,_netdev,soft,bg,intr 0 0

Ref.

  • Solving NFS Mounts at Boot Time
  • Failure to automatically mount a NFS area consistently after a reboot
  • Systemd: When to use _netdev mount option?

你可能感兴趣的:(Failure to automatically mount a NFS after reboot)