Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过libvirt将文件描述符传递给qemu(C api)_C_Virtualization_Qemu_Libvirt - Fatal编程技术网

通过libvirt将文件描述符传递给qemu(C api)

通过libvirt将文件描述符传递给qemu(C api),c,virtualization,qemu,libvirt,C,Virtualization,Qemu,Libvirt,正如标题所说,我正在寻找一种方法,通过libvirtapi将C风格的文件描述符(int,我的应用程序使用socketpair,我需要传递一个文件描述符)传递到启动的QEMU进程 到目前为止,我发现了以下几点: virDomainOpenGraphics virDomainOpenGraphicsFD 可悲的是,这些似乎对我没有帮助,因为它们只用于图形 virDomainCreateWithFiles virDomainCreateXMLWithFiles 可悲的是,这些也没有帮助,因为根

正如标题所说,我正在寻找一种方法,通过libvirtapi将C风格的文件描述符(int,我的应用程序使用socketpair,我需要传递一个文件描述符)传递到启动的QEMU进程

到目前为止,我发现了以下几点:

  • virDomainOpenGraphics
  • virDomainOpenGraphicsFD
可悲的是,这些似乎对我没有帮助,因为它们只用于图形

  • virDomainCreateWithFiles
  • virDomainCreateXMLWithFiles
可悲的是,这些也没有帮助,因为根据文档,它们只适用于基于容器的虚拟化技术

任何使用libvirtapi将文件描述符传递给qemu的方法都非常好。除非有办法做到这一点,否则我可能不得不为QEMU编写一个完全定制的后端,但是我的应用程序已经投入使用libvirt,而且这一变化将是巨大的


编辑:文件描述符将是一个套接字,它不是QEMU直接使用的,我有一个LD_预加载的库,当QEMU试图读/写特定磁盘时,它将使用这个套接字进行一些就地攻击。“黑客”在每台机器和每次运行的基础上都会有所不同,将这些信息写入每个虚拟机的磁盘会使存储系统负担过重,并导致我无法承受的严重减速。

除了virDomainOpenGraphics的特殊情况,libvirt通常不希望应用程序需要传入预打开的文件描述符。相反,应用程序告诉libvirt QEMU需要访问哪些资源,如果合适,libvirt将打开资源并将其文件描述符传递给QEMU,而应用程序不需要关心这些低级细节


问题并不是说你为什么需要通过FD——什么样的FD以及QEMU将使用它做什么。因此,很难对下一步操作给出任何指导。

C中的“文件描述符”是一个
int
,用于标识使用
open()
打开的文件。这就是你的意思吗?是的,编辑这个问题是为了澄清,希望现在更容易理解。编辑这个问题,让其他人也能看到细节,感谢反馈。LD_预加载黑客所描述的内容实际上是libvirt POV不支持的。虽然可以通过libvirt XML设置env var来加载预加载的库,但我们没有任何机制来传递FD以供使用。考虑到它的黑客特性,我们也不太可能添加新的API来解决这个问题。可能你需要让你的LD_预加载直接打开它需要的套接字Hanks@DanielB,我仍然需要一个机制来告诉库一些参数,并对其他进程保密,我想你是对的,它从未被支持用于此目的,但我可以想象人们希望通过应用程序中的文件描述符直接管理某些设备的情况(例如,虚拟串行端口端点)。鉴于libvirt是一个库,并且传递文件描述符已经在其中实现(出于图形目的),我不明白为什么不允许使用更通用的东西。我接受了答案,但我觉得情况很糟糕:(