diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java index ee146a1f88c..88df2ce42f2 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java @@ -287,6 +287,11 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe protected StorageSubsystemCommandHandler storageHandler; + private static final String XENSTORE_DATA_IP = "vm-data/ip"; + private static final String XENSTORE_DATA_GATEWAY = "vm-data/gateway"; + private static final String XENSTORE_DATA_NETMASK = "vm-data/netmask"; + private static final String XENSTORE_DATA_CS_INIT = "vm-data/cloudstack/init"; + public CitrixResourceBase() { } @@ -1285,7 +1290,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe if (guestOsDetails.containsKey("xenserver.dynamicMax")) { recommendedMemoryMax = Long.valueOf(guestOsDetails.get("xenserver.dynamicMax")).longValue(); } - } if (isDmcEnabled(conn, host) && vmSpec.isEnableDynamicallyScaleVm()) { @@ -1309,7 +1313,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe vmr.memoryStaticMin = vmSpec.getMinRam(); vmr.memoryStaticMax = vmSpec.getMaxRam(); vmr.memoryDynamicMin = vmSpec.getMinRam(); - ; vmr.memoryDynamicMax = vmSpec.getMaxRam(); vmr.VCPUsMax = (long)vmSpec.getCpus(); @@ -1323,17 +1326,15 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe NicTO mgmtNic = vmSpec.getNics()[0]; if (mgmtNic != null) { Map xenstoreData = new HashMap(3); - xenstoreData.put("vm-data/ip", mgmtNic.getIp().toString().trim()); - xenstoreData.put("vm-data/gateway", mgmtNic.getGateway().toString().trim()); - xenstoreData.put("vm-data/netmask", mgmtNic.getNetmask().toString().trim()); + xenstoreData.put(XENSTORE_DATA_IP, mgmtNic.getIp().toString().trim()); + xenstoreData.put(XENSTORE_DATA_GATEWAY, mgmtNic.getGateway().toString().trim()); + xenstoreData.put(XENSTORE_DATA_NETMASK, mgmtNic.getNetmask().toString().trim()); vmr.xenstoreData = xenstoreData; } } final VM vm = VM.create(conn, vmr); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Created VM " + vm.getUuid(conn) + " for " + vmSpec.getName()); - } + s_logger.debug("Created VM " + vm.getUuid(conn) + " for " + vmSpec.getName()); final Map vcpuParams = new HashMap(); @@ -1365,12 +1366,18 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe final String bootArgs = vmSpec.getBootArgs(); if (bootArgs != null && bootArgs.length() > 0) { + // send boot args for PV instances String pvargs = vm.getPVArgs(conn); pvargs = pvargs + vmSpec.getBootArgs().replaceAll(" ", "%"); - if (s_logger.isDebugEnabled()) { - s_logger.debug("PV args are " + pvargs); - } vm.setPVArgs(conn, pvargs); + s_logger.debug("PV args are " + pvargs); + + // send boot args into xenstore-data for HVM instances + Map xenstoreData = new HashMap<>(); + + xenstoreData.put(XENSTORE_DATA_CS_INIT, bootArgs); + vm.setXenstoreData(conn, xenstoreData); + s_logger.debug("HVM args are " + bootArgs); } if (!(guestOsTypeName.startsWith("Windows") || guestOsTypeName.startsWith("Citrix") || guestOsTypeName.startsWith("Other"))) { diff --git a/systemvm/debian/opt/cloud/bin/setup/cloud-early-config b/systemvm/debian/opt/cloud/bin/setup/cloud-early-config index cec2d3cd2b5..a9ad094c8cb 100755 --- a/systemvm/debian/opt/cloud/bin/setup/cloud-early-config +++ b/systemvm/debian/opt/cloud/bin/setup/cloud-early-config @@ -42,7 +42,14 @@ hypervisor() { grep -q QEMU /var/log/messages && echo "kvm" && return 0 [ -d /proc/xen ] && mount -t xenfs none /proc/xen - [ -d /proc/xen ] && echo "xen-domU" && return 0 + if [ -d /proc/xen ]; then + $(dmesg | grep -q "Xen HVM") + if [ $? -eq 0 ]; then # 1=PV,0=HVM + echo "xen-hvm" && return 0 + else + echo "xen-pv" && return 0 + fi + fi vmware-checkvm &> /dev/null && echo "vmware" && return 0 @@ -64,10 +71,17 @@ config_guest() { get_boot_params() { case $HYPERVISOR in - xen-domU|xen-hvm) + xen-pv) cat /proc/cmdline > $CMDLINE sed -i "s/%/ /g" $CMDLINE ;; + xen-hvm) + if [ ! -f /usr/sbin/xenstore-read ]; then + log_it "ERROR: xentools not installed, cannot found xenstore-read" && exit 5 + fi + /usr/sbin/xenstore-read vm-data/cloudstack/init > /var/cache/cloud/cmdline + sed -i "s/%/ /g" /var/cache/cloud/cmdline + ;; kvm) VPORT=$(find /dev/virtio-ports -type l -name '*.vport' 2>/dev/null|head -1)