我正在使用 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]
部分,唯一的区别是现在 dolphin 在 5 秒后放弃并自行关闭。
答案1
我能够重现这个问题。似乎有多个问题在起作用。 NFS 本身、systemd 和网络堆栈都存在问题。自动挂载的东西并不是真正为瞬态条件而设计的。也许它可以被黑客攻击以更好地工作,我不知道。反正...
显示了暴力方法这里。基本上,不要使用自动挂载,而是从 cron 持续 ping 服务器并根据其状态挂载或卸载。
我的实验中的另一种方法可以用来networkd-dispatcher
自动安装和卸载。事件脚本检测服务器或网络并采取相应的行动。
为安装创建 fstab(或您喜欢的任何方法)。至少设置为“noauto”。
在 处创建以下脚本/etc/networkd-dispatcher/routable.d/10-nfs-pool1
。标记可执行文件(我猜)。
#!/bin/sh
if ping -q -c1 nfs-server >/dev/null; then
mount /pool1
else
umount -f -l /pool1
fi
现在在 off.d 和 no-carrier.d 中复制该文件:
ln -s ../routable.d/10-nfs-pool1 /etc/networkd-dispatcher/off.d/
ln -s ../routable.d/10-nfs-pool1 /etc/networkd-dispatcher/no-carrier.d/
不幸的是,上述两种方法即使在不使用时也会使安装保持活动状态。自动挂载的问题是,当您开始手动管理挂载时,自动挂载就会被禁用。自动挂载似乎可以使用更多功能,但也许我只是不了解它们。