挂载网络共享并与挂载点中的现有文件合并


1

我有一个在Raspberry Pi 3(Raspbian Jessie)上运行的程序,它将文件放在一个名为的目录中 /mount-point。在启动时,我正在安装一个名为的Windows共享 /incoming/mount-point。有一个Windows程序正在处理这些文件,因为它们被放入共享中。

mount -t cifs -o username=<share user>,password=<share password> //<Win-IP>/c/incoming /home/pi/mount-point

如果网络出现故障,则会出现此问题。如果网络出现故障,linux程序会继续将文件丢入 /mount-point 目录。当网络重新启动时,将重新装入Windows共享以及当前所有文件 /mount-point 越过并消失。

有没有办法“合并挂载”Windows共享,以便当前的任何文件 /mount-point 不隐藏并出现在 /incoming 在窗户上?

Answers:


4

没有办法直接合并这样的挂载点的内容。最接近的选项是使用union / overly mount,但是那些不能与网络文件系统可靠地工作,在这种情况下你必须做的就是让它完全工作是非常不直观的。

理想情况下,您应该:

  1. 教你的程序检测共享是否已挂载,然后让它在未挂载共享时缓存文件,然后将其写出来。
  2. 让您的程序将数据写入单独的位置,并使用周期性任务(使用cronjob或systemd计时器)将文件复制到共享(如果已安装)。

这两种情况都比union mount更强大,并且它们都与底层存储配置更加不可知(这对于可维护性来说是一件好事)。


感谢您的回复。两者都是很好的建议,不幸的是,时间是处理文件的一个因素。
S May

1
我想我会编写一个bash脚本,尝试从/ mount-point复制任何文件,重新连接共享,然后尝试将文件复制回新的/挂载点共享。谢谢您的帮助!
S May

@AustinHemmelgarn你确定AUFS无法正确处理SMB支持的联合挂载 - 从我的谷歌搜索它似乎应该可以正常工作?
davidgo

@davidgo我对AUFS(但不是OverlayFS,它是上游)不正确,但这也需要构建和加载第三方模块,并且还有其他问题,即它仍然需要通过某些东西进行额外跟踪,会以有趣的方式失败如果其中一个分支脱机,并且没有提供从Pi的文件系统中删除本地副本的简单方法。最后一点虽然提出了一些我没有想过的东西,也就是说将文件从Pi共享到Windows可能会更好,而不是像目前的情况那样。
Austin Hemmelgarn

0

以某种方式安装东西是可能的(但有些麻烦),所以 Linux的 看到同一目录中的本地和远程文件。但是,您的Windows只会看到Windows端存在的文件。

如果您告诉程序将文件移动到 /mount-point/some-dir/ 相反,哪个 不存在 如果没有安装共享,它可能会或可能不够智能,以后再尝试。如果它足够聪明,这可能是最简单的解决方法。

如果它不够智能,让它将文件移动到 另一个目录 并运行一个cron作业将文件移动到共享中。让它足够聪明。简单 mv 如果目标目录不存在将中止。


2
而不是在Windows共享中创建一个子目录(当安装共享时它将出现在挂载点下),它可能已经足够好了 chmod 潜在的 /mount-point 目录到555(即,未安装共享时执行此操作)。这也会导致在未挂载共享时移动操作失败(除非程序正在运行特权)。
Scott
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.