[ 
https://issues.apache.org/jira/browse/CLOUDSTACK-10232?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16415380#comment-16415380
 ] 

ASF GitHub Bot commented on CLOUDSTACK-10232:
---------------------------------------------

rhtyd closed pull request #2465: CLOUDSTACK-10232: SystemVMs and VR to run as 
HVM on XenServer
URL: https://github.com/apache/cloudstack/pull/2465
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git 
a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
 
b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
index 4b7080aa5ab..a233064332b 100644
--- 
a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
+++ 
b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
@@ -283,6 +283,11 @@ private static boolean isAlienVm(final VM vm, final 
Connection conn) throws XenA
 
     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() {
     }
 
@@ -1286,11 +1291,8 @@ public VM createVmFromTemplate(final Connection conn, 
final VirtualMachineTO vmS
             if(guestOsDetails.containsKey("xenserver.dynamicMax")){
                 recommendedMemoryMax = 
Long.valueOf(guestOsDetails.get("xenserver.dynamicMax")).longValue();
             }
-
         }
 
-
-
         if (isDmcEnabled(conn, host) && vmSpec.isEnableDynamicallyScaleVm()) {
             // scaling is allowed
             vmr.memoryStaticMin = getStaticMin(vmSpec.getOs(), 
vmSpec.getBootloader() == BootloaderType.CD, vmSpec.getMinRam(), 
vmSpec.getMaxRam(),recommendedMemoryMin);
@@ -1312,7 +1314,6 @@ public VM createVmFromTemplate(final Connection conn, 
final VirtualMachineTO vmS
             vmr.memoryStaticMin = vmSpec.getMinRam();
             vmr.memoryStaticMax = vmSpec.getMaxRam();
             vmr.memoryDynamicMin = vmSpec.getMinRam();
-            ;
             vmr.memoryDynamicMax = vmSpec.getMaxRam();
 
             vmr.VCPUsMax = (long) vmSpec.getCpus();
@@ -1326,17 +1327,15 @@ public VM createVmFromTemplate(final Connection conn, 
final VirtualMachineTO vmS
             NicTO mgmtNic = vmSpec.getNics()[0];
             if(mgmtNic != null ) {
                 Map<String, String> xenstoreData = new HashMap<String, 
String>(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<String, String> vcpuParams = new HashMap<String, String>();
 
@@ -1368,12 +1367,18 @@ public VM createVmFromTemplate(final Connection conn, 
final VirtualMachineTO vmS
 
         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<String, String> 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)
 


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


> SystemVMs and VR to run as HVM on XenServer
> -------------------------------------------
>
>                 Key: CLOUDSTACK-10232
>                 URL: https://issues.apache.org/jira/browse/CLOUDSTACK-10232
>             Project: CloudStack
>          Issue Type: New Feature
>      Security Level: Public(Anyone can view this level - this is the 
> default.) 
>          Components: SystemVM, Virtual Router, XenServer
>    Affects Versions: 4.10.0.0, 4.9.3.0
>            Reporter: Pierre-Luc Dion
>            Priority: Major
>
> Following the recent Meltdown-Spectre security risk,one of the mitigation,as 
> of Jan 2018, for XenServer Hypervisor is to run Virtual-Machine in HVM mode.
> Currently SystemVMs and Virtual-Routers run as PV on XenServer and the eth0 
> is configured using {{/etc/init.d/cloud-early-config}} using grub params from 
> {{/proc/cmdline}}. When VM run as HVM, it is not possible to push initial 
> boot instruction via pygrub.
> Quick tests has been done using xenstore and it look like it would be 
> possible to send same initial boot instruction has pygrub but using xenstore 
> for HVM instances.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to