-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上的表现。
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。自己看着办。
然后在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
)
然后在Kernel modules里的Virtualization Support里勾选上4个Hyper-V相关的。如果有选过Build Hyper-V image files (VHD),这4个是会默认选中不可修改的。
Kernel modules里的Network Devices中其他网卡可以都取消选择了。
配置至此结束。其他配置你自己开心就好。
100 编译
使用命令make可以进行编译,make V=s可以让它输出调试信息,带上-j1参数表示用1个核心编译。
101 完成
编译完成后,镜像文件在/bin目录下。vhd可以直接装上Hyper-V使用了。
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/
你好,感谢你的工作。我正需要这个。在使用过程中发现一个问题。请问你的版本的luci如何安装?
reply
就是opkg install啊
reply
谢谢楼主的工作。补充一下,要用opkg install 安装luci,需要先在 /etc/opkg/customfeeds.conf中加上luci的package url。https://downloads.openwrt.org/chaos_calmer/15.05/x86/generic/packages/luci/
reply
感谢补充!因为我自己是用ipk下载安装的,所以忽略了这一点。
reply
博主能帮忙编译一个 iptables的tproxy模块吗
因为opkg源里的ipk基本都是针对3.18.20内核,但是博主提供的内核是3.18.23
reply
已经把当时一起编译出来的包发到了百度云上。还是那个分享链接。http://pan.baidu.com/s/1kUtLaWR 有你要的tproxy
reply
谢谢
reply
按你的步骤操作,附加镜像的时候提示“文件或目录损坏且无法读取”,请教是什么地方出了问题啊!
reply
Hyper-V 只支持VHD和VHDx,确定你附加正确了吗
reply
不是附加的问题,我把img镜像复制出来重新转换格式后就可以用了,我在想是不是环境配置的有问题?
reply
应该是这样
reply
感谢您的工作。您的链接被打破,您发布的最新版本。能否请您更新,这样我可以下载?很抱歉,如果我的中国是坏的,我的母语是英语,我使用的是翻译服务。
reply
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
非常感谢,根据你的步骤编译了一个新的,不过MakeFile的部分修改后总是提示文件错误,原因不明,不改MakeFile部分是可以编译通过的,已经用上了,很赞,100M光纤,测速有90M左右。
reply
[...]https://soha.moe/post/make-openwrt-fits-hyperv.html[...]
reply