我目前正在开发一段代码来创建一个libvirt KVM域。目前,脚本处于工作状态,但我不满意我必须做的事情。就目前而言,我必须使用PHP绑定加载域XML,手动更改它,然后取消定义并重新定义域,全部更改域类型和VNC地址。我想知道是否有更好的替代方式,我在下面的方式(我不满意的代码是在第5和第6行)。我觉得PHP绑定文档非常缺乏,这就是为什么我还没有找到解决这个问题的原因。我知道我应该能够做我想做的事情,因为virt-manager可以做到。
$vnc = "PGdyYXBoaWNzIHR5cGU9J3ZuYycgcG9ydD0nLTEnIGF1dG9wb3J0PSd5ZXMnIGxpc3Rlbj0nMC4wLjAuMCcgcGFzc3dkPSdfX1BBU1NfXyc+CiAgICAgIDxsaXN0ZW4gdHlwZT0nYWRkcmVzcycgYWRkcmVzcz0nMC4wLjAuMCcvPgogICAgPC9ncmFwaGljcz4="; // VNC config (base64)
$dom = libvirt_domain_lookup_by_name($c, $command['parameters']['name']); // Get domain resource
setBridge($dom, $command['parameters']['networks'][0]['mac']); // Replace network configuration with an interface bridge
setISO($dom, "/var/lib/libvirt/ISOs/Win7Pro.iso"); // Set the CD-ROM ISO
$xml = libvirt_domain_get_xml_desc($dom, null); // Get XML
domain_change_xml($c, $dom, str_ireplace("<domain type='qemu'>", "<domain type='kvm'>", str_ireplace("<graphics type='vnc' port='-1' autoport='yes'/>", str_ireplace("__PASS__", rand(10000000, 99999999), base64_decode($vnc)), $xml))); // Replace domain type and graphics block
libvirt_domain_create($dom); // Start the domain
function setBridge($dom, $mac) {
libvirt_domain_update_device($dom, "<interface type='bridge'><mac address=".escapeshellarg($mac)."/><source bridge='br0'/><model type='e1000'/></interface>", VIR_DOMAIN_DEVICE_MODIFY_CONFIG);
}
function setISO($dom, $iso) {
libvirt_domain_update_device($dom, "<disk type='file' device='cdrom'><driver name='qemu' type='raw'/><source file=".escapeshellarg($iso)."/><target dev='hdc' bus='ide'/><readonly/></disk>", VIR_DOMAIN_DEVICE_MODIFY_CONFIG);
}