[OpenWrt-Devel] Hyper-V Support for X86 or X86_64

Ning Ye ning at oaklight.us
Wed Oct 8 08:08:51 EDT 2014


Sorry for the late reply.  To answer your questions, first I am trying to
save the hassle with another target, but hyper-v supports are enabled either
by manually selecting the hyper-v modules under virtualization or build VHD
disk output.  If you are using default x86 or x86_64 target, it wouldn't
added hyper-v unless you turned them on.

I couldn't make hyper-v module support work, especially the disk module. It
hangs if it is kernel module only.  My guess is that it needs the disk
support in order to load other modules.  Because the hyper-v is only enabled
for hyper-v environment, building it into the kernel doesn't seem to waste
any resources.  

Best,

Ning


-----Original Message-----
From: Hauke Mehrtens [mailto:hauke at hauke-m.de] 
Sent: Saturday, September 13, 2014 4:05 PM
To: Ning Ye; 'OpenWrt Development List'
Subject: Re: [OpenWrt-Devel] Hyper-V Support for X86 or X86_64

On 07/28/2014 12:37 AM, Ning Ye wrote:
> Hi All,
> 
> Hyper-V support for X86 or X86_64 were noticeably  missing.  There is a
previous patch for Kernel 3.3 but never maintained or merged into trunk.
Here's my take on adding the Hyper-V support for the current kernel.  No new
sub targets or profiles are created, as long as the target is x86 or x86_64.
The generic works well or any other profiles.  
> 
> Also added a new VHD target image menu .  The latest stable qemu-img
supports Hyper-V vhd and vhdx.  The old & current qemu 0.14.1 builds invalid
vhd images.  I am working on updating it to 2.0.0.  Currently I am
converting vmdk into vhd using third party tools.
> 
> Ning Ye
> Signed-off-by: Ning Ye <ning at oaklight.us>
> 
> ------------
> diff --git a/config/Config-images.in b/config/Config-images.in old 
> mode 100644 new mode 100755 index 39e51e4..7020f84
> --- a/config/Config-images.in
> +++ b/config/Config-images.in
> @@ -239,6 +239,16 @@ menu "Target Images"
>  		select TARGET_IMAGES_PAD
>  		select PACKAGE_kmod-e1000
>  
> +	config VHD_IMAGES
> +		bool "Build Hyper-V image files (VHD)"
> +		depends on TARGET_x86 || TARGET_x86_64
> +		select GRUB_IMAGES
> +		select TARGET_IMAGES_PAD
> +		select PACKAGE_kmod-hyperv-balloon
> +		select PACKAGE_kmod-hyperv-net-vsc
> +		select PACKAGE_kmod-hyperv-util
> +		select PACKAGE_kmod-hyperv-storage
> +
>  	config TARGET_IMAGES_PAD
>  		bool "Pad images to filesystem size (for JFFS2)"
>  		depends on OLPC_BOOTSCRIPT_IMAGES || GRUB_IMAGES diff --git 
> a/package/kernel/linux/modules/virtual.mk 
> b/package/kernel/linux/modules/virtual.mk
> old mode 100644
> new mode 100755
> index 190d844..a67d71c
> --- a/package/kernel/linux/modules/virtual.mk
> +++ b/package/kernel/linux/modules/virtual.mk
> @@ -186,3 +186,85 @@ define KernelPackage/xen-pcidev/description
>  endef
>  
>  $(eval $(call KernelPackage,xen-pcidev))
> +
> +#
> +# Hyper-V Drives depends on x86 or x86_64.
> +#
> +define KernelPackage/hyperv-balloon
> +  SUBMENU:=$(VIRTUAL_MENU)
> +  DEPENDS:=@(TARGET_x86||TARGET_x86_64)
> +  TITLE:=Microsoft Hyper-V Balloon Driver
> +  KCONFIG:= \
> +    CONFIG_HYPERV_BALLOON \
> +    CONFIG_HYPERVISOR_GUEST=y \

This adds some code to the kernel. I think it should be better to just
extend the kvm_guest subtarget and the x86_64 target with support for
Hyper-V.

> +    CONFIG_PARAVIRT=n \
> +    CONFIG_HYPERV=y

It is possible to build this as a module why is it build into the kernel?

> +  FILES:=$(LINUX_DIR)/drivers/hv/hv_balloon.ko
> +  AUTOLOAD:=$(call AutoLoad,06,hv_balloon) endef
> +
> +define KernelPackage/hyperv-balloon/description
> +  Microsofot Hyper-V balloon driver.
> +endef
> +
> +$(eval $(call KernelPackage,hyperv-balloon))
> +
> +define KernelPackage/hyperv-net-vsc
> +  SUBMENU:=$(VIRTUAL_MENU)
> +  DEPENDS:=@(TARGET_x86||TARGET_x86_64)
> +  TITLE:=Microsoft Hyper-V Network Driver
> +  KCONFIG:= \
> +    CONFIG_HYPERV_NET \
> +    CONFIG_HYPERVISOR_GUEST=y \
> +    CONFIG_PARAVIRT=n \
> +    CONFIG_HYPERV=y
> +  FILES:=$(LINUX_DIR)/drivers/net/hyperv/hv_netvsc.ko
> +  AUTOLOAD:=$(call AutoLoad,35,hv_netvsc) endef
> +
> +define KernelPackage/hyperv-net-vsc/description
> +  Microsoft Hyper-V Network Driver
> +endef
> +
> +$(eval $(call KernelPackage,hyperv-net-vsc))
> +
> +define KernelPackage/hyperv-util
> +  SUBMENU:=$(VIRTUAL_MENU)
> +  DEPENDS:=@(TARGET_x86||TARGET_x86_64)
> +  TITLE:=Microsoft Hyper-V Utility Driver
> +  KCONFIG:= \
> +    CONFIG_HYPERV_UTILS \
> +    CONFIG_HYPERVISOR_GUEST=y \
> +    CONFIG_PARAVIRT=n \
> +    CONFIG_HYPERV=y
> +  FILES:=$(LINUX_DIR)/drivers/hv/hv_util.ko
> +  AUTOLOAD:=$(call AutoLoad,10,hv_util) endef
> +
> +define KernelPackage/hyperv-util/description
> +  Microsoft Hyper-V Utility Driver
> +endef
> +
> +$(eval $(call KernelPackage,hyperv-util))
> +
> +#
> +# Hyper-V Storage Drive needs to be in kernel rather than module to load
the root fs.
> +#
> +define KernelPackage/hyperv-storage
> +  SUBMENU:=$(VIRTUAL_MENU)
> +  DEPENDS:=@(TARGET_x86||TARGET_x86_64) +kmod-scsi-core
> +  TITLE:=Microsoft Hyper-V Storage Driver
> +  KCONFIG:= \
> +    CONFIG_HYPERV_STORAGE=y \
> +    CONFIG_HYPERVISOR_GUEST=y \
> +    CONFIG_PARAVIRT=n \
> +    CONFIG_HYPERV=y
> +  FILES:=$(LINUX_DIR)/drivers/scsi/hv_storvsc.ko
> +  AUTOLOAD:=$(call AutoLoad,40,hv_storvsc) endef
> +
> +define KernelPackage/hyperv-storage/description
> +  Microsoft Hyper-V Storage Driver
> +endef
> +
> +$(eval $(call KernelPackage,hyperv-storage))
> diff --git a/target/linux/x86/config-3.10 
> b/target/linux/x86/config-3.10 old mode 100644 new mode 100755 index 
> 69f2f08..3fa6344
> --- a/target/linux/x86/config-3.10
> +++ b/target/linux/x86/config-3.10
> @@ -193,6 +193,14 @@ CONFIG_HW_RANDOM=y  CONFIG_HW_RANDOM_GEODE=y  
> CONFIG_HW_RANDOM_VIA=y  # CONFIG_HYPERVISOR_GUEST is not set
> +# CONFIG_HYPERV is not set
> +# CONFIG_HYPERV_BALLOON is not set
> +# CONFIG_HYPERV_NET is not set
> +# CONFIG_HYPERV_STORAGE is not set
> +# CONFIG_HYPERV_UTILS is not set
> +# CONFIG_FB_HYPERV is not set
> +# CONFIG_HID_HYPERV_MOUSE is not set
> +# CONFIG_VMWARE_BALLOON is not set
>  CONFIG_HZ_PERIODIC=y
>  CONFIG_I8253_LOCK=y
>  # CONFIG_I8K is not set
> diff --git a/target/linux/x86/image/Makefile 
> b/target/linux/x86/image/Makefile old mode 100644 new mode 100755 
> index 5983718..80ef5cf
> --- a/target/linux/x86/image/Makefile
> +++ b/target/linux/x86/image/Makefile
> @@ -178,6 +178,15 @@ ifneq ($(CONFIG_VMDK_IMAGES),)
>    endef
>  endif
>  
> +ifneq ($(CONFIG_VHD_IMAGES),)
> +  define Image/Build/vhd
> +	rm $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).vhd || true
> +	qemu-img convert -f raw -O vpc \
> +		$(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
> +		$(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).vhd
> +  endef
> +endif
> +
>  define Image/Build/gzip
>  	gzip -f9 $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img
>  	gzip -f9 $(BIN_DIR)/$(IMG_PREFIX)-rootfs-$(1).img
> @@ -252,6 +261,7 @@ define Image/Build
>  	$(call Image/Build/grub2,$(1))
>  	$(call Image/Build/vdi,$(1))
>  	$(call Image/Build/vmdk,$(1))
> +	$(call Image/Build/vhd,$(1))
>  	$(CP) $(KDIR)/root.$(1) $(BIN_DIR)/$(IMG_PREFIX)-rootfs-$(1).img
>    else
>  	$(CP) $(KDIR)/root.iso $(BIN_DIR)/$(IMG_PREFIX).iso diff --git 
> a/target/linux/x86_64/config-default 
> b/target/linux/x86_64/config-default
> old mode 100644
> new mode 100755
> index 48145be..865aa81
> --- a/target/linux/x86_64/config-default
> +++ b/target/linux/x86_64/config-default
> @@ -258,6 +258,13 @@ CONFIG_HW_RANDOM=y  CONFIG_HW_RANDOM_INTEL=y  # 
> CONFIG_HW_RANDOM_VIRTIO is not set  CONFIG_HYPERVISOR_GUEST=y
> +# CONFIG_HYPERV is not set
> +# CONFIG_HYPERV_BALLOON is not set
> +# CONFIG_HYPERV_NET is not set
> +# CONFIG_HYPERV_STORAGE is not set
> +# CONFIG_HYPERV_UTILS is not set
> +# CONFIG_FB_HYPERV is not set
> +# CONFIG_HID_HYPERV_MOUSE is not set
>  CONFIG_HZ_PERIODIC=y
>  # CONFIG_I7300_IDLE is not set
>  CONFIG_I8253_LOCK=y
> diff --git a/target/linux/x86_64/image/Makefile 
> b/target/linux/x86_64/image/Makefile
> old mode 100644
> new mode 100755
> index c2f1ce9..efa5fa9
> --- a/target/linux/x86_64/image/Makefile
> +++ b/target/linux/x86_64/image/Makefile
> @@ -156,6 +156,16 @@ ifneq ($(CONFIG_VMDK_IMAGES),)
>    endef
>  endif
>  
> +ifneq ($(CONFIG_VHD_IMAGES),)
> +  define Image/Build/vhd
> +	rm $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).vhd || true
> +	qemu-img convert -f raw -O vpc \
> +		$(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img \
> +		$(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).vhd
> +  endef
> +endif
> +
> +
>  define Image/Build/gzip
>  	gzip -f9 $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img
>  	gzip -f9 $(BIN_DIR)/$(IMG_PREFIX)-rootfs-$(1).img
> @@ -199,6 +209,7 @@ define Image/Build
>  	$(call Image/Build/grub2,$(1))
>  	$(call Image/Build/vdi,$(1))
>  	$(call Image/Build/vmdk,$(1))
> +	$(call Image/Build/vhd,$(1))
>  	$(CP) $(KDIR)/root.$(1) $(BIN_DIR)/$(IMG_PREFIX)-rootfs-$(1).img
>    else
>  	$(CP) $(KDIR)/root.iso $(BIN_DIR)/$(IMG_PREFIX).iso
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list