[zz]kvm-libvirt的使用:创建虚拟机与快照
1.创建域(虚拟机):包括Volume和描述硬件配置的xml
- //前端与节点建立连接
- Connect conn=new Connect("qemu+ssh://root@192.168.69/system",false);
- //根据xml描述创建新虚拟机并启动
- SAXReader reader = new SAXReader();
- Document docu =<span style="white-space:pre"> </span>reader.read(new File("/domain.xml"));
- String xmlDesc=docu.asXML();
- Domain domain=conn.domainCreateXML(xmlDesc, 0);
- domain.resume();
补:新建域可以直接加载镜像(.img),但这样镜像只能被一个用户使用。为可以让镜像能被多个用户使用,可使用StorageVol来关联镜像,虚拟机加载该备份即可。
- Connect con=new Connect("");
- //根据存储池的名字获得StoragePool
- StoragePool pool=con.storagePoolLookupByName("default");
- SAXReader reader=new SAXReader();
- Document docu=reader.read(new File("/volume.xml"));
- StorageVol vol=pool.storageVolCreateXML(docu.asXML(), 0);
记录下vol的存储地址,赋值到域的配置文件中即可。
删除vol
- StorageVol vol=pool.storageVolLookupByName(volName);
- vol.delete(0);
补:StorageVol可以作为镜像的快照,大小很小,只记录了对镜像的修改。
2.迁移/销毁域
- //前端与节点建立连接
- Connect conn1=new Connect("qemu+ssh://root@192.168.82.70/system",false);
- //根据域的uuid-unique id(在生成域时,libvirt自动分配唯一的uuid),返回域。
- String uuid="";
- Domain domain=conn1.domainLookupByUUIDString(uuid);
- Connect conn2=new Connect("qemu+ssh://root@192.168.82.71/system",false);
- /*
- * 把域从当前主机迁移到目的主机
- * Domain migrate(Connect dconn, long flags, String dname, String uri, long bandwidth)
- * dconn:目的主机
- * dname:可选,重命名域在目的机的名字
- * uri:可选,目的机ip
- * bandwidth:迁移带宽,Mbps
- */
- domain.migrate(conn2, 1, null, null, 5);
- //销毁域
- domain.destroy();
补:域的名字、id等信息都在xml配置描述里定义。对于xml文件的操作使用dom4j。
标准domain.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <domain type='kvm'>
- <name>test</name>
- <memory>524288</memory>
- <currentMemory>524288</currentMemory>
- <vcpu>1</vcpu>
- <os>
- <type arch='x86_64' machine='pc-0.14'>hvm</type>
- <boot dev='hd'/>
- <bootmenu enable='no'/>
- </os>
- <features>
- <acpi/>
- <apic/>
- <pae/>
- </features>
- <clock offset='localtime'/>
- <on_poweroff>destroy</on_poweroff>
- <on_reboot>restart</on_reboot>
- <on_crash>restart</on_crash>
- <devices>
- <emulator>/usr/bin/qemu-kvm</emulator>
- <disk type='file' device='disk'>
- <driver name='qemu' type='qcow2'/>
- <source file='/var/lib/libvirt/images/test.img'/><!--运行的镜像-->
- <target dev='vda' bus='virtio'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
- </disk>
- <interface type='network'>
- <mac address='52:54:00:19:25:7b'/>
- <source network='default'/>
- <model type='virtio'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
- </interface>
- <serial type='pty'>
- <target port='0'/>
- </serial>
- <console type='pty'>
- <target type='serial' port='0'/>
- </console>
- <input type='tablet' bus='usb'/>
- <input type='mouse' bus='ps2'/>
- <graphics type='vnc' port='5910' autoport='no' listen='0.0.0.0'/>
- <sound model='ac97'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
- </sound>
- <video>
- <model type='cirrus' vram='9216' heads='1'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
- </video>
- <memballoon model='virtio'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
- </memballoon>
- </devices>
- </domain>
标准volume.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <volume>
- <name></name>
- <key>/var/lib/libvirt/images/temp.ss</key>
- <source>
- </source>
- <capacity>8589934592</capacity>
- <allocation>139264</allocation>
- <target>
- <path>/var/lib/libvirt/images/temp.ss</path> <!--新卷的地址-->
- <format type='qcow2'/>
- <permissions>
- <mode>0600</mode>
- <owner>0</owner>
- <group>0</group>
- </permissions>
- </target>
- <backingStore>
- <path>/var/lib/libvirt/images/WinXP.img</path><!--关联的镜像-->
- <format type='qcow2'/>
- <permissions>
- <mode>0600</mode>
- <owner>107</owner>
- <group>107</group>
- </permissions>
- </backingStore>
- </volume>
补:dom4j使用示例
- SAXReader reader = new SAXReader();
- Document docu = reader.read(new File("/domain.xml"));
- //更改元素的属性值
- Element graphics=docu.getRootElement().element("devices").element("graphics");
- Attribute attrPort=graphics.attribute("port");
- attrPort.setText(getPort());
- //更改元素值
- Element nameEle=docu.getRootElement().element("name");
- nameEle.setText("new name");
- //以字符串形式返回xml
- String docXmlText=docu.asXML();