致谢
我参考的是原始作者Ning Ye的代码,感谢Ning Ye,https://patchwork.ozlabs.org/patch/431583/简介
此种办法是通过Kernel的Module加载Hyper-V相关支持,是本人目前唯一找到源代码并且在所有版本(Attitude Adjustment,Barrier Breaker,Chaos Calmer和4.4核心trunk)测试通过的Hyper-V支持方法。同时这也是最大限度使用OpenWRT官方源代码的Hyper-V支持方法;
其他有些Hyper-V虽然有“源代码“但是似乎对代码修改太多,需要从github迁出整份第三方修改的源代码才行,而不是简短的一个patch可以搞定了,以至于失去了通用性。
其他各种大牛、大神有各种支持Hyper-V的办法,非常牛叉,非常高大上,可惜没有源代码,无从研究。
根据OpenWRT的协议,照理说各种对OpenWRT的修改都应该公开源代码的……
CC和BB的Hyper-V支持
关于Chaos Calmer(同时适用于15.05和15.05.1)的Hyper-V补丁源代码可以看这里,https://github.com/tedaz/Hyper-V-support-for-OpenWrt-Chaos-Calmer关于Barrier Breaker的Hyper-V补丁源代码可以看这里,https://github.com/tedaz/Hyper-V ... Wrt-Barrier-Breaker
DD trunk 4.4核心的Hyper-V支持
下面的办法是为了让OpenWRT Designated Driver trunk源代码编译后,可以运行在Hyper-V虚拟机上,且支持标准网卡(而不是Legacy百兆网卡)。我用的是今天(2016-10-12)迁出的trunk源代码,因为Designated Driver依然处于Bleeding Edge状态,以后的代码很可能无法应用此补丁。
如果仅仅是测试目的,可以回滚到今天的代码应用补丁然后直接编译。
当然,关键还是弄明白补丁的意思,这样就可以手动修改今后版本的源代码了,而不需要依赖于预制做的补丁。
迁出源代码,
git clone git://github.com/openwrt/openwrt.git
最新的kernel 4.4已经彻底删除了对Hyper-V虚拟化支持的virtual.mk文件,
故首先到OpenWRT官网代码库下载历史版本的virtual.mk文件,
下载地址https://dev.openwrt.org/browser/ ... x/modules?rev=47415
下载virtual.mk文件,并拷贝到
./package/kernel/linux/modules/virtual.mk
建议备份virtual.mk文件,以备不时之需。
此时运行
make menuconfig
Kernel modules中并不会显示Virtulization菜单,需要
touch ./package/kernel/linux/Makefile
然后再次运行
make menuconfig
就会显示Virtulization菜单了。
只需要选中
kmod-hyperv-net-vsc
和
kmod-hyperv-storage
即可。
另外两个不用选。
Target Images选中ext4,然后用qemu-img命令转换为vhd就可以创建Hyper-V虚拟机了。
注:Openwrt默认的qemu-img生成的vhd有问题,无法使用。
保存后进行编译。
编译后生成img文件,运行命令转换为vhd,
qemu-img convert -f raw ./bin/x86/openwrt-x86-generic-combined-ext4.img -O vpc ./bin/x86/openwrt-x86-generic-combined-ext4.vhd
Windows Server 2008 R2直接创建虚拟机,选中标准网;
Windows Server 2012 R2创建虚拟机时选中Generation 1虚拟机,然后选中标准网卡。
源代码
下载的virtual.mk文件需要在文件末尾添加下述内容
## 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 \
CONFIG_PARAVIRT=n \
CONFIG_HYPERV=y
FILES:=$(LINUX_DIR)/drivers/hv/hv_balloon.ko \
$(LINUX_DIR)/drivers/hv/hv_vmbus.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 \
$(LINUX_DIR)/drivers/hv/hv_vmbus.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 \
$(LINUX_DIR)/drivers/hv/hv_vmbus.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 \
$(LINUX_DIR)/drivers/hv/hv_vmbus.ko
AUTOLOAD:=$(call AutoLoad,40,hv_storvsc)
endef
define KernelPackage/hyperv-storage/description
Microsoft Hyper-V Storage Driver
endef
$(eval $(call KernelPackage,hyperv-storage))
创建并应用hyper-v.patch
注意创建文件时使用linux格式的换行。diff --git a/target/linux/x86/config-4.4 b/target/linux/x86/config-4.4
index 13f1f9c..0c401af 100644
--- a/target/linux/x86/config-4.4
+++ b/target/linux/x86/config-4.4
@@ -216,6 +216,16 @@ 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_HYPERV_KEYBOARD is not set
+# CONFIG_FB_HYPERV is not set
+# CONFIG_HID_HYPERV_MOUSE is not set
+# CONFIG_VMWARE_BALLOON is not set
+# CONFIG_MOUSE_PS2_VMMOUSE is not set
CONFIG_HZ_PERIODIC=y
CONFIG_I8253_LOCK=y
# CONFIG_I8K is not set