我正在使用 systemd 在带有 Arch 的笔记本上自动挂载 NFS 分区。
问题:
如果 dolphin 在关闭时打开了 NFS 共享的文件夹并且我更改了网络,它会在我下次启动时拒绝打开。
zsh 和其他软件有时也会发生同样的情况。
只有当我连接到除常用网络之外的任何网络并且不使用我的 VPN 或根本未连接到任何网络时,才会出现此问题。只要我的系统可以访问 NFS 服务器,一切都会顺利进行。
当前解决方法:
目前我正在通过停止自动挂载单元并再次启动应用程序来规避这个问题。
以下是相关的单元文件:
/etc/systemd/system/pool1.automount
内容:
[Unit]
Description=Automount NFS pool1
Requires=NetworkManager.service
After=network-online.target
[Automount]
Where=/pool1
TimeoutIdleSec=10min
[Install]
WantedBy=multi-user.target
/etc/systemd/system/pool1.mount
内容:
[Unit]
Description=Mount NFS pool1
[Mount]
What=192.168.1.5:/pool1
Where=/pool1
Type=nfs
Options=soft,async
我确信有一个选项可以告诉 systemd 仅在共享存在时才尝试挂载,但我还没有找到任何关于它的信息。
如果 NFS 服务器不存在,我正在寻找一种可以无缝处理不同网络而不会出现任何延迟的解决方案。
更新
我已经添加TimeoutSec=5
到该[Mount]
部分,唯一的区别是现在海豚在 5 秒后放弃并自行关闭。
我能够重现问题。似乎有多个问题在起作用。NFS 本身、systemd 和网络堆栈都有问题。自动挂载的东西并不是真正为瞬态条件设计的。也许它可以被黑客攻击以更好地工作,我不知道。反正...
此处显示了一种蛮力方法。基本上,不要使用自动挂载,而是从 cron 连续 ping 服务器并根据其状态挂载或卸载。
我实验的另一种方法可以用来
networkd-dispatcher
自动挂载和卸载。事件脚本检测服务器或网络并采取相应措施。为挂载创建 fstab(或您喜欢的任何方法)。至少设置为“noauto”。
在
/etc/networkd-dispatcher/routable.d/10-nfs-pool1
. 标记可执行文件(我猜)。现在将该文件复制到 off.d 和 no-carrier.d 中:
不幸的是,即使在不使用挂载时,上述两种方法都会保持挂载处于活动状态。自动挂载的问题是当您开始手动管理挂载时,自动挂载被禁用。Automount 似乎可以使用更多功能,但也许我只是不知道它们。