backport patch from master to 2.1.x, to solve the vm don't boot on latest fedora.

This commit is contained in:
edison 2010-09-02 16:21:15 -07:00
parent a6ec285114
commit c9d6ac7082
2 changed files with 37 additions and 19 deletions

View File

@ -2091,12 +2091,12 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
isoPath = isoVol.getPath();
diskDef iso = new diskDef();
iso.defFileBasedDisk(isoPath, "hdc", diskDef.diskBus.IDE);
iso.defFileBasedDisk(isoPath, "hdc", diskDef.diskBus.IDE, diskDef.diskFmtType.RAW);
iso.setDeviceType(diskDef.deviceType.CDROM);
isoXml = iso.toString();
} else {
diskDef iso = new diskDef();
iso.defFileBasedDisk(null, "hdc", diskDef.diskBus.IDE);
iso.defFileBasedDisk(null, "hdc", diskDef.diskBus.IDE, diskDef.diskFmtType.RAW);
iso.setDeviceType(diskDef.deviceType.CDROM);
isoXml = iso.toString();
}
@ -2148,9 +2148,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
diskDef disk = new diskDef();
String guestOSType = getGuestType(vmName);
if (isGuestPVEnabled(guestOSType)) {
disk.defFileBasedDisk(sourceFile, diskDev, diskDef.diskBus.VIRTIO);
disk.defFileBasedDisk(sourceFile, diskDev, diskDef.diskBus.VIRTIO, diskDef.diskFmtType.QCOW2);
} else {
disk.defFileBasedDisk(sourceFile, diskDev, diskDef.diskBus.SCSI);
disk.defFileBasedDisk(sourceFile, diskDev, diskDef.diskBus.SCSI, diskDef.diskFmtType.QCOW2);
}
String xml = disk.toString();
return attachOrDetachDevice(attach, vmName, xml);
@ -2931,11 +2931,11 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
String datadiskPath = tmplVol.getKey();
diskDef hda = new diskDef();
hda.defFileBasedDisk(rootkPath, "hda", diskDef.diskBus.IDE);
hda.defFileBasedDisk(rootkPath, "hda", diskDef.diskBus.IDE, diskDef.diskFmtType.QCOW2);
disks.add(hda);
diskDef hdb = new diskDef();
hdb.defFileBasedDisk(datadiskPath, "hdb", diskDef.diskBus.IDE);
hdb.defFileBasedDisk(datadiskPath, "hdb", diskDef.diskBus.IDE, diskDef.diskFmtType.RAW);
disks.add(hdb);
return disks;
@ -2970,25 +2970,24 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
diskDef hda = new diskDef();
hda.defFileBasedDisk(rootVolume.getPath(), "hda", diskBusType);
hda.defFileBasedDisk(rootVolume.getPath(), "hda", diskBusType, diskDef.diskFmtType.QCOW2);
disks.add(hda);
/*Centos doesn't support scsi hotplug. For other host OSes, we attach the disk after the vm is running, so that we can hotplug it.*/
if (dataVolume != null) {
diskDef hdb = new diskDef();
hdb.defFileBasedDisk(dataVolume.getPath(), "hdb", diskBusType);
hdb.defFileBasedDisk(dataVolume.getPath(), "hdb", diskBusType, diskDef.diskFmtType.QCOW2);
if (!isCentosHost()) {
hdb.setAttachDeferred(true);
}
disks.add(hdb);
}
if (isoPath != null) {
diskDef hdc = new diskDef();
hdc.defFileBasedDisk(isoPath, "hdc", diskDef.diskBus.IDE);
hdc.setDeviceType(diskDef.deviceType.CDROM);
disks.add(hdc);
}
diskDef hdc = new diskDef();
hdc.defFileBasedDisk(isoPath, "hdc", diskDef.diskBus.IDE, diskDef.diskFmtType.RAW);
hdc.setDeviceType(diskDef.deviceType.CDROM);
disks.add(hdc);
return disks;
}

View File

@ -56,6 +56,7 @@ public class LibvirtVMDef {
private String _initrd;
private String _root;
private String _cmdline;
private List<bootOrder> _bootdevs = new ArrayList<bootOrder>();
private String _machine;
public void setGuestType (guestType type) {
@ -79,6 +80,7 @@ public class LibvirtVMDef {
public void setBootOrder(bootOrder order) {
_bootdevs.add(order);
}
@Override
public String toString () {
if (_type == guestType.KVM) {
@ -249,10 +251,25 @@ public class LibvirtVMDef {
}
}
enum diskFmtType {
RAW("raw"),
QCOW2("qcow2");
String _fmtType;
diskFmtType(String fmt) {
_fmtType = fmt;
}
@Override
public String toString() {
return _fmtType;
}
}
private deviceType _deviceType; /*floppy, disk, cdrom*/
private diskType _diskType;
private String _sourcePath;
private String _diskLabel;
private diskFmtType _diskFmtType;
private diskBus _bus;
private boolean _readonly = false;
private boolean _shareable = false;
@ -260,13 +277,13 @@ public class LibvirtVMDef {
public void setDeviceType(deviceType deviceType) {
_deviceType = deviceType;
}
public void defFileBasedDisk(String filePath, String diskLabel, diskBus bus) {
public void defFileBasedDisk(String filePath, String diskLabel, diskBus bus, diskFmtType diskFmtType) {
_diskType = diskType.FILE;
_deviceType = deviceType.DISK;
_sourcePath = filePath;
_diskLabel = diskLabel;
_bus = bus;
_diskFmtType = diskFmtType;
}
public void defBlockBasedDisk(String diskName, String diskLabel, diskBus bus) {
_diskType = diskType.BLOCK;
@ -302,6 +319,8 @@ public class LibvirtVMDef {
}
diskBuilder.append(" type='" + _diskType + "'");
diskBuilder.append(">\n");
diskBuilder.append("<driver name='qemu'" + " type='" + _diskFmtType + "'/>\n");
if (_diskType == diskType.FILE) {
diskBuilder.append("<source ");
if (_sourcePath != null) {
@ -599,11 +618,11 @@ public class LibvirtVMDef {
devices.setEmulatorPath("/usr/bin/qemu-kvm");
diskDef hda = new diskDef();
hda.defFileBasedDisk("/path/to/hda1", "hda", diskDef.diskBus.IDE);
hda.defFileBasedDisk("/path/to/hda1", "hda", diskDef.diskBus.IDE, diskDef.diskFmtType.RAW);
devices.addDevice(hda);
diskDef hdb = new diskDef();
hdb.defFileBasedDisk("/path/to/hda2", "hdb", diskDef.diskBus.IDE);
hdb.defFileBasedDisk("/path/to/hda2", "hdb", diskDef.diskBus.IDE, diskDef.diskFmtType.RAW);
devices.addDevice(hdb);
interfaceDef pubNic = new interfaceDef();