让OpenWRT完美适应Hyper-V


-1 保持更新

请注意,本文中自行编译的方法已经不再被建议使用。第一点,自己编译可能会遇到一些奇怪的事情,同时也会浪费时间;二则是现在已经有了更好的解决方案。

OpenWRT 的官方 x86 版本现在自带了 Hyper-V 的支持,在官方页面直接下载 x86/64 版本的磁盘映像就可以直接使用第一代 Hyper-V 虚拟机挂磁盘启动了。因为官方给的磁盘映像是仅 MBR 的,如果想要使用第二代虚拟机(UEFI 模式)启动,请参考《构建 UEFI 启动的 OpenWrt 磁盘映像》来构建一个 UEFI 启动的磁盘映像。

Project LEDE他们说自己是Reboot了OpenWRT社区。而且很多用OpenWRT的也都升级到了LEDE。LEDE的x86_64版本是直接支持Hyper-V的,可以直接下载官网预编译版本而不用自己编译。因此建议大家使用LEDE的x86_64版本,本文中的方法仅用于学习借鉴。谢谢。

附上一张LEDE的x86_64的官方预编译版本在Hyper-V上的表现。

orz

0 为什么我会折腾这个

自己在国内放了台服务器,线路什么的都是自己拾掇的。因为丢在自己家里,那条线路也是肩负着我家出网的任务。一时兴起乘着续费线路的机会,打算试试软路由,就搞了个软路由。

首先我根据一篇文章,Hyper-v 安装 OpenWrt_x86 版教程(03.14更新) 在Hyper-V上装好了OpenWRT。

正当我兴奋的时候,我发现测速结果不太对劲。上传下载都只有20Mbps左右。和我的100Mbps相差甚远。看起来像是OpenWRT不支持Hyper-V的网卡,我一直搞不懂这是为什么,后来我闲逛的时候看到了一个贴子:Hyper-V安装Open-WRT的问题。于是我大概知道了为什么我的Hyper-V上的OpenWRT速度会如此坑爹。(看起来我的情况还比这个发帖人好一些哈哈哈)

我马上开始着手倒腾一个适合Hyper-V的OpenWRT。

1 准备工作

首先先get一个Linux Server,然后

git clone git://git.openwrt.org/15.05/openwrt.git

注意一些依赖包,我准备安装了以下包,如果还有别的依赖没安装,make前是会进行依赖检查的

sudo apt-get install build-essential openssl unzip libncurses5-dev zlib1g-dev libssl-dev subversion

make过程中经常会从网上下载需要的东西,大部分来自aws,情况大家都是知道的,所以自己准备好proxychains或者vpn等避免下载失败所导致的make中止。

10 修改

修改/package/kernel/linux/modules/virtual.mk,在最后加入下面的内容,添加让Linux内核支持Hyper-V的驱动。

#
# Hyper-V Drivers.
#
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
  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))

修改/target/linux/x86/64/config-default/target/linux/x86/config-3.18,均添加以下内容

# 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_HYPERV_KEYBOARD is not set

内核部分修改完成。

接下来修改make部分。

P.S. 这一部分不改也没事,你也可以用

qemu-img convert -f raw -O vpc openwrt-x86-generic-combined-ext4.img openwrt-x86-generic-combined-ext4.vhd

把生成的img转换成微软的VHD

修改/config/Config-images.in,在config VDI_IMAGE代码块的下面添加生成vhd的选项。

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

修改/target/linux/x86/image/Makefile,添加img转vhd的操作

ifneq ($(CONFIG_VDI_IMAGES),)代码块下面添加以下内容

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代码块中$(call Image/Build/vdi,$(1))下面加入

$(call Image/Build/vhd,$(1))

至此,修改完成。

11 配置

回到OpenWRT源码主目录,执行make menuconfig

选择Target System为x86,Subtarget选择Generic或者x86_64。自己看着办。

make menuconfig0.png

然后在Target Images里选中Build Hyper-V image files (VHD)。(如果之前修改源码的时候,没有添加生成vhd的选项,这里不会有这个选项,你只要生成后把img用工具转换成vhd就可以了,比如qemu-img convert -f raw -O vpc openwrt-x86-generic-combined-ext4.img openwrt-x86-generic-combined-ext4.vhd

make menuconfig target images.png

然后在Kernel modules里的Virtualization Support里勾选上4个Hyper-V相关的。如果有选过Build Hyper-V image files (VHD),这4个是会默认选中不可修改的。

make menuconfig kernel modules.png

make menuconfig kernel modules virtualization support.png

Kernel modules里的Network Devices中其他网卡可以都取消选择了。

配置至此结束。其他配置你自己开心就好。

100 编译

使用命令make可以进行编译,make V=s可以让它输出调试信息,带上-j1参数表示用1个核心编译。

make.png

101 完成

编译完成后,镜像文件在/bin目录下。vhd可以直接装上Hyper-V使用了。

openwrt.png

110

附上我编译的OpenWRT Chaos Calmer版本。http://pan.baidu.com/s/1kUtLaWR

2016-06-15补充:

因为我编译时的内核版本是3.18.23,而官方源里面的内核版本是3.18.20,因此有些涉及内核依赖的包不能安装。虽然说可以ignore,但还是用匹配内核的会好一些。现在我已经把我1月份编译这个Chaos Calmer时一起编译出来的包上传。还是上面那个地址,请自行取用。

111

感谢评论区neil补充如下:

要用opkg install 安装luci,需要先在 /etc/opkg/customfeeds.conf中加上luci的package
url。https://downloads.openwrt.org/chaos_calmer/15.05/x86/generic/packages/luci/


协议: 本文根据 Creative Commons Attribution-NonCommercial-ShareAlike 4.0 License 进行授权。

标签: openwrt hyperv


  • 有 15 条评论, 不如再加一个评论?
  • lk lk 2016-03-03 19:51

    你好,感谢你的工作。我正需要这个。在使用过程中发现一个问题。请问你的版本的luci如何安装?


    reply
    Soha King Soha King 2016-03-04 17:08

    就是opkg install啊


    reply
    neil neil 2016-05-15 09:32

    谢谢楼主的工作。补充一下,要用opkg install 安装luci,需要先在 /etc/opkg/customfeeds.conf中加上luci的package url。https://downloads.openwrt.org/chaos_calmer/15.05/x86/generic/packages/luci/


    reply
    Soha King Soha King 2016-06-02 16:03

    感谢补充!因为我自己是用ipk下载安装的,所以忽略了这一点。


    reply
    Night-Core Night-Core 2016-06-15 01:38

    博主能帮忙编译一个 iptables的tproxy模块吗
    因为opkg源里的ipk基本都是针对3.18.20内核,但是博主提供的内核是3.18.23


    reply
    Soha King Soha King 2016-06-15 12:38

    已经把当时一起编译出来的包发到了百度云上。还是那个分享链接。http://pan.baidu.com/s/1kUtLaWR 有你要的tproxy


    reply
    Night-Core Night-Core 2016-07-02 00:49

    谢谢


    reply
    AS AS 2016-07-20 11:04

    按你的步骤操作,附加镜像的时候提示“文件或目录损坏且无法读取”,请教是什么地方出了问题啊!


    reply
    Soha King Soha King 2016-07-26 13:34

    Hyper-V 只支持VHD和VHDx,确定你附加正确了吗


    reply
    AS AS 2016-07-29 09:38

    不是附加的问题,我把img镜像复制出来重新转换格式后就可以用了,我在想是不是环境配置的有问题?


    reply
    Soha King Soha King 2016-07-29 11:08

    应该是这样


    reply
    HazarJast HazarJast 2016-08-04 04:01

    感谢您的工作。您的链接被打破,您发布的最新版本。能否请您更新,这样我可以下载?很抱歉,如果我的中国是坏的,我的母语是英语,我使用的是翻译服务。


    reply
    Soha King Soha King 2016-08-11 07:53

    okay. in fact, you can use english to communicate with me. the kernel of the edition is compiled in Jan 2016. do you want a new edition with a newer kernel or let me just upload the edition to Google Drive?


    reply
    Flymemory Flymemory 2016-08-14 16:27

    非常感谢,根据你的步骤编译了一个新的,不过MakeFile的部分修改后总是提示文件错误,原因不明,不改MakeFile部分是可以编译通过的,已经用上了,很赞,100M光纤,测速有90M左右。


    reply
    OpenWrt编译教程【以WRT1900ACS V2,OP15.05为例子】 R11; PdBeta BLog 2017-08-28 21:43

    [...]https://soha.moe/post/make-openwrt-fits-hyperv.html[...]


    reply

撰写新评论

account_circle
mail
insert_link
mode_comment