首先,我在 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 中正确启动挂载的顺序