【问题标题】:Passing a file descriptor through libvirt to qemu (C api)通过 libvirt 将文件描述符传递给 qemu (C api)
【发布时间】:2019-03-14 15:24:24
【问题描述】:

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

到目前为止,我发现了以下内容:

  • virDomainOpenGraphics
  • virDomainOpenGraphicsFD

遗憾的是,这些似乎对我没有帮助,因为它们仅用于图形,

  • virDomainCreateWithFiles
  • virDomainCreateXMLWithFiles

遗憾的是,这些也无济于事,因为根据文档,它们仅适用于基于容器的虚拟化技术。

任何我可以使用 libvirt API 将文件描述符传递给 qemu 的方式都很棒。除非有办法做到这一点,否则我可能不得不为 QEMU 编写一个完全自定义的后端,但是我的应用程序已经投入使用 libvirt 并且更改将是显着的。

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

【问题讨论】:

  • C 中的“文件描述符”是一个int,它标识使用open() 打开的文件。是这个意思吗?
  • 是的,编辑了问题以澄清,希望现在更容易理解。

标签: c virtualization qemu libvirt


【解决方案1】:

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

问题并没有说明为什么需要传递 FD - FD 是什么类型以及 QEMU 将用于什么用途。所以很难就下一步采取任何指导。

【讨论】:

  • 已编辑问题,以便其他人也可以看到详细信息,感谢您的反馈
  • 使用 LD_PRELOAD hack 描述的内容实际上不会被 libvirt POV 视为支持。虽然可以设置 env var 以通过 libvirt XML 加载预加载的库,但我们没有任何机制可以传入 FD 以供此使用。考虑到其 hacky 的性质,我们也不太可能添加新的 API 来解决这个问题。可能你需要让你的 LD_PRELOAD 直接打开它需要的套接字
  • 感谢@DanielB,我仍然需要一种机制来告诉库一些参数并使它们对其他进程保密,我想你是对的,它永远不会被支持,但我可以想象人们希望通过其应用程序中的文件描述符直接管理某些设备(例如虚拟串行端口端点)的情况。看到 libvirt 是一个库,并且已经在其中实现了传递文件描述符(出于图形目的),我不明白为什么不允许使用更通用的东西。
  • 接受了答案,但我觉得情况很糟糕:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多