云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

域名交易_阿里云重庆云栖_好用

小七 141 0

DigitalOcean的开源:介绍go qemu和go libvirt

在DigitalOcean,我们使用libvirt和QEMU来创建和管理组成我们Droplet产品的虚拟机。QEMU是一款能让数百个液滴在我们数据中心内的一台服务器上运行的主力。为了执行管理操作(比如关闭一个液滴),我们最初构建了依赖于"virsh"的自动化,virsh是一个用于与libvirt交互的命令行客户机守护进程。作为我们开始部署投入生产,我们意识到我们将需要简单而强大的积木为未来的液滴管理工具。特别是,我们想要包裹考虑周全,有大量文档的惯用api没有使用cgo来简化我们的构建管道并允许轻松的交叉编译直接与QEMU监视器套接字交互以实现最大限度的控制我们开发了几个用于管理libvirt和QEMU的开源包,但是没有一个能够完全满足我们的需要,所以我们创造了我们自己的:去吧-凯姆,怎么了QEMU和QEMU一起工作吗?QEMU在Drops和我们的裸机服务器之间提供了硬件仿真层。每个QEMU进程在UNIX或TCP套接字上提供一个jsonapi,很像您在使用web服务时可能发现的restapi。然而,它没有使用HTTP,而是通过一种称为QEMU监控协议(QMP)的协议进行通信。当您请求一个操作时,比如关闭一个液滴,请求最终会通过QMP套接字以`{"execute":"system_powerdown"}`的形式到达QEMU进程。go QEMU是一个go包,它提供了一个通过QMP与QEMU实例通信的简单接口。它可以使用VM的监视器套接字或通过libvirt代理请求,直接实现对QEMU虚拟机的管理。所有的qemu交互依赖于qemu.域以及质量管理计划监视器类型。Aqemu.域是用一个质量管理计划监视器,它了解如何与给定的嗯,怎么了libvirt和go libvirt工作吗?libvirt是为客户机-服务器通信而设计的。用户通常通过命令行客户端"virsh"与libvirt守护进程交互。`virsh`通过本地UNIX套接字或TCP连接与守护进程建立连接。通信遵循一个定制的异步协议,根据该协议,每个RPC请求或响应前面都有一个描述传入负载的报头。最值得注意的是,报头包含一个过程标识符(例如,"start domain"),请求的类型(例如,"call"或"reply"),以及用于将RPC调用与其各自的响应关联起来的唯一序列号。头后面的有效负载是XDR编码的,提供了一种与体系结构无关的方法来描述严格的数据类型。go-libvirt是一个Go包,它为libvirt提供了一个纯Go接口。go-libvirt可以与go-qemu结合使用,通过libvirt代理通信来管理vm守护程序.go-libvirt利用RPC协议的可用性与libvirt通信,而不需要cgo和C绑定。虽然预先使用libvirt的C绑定会更容易,但我们尽量避免使用cgo。戴夫·切尼写了一篇优秀的博客文章,反映了我们自己的许多发现。纯Go库简化了我们的构建管道,减少了依赖性问题,并保持了交叉编译简单。通过绕过C库,我们需要密切关注libvirt新版本中的变化;libvirt开发人员可能随时修改RPC协议,这可能会破坏libvirt。为了确保与libvirt的各种版本的稳定性和兼容性,我们在Travis CI中安装并运行它,这样就可以为每个新提交运行集成测试-libvirt.示例下面的代码演示如何使用go qemu和go libvirt与给定hypervisor上的所有libvirt管理的虚拟机交互"时间"github.com/digitalocean/go-qemu/hypervisor")func main(){驱动程序:=hypervisor.NewRPCDriver(函数()(网络连接,错误){return网络拨号超时("unix","/var/run/libvirt/libvirt sock",二*时间。秒)})高压:=管理程序。新的(司机)正式印刷品("域\t\tQEMU版本")正式印刷品("-------------------------------------")域,错误:=高压域()如果出错!=零{日志。致命(err)}for,dom:=range domains{version,错误:=dom.版本()如果出错!=零{日志。致命(错误)}正式印刷品("%s\t\t%s\n",dom.名称,版本)多姆。关门()}}````输出``[php]{`Droplet-12.7.0dropet-2 2.6.0dropet-3 2.5.0````下一步是什么?goqemu和go-libvirt仍在积极开发中,将来我们打算提供一个可选的cgoqmp监视器,它使用libvirtgo包装libvirt C API程序包.go-qemu和go-libvirt在DigitalOcean的生产中使用,但原料药应视为不稳定,我们建议这些软件包的用户将它们提供给应用程序。我们欢迎大家为项目捐款!事实上,goqemu项目最近的一个主要特性是由DigitalOcean以外的一位工程师贡献的。davidanderson正在研究一种使用goqemu中的QMP规范自动生成QMP结构的方法。这将节省大量繁琐的开发,并使贡献者能够简单地将这些原始类型包装在更高级别的类型中,从而提供一个更惯用的接口来与QEMU交互实例。如果你想加入这个游戏,随时打开一个GitHub请求,提交一个问题,或者加入我们的IRC(freenode/#go qemu)通过IRC通道中的用户"eskultet",libvirt确实保证了API和ABI的稳定性,RPC层能够检测到任何额外的或丢失的元素,这些元素会导致RPC负载不满足固定大小的要求。本博客已更新,以反映这种误解。作者:Matt Layer&Ben LeMasurier