如何通过SSHFS使用inotify或命名管道?


12

谢谢sshfs魔术,我可以使用以下命令从远程服务器挂载主目录

sshfs user@server:/home/user ~/remote

乐观,我想我会设置一个本地inotify-hook~/remote/logFile(在sshfs安装),因此本地程序可以对远程日志的变化作出反应。

cd ~/remote
touch logFile                                # create remote file
inotifywait logFile &                        # set up local inotify-hook
ssh user@server -x touch /home/user/logFile  # touch file from remote

什么都没发生inotifywait除非我touch在本地将文件设为静音。类似地,写入命名管道失败。

为什么是这样?
我如何弥合这一差距?

可以inotifywait在远程上运行,破解文件系统更改序列化策略并维持与本地的连接,但是我基本上是在重新实现SSHFS。它完全杀死了抽象。


2
我认为inotify本地系统上没有任何方法可以检测到远程文件系统上的更改。这些更改使本地内核脱离了循环。您需要inotifywait在服务器而不是客户端上运行。
Barmar 2014年

@Barmar但是客户端(本地计算机)将不知道更改。我进行了编辑,以补充一点。
Anko 2014年

通常,网络文件系统无法提供完全的透明性,它们经常破坏抽象。所需要的是对SSHFS的增强-当您在本地运行inotify时,它需要将请求发送到服务器,该服务器在该服务器上运行inotify,并将通知传递回客户端。
Barmar 2014年

你检查过gamin吗?
Janus Troelsen

@JanusTroelsen我还没有听说过gamin。根据其概述页面,它也使用inotify。通过网络分发此类更新有用吗?
Anko

Answers:


10

SSHFS文件系统是建立在SFTP协议之上的。SFTP仅提供以“经典”方式处理文件的功能;客户端向服务器发出请求(列出目录,上传文件等),然后服务器做出响应。该协议中没有任何工具可以让服务器自发通知客户端发生了什么事情。

这使得无法在SSHFS内部提供诸如inotify的功能。可以通过专有扩展来扩展SSHFS,或者以成熟的SSH连接对其进行补充;但我不知道对SSHFS的任何此类扩展。

出于相同的原因,命名管道不能在SSHFS之上实现。NFS,经典的网络文件系统,也没有任何设施来支持名为管道的跨机器。在网络文件系统上,命名管道在安装了该文件的每台机器(除了服务器)上创建一个独立的通信点。

FAM(已移植到Linux的SGI IRIX中的inotify类似物)提供了一个守护程序,该守护程序允许通过网络发送通知。自从inotify出现以来,Linux已经相当不推荐使用FAM,所以我不知道运行FAM是否比滚动自己的应用程序特定通知系统更容易。您需要通过SSH设置一些端口转发或建立VPN,以保护FAM和NFS的网络链接。

如果您选择自己动手,假设可以为客户端提供外壳程序访问权限,则代表客户端运行inotify监视器相当容易:让客户端打开SSH连接,然后inotifywait在服务器上运行命令,在客户端上解析其输出。您可以设置主连接,以便更快地打开从同一客户端到同一服务器的许多连接。


1
至少qemu支持某种跨机器管道:虚拟访客的管道
Janus Troelsen
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.