16.04 启动时 nfs 挂载问题

16.04 启动时 nfs 挂载问题

首先,我在 ubuntu 14.04 中拥有相同的环境并且运行正常。

我想在启动时挂载 NFS。此 NFS 将包含 /etc/apache2 和其他配置文件夹。因此,我的 fstab(在 14.04 中运行)如下所示:

X.X.X.X:/share_NFS         /mnt/nas        nfs   auto,nolock,soft,intr,nfsvers=3,tcp,bg,rw      0       0

然后,我像这样绑定每个想要在 NFS 中挂载的文件夹:

/mnt/nas/config/apache2         /etc/apache2            none    auto,rbind,defaults     0       0
/mnt/nas/config/php5            /etc/php5               none    auto,rbind,defaults     0       0
/mnt/nas/config/logrotate.d     /etc/logrotate.d        none    auto,rbind,defaults     0       0
/mnt/nas/config/postfix         /etc/postfix            none    auto,rbind,defaults     0       0
/mnt/nas/www                    /var/www                none    auto,rbind,defaults     0       0

问题出在我启动机器的时候。有时它能正确安装,有时却不能。如果我重新启动机器,有 25% 的概率 NFS 无法正确安装。如果我重新启动,mount -a它就能正常安装。

我几乎可以肯定存在 systemd 问题。我发现 systemd 中的 NFS 和 remote-fs.target 依赖项存在很多问题和一些错误。但任何人都有明确的解决方案。例如,我更改了 remote-fs.target 的一些依赖项,只是为了要求 network-online,但这对我来说不起作用。

我认为这是一个关于 systemd 如何启动 remote-fs.target 和 NFS 的问题。

我注意到,对于 /etc/fstab 的每个挂载点,systemd 都会生成一个以 .mount 结尾的单元。因此,如果我查找这些单元:

systemctl show mnt-nas.mount

我看到了这个:

Names=mnt-nas.mount
Requires=system.slice -.mount
Wants=network-online.target
RequiredBy=etc-logrotate.d.mount etc-php5.mount remote-fs.target var-www.mount etc-apache2.mount etc-postfix.mount
Conflicts=umount.target
Before=etc-logrotate.d.mount umount.target etc-php5.mount remote-fs.target var-www.mount etc-apache2.mount etc-postfix.mount
After=systemd-journald.socket remote-fs-pre.target system.slice network.target -.mount network-online.target
RequiresMountsFor=/mnt

有人遇到过这个问题吗?有人在启动时安装 NFS 时遇到过这种行为吗?如果有,您是如何解决的?

答案1

好吧,我终于解决了这个问题。

在这种情况下,我遇到了两个问题:

  • 默认情况下,remote-fs.target 不依赖于 network-online.target。这是社区报告的已知“错误”。因此,这就是为什么它有时有效,有时无效(取决于挂载 nfs 时以太网是否有链接)。

  • 第二个问题,就我而言,我在挂载 NFS 之后挂载 rbinds。rbinds 的来源是 NFS 挂载点的文件夹(因此,很明显它必须稍后挂载)。当 systemd 为 fstab 的每个挂载点生成“.mount”单元文件时,所有 rbinds 都依赖于 local-fs.target。当然,在这种情况下这是一个问题,因为它可以在 nfs 挂载点(remote-fs.target)之前挂载 rbinds(local-fs.target)。

因此,为了解决这个问题我采取了以下措施:

  • 首先,我编辑了文件 /lib/systemd/system/remote-fs-pre.target 并添加:

    想要=网络在线.目标

    之后=网络在线.目标

  • 然后,在 /etc/fstab 中我向 NFS 挂载点指示了下一个选项:

    XXXX:/nfs_share /mnt/nas nfs _netdev,noauto,x-systemd.automount,nolock,soft,intr,nfsvers=3,tcp,bg,rw 0 0

最后,我们向 systemd 指出 rbinds 是网络设备(因此,systemd 会将它们放在 remote-fs.target 上),并且我还指出必须严格挂载 /mnt/nas。

/mnt/nas/config/php /etc/php 无 noauto,_netdev,x-systemd.automount,x-systemd.requires=/mnt/nas,rbind,默认值 0 0

通过此更改,我修复了在 systemd 中正确启动挂载的顺序

相关内容