我可以跨主机共享 /dev 下的设备吗?

我可以跨主机共享 /dev 下的设备吗?

情况是这样的。我在 VMware 服务器上有一个视频设备/dev/video0,我想从虚拟机内访问该设备。但是,无论出于何种原因,我无法将设备直接连接到虚拟机,它必须连接到主机。

由于在unix哲学下,一切实际上都只是一个文件,我可以在/dev两台主机之间使用NFS、Samba、sshfs或其他协议共享一个设备,以便一台服务器上的linux可以访问另一台服务器上的设备吗?

答案1

不。

您可以通过 NFS 或其他一些网络文件系统导出设备文件。但设备文件的含义取决于您打开它的机器。如果您/dev/video0通过 NFS 从服务器计算机导出到客户端计算机,则客户端计算机只会看到“字符设备 81:0”,并将其解释为自己的视频捕获设备。客户端计算机甚至不需要与服务器分配相同的设备编号;例如,OpenBSD 客户端会看到与伪终端驱动程序,因为这就是 char 81:0 在 OpenBSD 下的含义。

你所要求的会很好,但也很难。客户端上的每个请求都必须转发到服务器,反之亦然。个别司机必须得到具体的支持。例如,某些驱动程序依赖于进程和内核之间的共享内存,并且在许多情况下跨网络透明地支持将是困难的且昂贵的。我不知道视频捕获驱动程序是否确实使用共享内存,但考虑到它可能会异步传输大量数据,我希望它会这样做。

Linux 有一些特定的支持网络块设备。它们不依赖于网络文件系统;设备文件仅存在于客户端上,服务器上的守护进程模拟物理块设备(它可能将操作中继到真实物理设备或从真实物理设备中继,但通常它会读取和写入图像文件)。

您应该寻找特定于视频捕获的解决方案。尝试在物理设备所连接的计算机上运行尽可能多的数据密集型部分。或者找到一个支持从虚拟机内部直接访问物理设备的虚拟机解决方案(我不知道是否有主机/来宾解决方案支持;基于管理程序的解决方案更有可能支持)。

答案2

除了 Gilles 的回答之外 - 只要您不打算对文件进行 ioctl,它就只是一个流。所以如果你逃离了客人

# mkfifo /dev/fakevideo0
# ssh host cat /dev/video0 > /dev/fakevideo0

/dev/fakevideo0 将充当缓冲区,因此如果您从中读取,您将从相机获取流。

答案3

这并没有回答OP的问题,但有一个名为netevent的工具https://github.com/Blub/netevent它允许您共享位于/dev/input/event*机器之间的 ioctl 设备。我亲自尝试过,它对我有用。

相关内容