一个 LXC 容器内 smb 共享断线重连问题的解决方案

2023-03-17 00:37:51 +08:00
 zx900930

系统 PVE, 给 jellyfin 的 LXC 容器里用 fstab 挂载了 smb 共享.

问题是经常断连, 出现 Resource temporarily unavailable 的问题.

排查后发现是 pve 用 snapshot 模式备份的时候, 会 freeze 那个提供 smb 共享的 vm, 此时 LXC 无法访问 smb 共享, 等到备份完成后, 也不会自动重连.

而且最近又因为 ISP 突然断网导致同样的症状出现, 为了不用每次都手动 umount mount, 决定解决这个问题.

试过几个解决方案

  1. x-systemd.automount, 这个方案在 LXC 容器内行不通, lxc 也明确说了 won't fix.
  2. 用脚本检测连接状态并重新挂载, 确实可行, 但是有时候会出现 Resource busy 的问题, 断线判断逻辑也不好写, 经常 false positive 然后主动断开重连导致看到一半突然中断.
  3. 宿主机用 automount 挂载, 然后 bind mount 到 LXC 容器里. 这个非常奇怪, LXC 容器的读写并不会 trigger 宿主机的 automount, 导致 idle timeout 过后它判断没有读写自己就取消挂载了.

最后采用的办法就是 systemd 自己写 mount file 比如要挂载 //10.10.10.1/media 到 /media 下 先写 unit file:

nano /etc/systemd/system/media.mount
[Unit]
Description=samba mount media
Requires=network-online.target
After=network-online.service

[Mount]
What=//10.10.10.1/media
Where=/media
Options=vers=3.1.1,credentials=/home/.smbcred,file_mode=0777,dir_mode=0777,iocharset=utf8
Type=cifs

[Install]
WantedBy=multi-user.target

ver 可以不用写, 默认是 3.0 我这里写 3.1.1 是因为 smb 服务器用的最新的 winserver 2022, 想用几个新的功能. 用户名密码我放到 /home/.smbcred 里给了 600 权限. 共享文件权限直接给了 777, 反正都是影音文件不是很重要, 大家可以根据自己的需要去调整.

还有如果你要挂载到 /mnt/abc_def 之类的目录下, unit file 名称里路径的 /要用-代替, 比如 /etc/systemd/system/mnt-abc_def.mount

然后启用并且运行这个服务就可以了

systemctl enable media.mount
systemctl start media.mount

测试过无论是 snapshot 备份, 还是直接关闭 smb 服务器再重开, 或者断开网络连接再重新连接, 挂载的 smb 共享文件夹都可以正常断线重连了.

VM 里用 fstab 挂载不会出现这个问题, 只有 LXC 容器会出现这个问题, 可能是跟一些安全机制有关吧.

1682 次点击
所在节点    NAS
1 条回复
ltkun
2023-03-17 06:04:36 +08:00
备份没那么勤快 lxc 一般直接 bind mount 宿主机的目录 设置为不备份

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/924695

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX