让OpenWRT完美适应Hyper

您所在的位置:网站首页 openwrt开启smb 让OpenWRT完美适应Hyper

让OpenWRT完美适应Hyper

2023-08-31 09:45| 来源: 网络整理| 查看: 265

-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/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3