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

Jos*_*osh 6 nfs devices

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

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

Gil*_*il' 9

不。

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

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

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

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

  • @Christian 一些较旧的 Unix 系统具有无法正确处理二进制数据的文本处理工具,但我怀疑这是否适用于 `cat`,无论如何`cat` 将适用于所有当前系统。GNU 实用程序(Linux 上的实用程序)始终正确处理二进制数据,这从一开始就是一个设计目标。对二进制数据使用 `dd` 是从磁带时代继承下来的习惯;在当代 Linux 系统上,它不仅是一个不必要的复杂化,它甚至趋于 [慢](http://unix.stackexchange.com/questions/12532/dd-vs-cat-is-dd-still-relevant-这些天/12538#12538)。 (2认同)