记录一次折腾——搭建基于hyper-v的Openwrt
文章摘要
作者需要在电脑上安装一个Ubuntu虚拟机,考虑了几种方案后选择了Hyper-V。Hyper-V是一个虚拟化平台,但其功能在非商业使用时会被阉割。作者的目标是利用硬件资源,特别是网络和独显资源。为了解决网络问题,作者使用了OpenWrt作为路由器,配置了虚拟交换机和网卡,实现了宿主机和虚拟机的联网。作者还配置了IPv6和NAT,并安装了mentoHUST插件以实现锐捷认证。通过这些步骤,作者成功地搭建了一个虚拟化环境,实现了多虚拟机的联网和资源共享。
一.为什么使用hyper-v?
前段时间,我突然想在电脑上装一个Ubuntu虚拟机。
此时摆在面前有几个选择:卸载windows使用kvm搭载多系统、物理机上跑双系统、用hyper-v跑多系统。
显然,物理机跑双系统的方案可以最大程度地发挥硬件性能,但仔细想想又不太对:锐捷校园网的认证客户端只支持Winodws,如果物理机跑linux的话,我很可能登不上,不过更重要的是,我不擅长处理一堆奇怪的启动引导项。于是这个方案被否决了。
那kvm呢?其实kvm是一个相当不错的方案,我就应该使用kvm……但当时我嫌复制数据太麻烦(因为要把原windows系统给卸载掉),就把它否决了(我真该在网上找找有没有windows无痛迁移到kvm上的方案的)。
最后就使用了Hyper-V,一个不得不遵循微软的村规——非商业使用就阉割功能的平台。。。
二.整体架构设计
主要是利用硬件资源方面的考量:首先网络要能跑通,力争每一台虚拟机都能很方便地联网,都可以通过简单的配置使其能被外网访问到;其次独显资源要能被利用上,我要用CUDA。有了这两个简单的目标,我就开始构建整体的框架。
首先解决网络问题。假如所有网络都由Windows宿主机管理,我的锐捷认证客户端就无法使用——它会检测多网卡和多ip。开启Hyper-V之后锐捷的客户端就不能正常登陆了,所以宿主机不能够充当流量的主出入口了,我需要一个可以充当路由器的linux发行版来替我管理我的所有网络流量:OpenWrt。这样,将物理网卡挂载在OpenWrt上,并为其配置虚拟交换机,通过其强大的路由功能(有一个名为mentoHUST的神秘插件,可以用于锐捷认证),就可以管理所有的虚拟机流量。大致的网络流量流向是这样的:
物理网卡——OpenWrt的wan口——OpenWrt的lan口——虚拟交换机——宿主机与其它虚拟机
三.OpenWrt的安装与配置
OpenWrt的系统镜像有很多,各位大佬都分享了自己基于各种Kernel各种Luci各种插件和各种奇奇怪怪的东西的构建,使用的方便程度不一,功能丰富程度也有很大差别。我一开始硬着头皮使用了一个仅包含核心功能的最小构建,结果连ping外网都ping不通(其实我到现在都想不通为什么一个简单的DHCP会跑不通)。后来就使用了openwrt.ai上的X86_64镜像,基于iStoreOS,支持中文、docker,配置方便,无论是新手还是高手都很合适,简直是神,推荐大家使用。
不过在配置openwrt虚拟机之前,我们还要做一些工作。
1.配置虚拟网卡。首先,在hyper-v的虚拟交换机设置里,增加一个用于挂载物理网卡的交换机,随便起一个名字,然后选择“外部虚拟交换机”,然后为其搭配一个网卡,把“与操作系统共享网卡”去掉,点保存;然后再添加一个网卡,随便命名,选择“内部虚拟交换机”,点保存,它负责虚拟机与宿主机之间的网络连接。
2.将下载下来的openwrt镜像转为vhdx(hyperv虚拟硬盘)格式。下载一个名为StarWind V2V Converter的工具。点开,选择local file,然后找到下载的镜像文件,指定储存的文件为local file,然后下一步选择VHDX格式,继续下一步直到转换完成。(软件官网:https://www.starwindsoftware.com/starwind-v2v-converter)
现在我们开始安装openwrt。打开hyper-v管理器,添加虚拟机。命名、指定第一代虚拟机、指定最大内存(其实500MB就够了)、添加虚拟硬盘(就是之前转换完成输出的vhdx磁盘文件),完成。然后再点开虚拟机设置,关闭安全引导,为其添加两个网络适配器,第一个是挂载物理网卡的虚拟交换机(把它记为eth0),第二个是负责宿主机与虚拟机通讯的虚拟交换机(把它记为eth1)(一定要按顺序来,如果顺序不对,就把那个eth0上移)。完成,点击启动。
启动后,执行以下命令:
查看openwrt的网络配置,找到wan的配置,将device改成eth0,找到lan的配置,将device改成eth1(等等……读者要是不会用vi怎么办呢?--自己学去),esc,:wq保存,然后执行:
接下来打开控制面板,网络与共享中心,高级适配器设置,找到eth1(名字不是eth1,只是那个对应eth1的那个网络适配器),双击,属性,ipv4协议balabala的,手动为其指定ipv4地址
注:该步要求网段与路由器相同。如openwrt配置的ip地址是:192.168.100.1/24,那网段就是192.168.100.x,可以选择192.168.100.2-192.168.100.255之间的任一地址输入,如果是192.168.100.1/16,那网段就是192.168.x.x,可以选择192.168.1.1-192.168.255.255之间的任一与openwrt不同的地址输入,但是我是懒人,一般就输入192.168.100.2。如果openwrt的配置文件里没有/24/16的话,你就默认它是 /24,保持前三个字段与openwrt的ip相同,只改动第四个。
点击保存。
现在,打开浏览器,输入前面看到的openwrt的地址,回车,应该就能看到路由器管理页面了。默认密码为root。输入密码进入后台之后,openwrt会为你开启一个新手向导(只有iStoreOS的镜像有这项功能,其它镜像都没有,得自己折腾,而且经常不成功。),点击主路由模式,协议为dhcp,然后结束。然后,在左边导航栏找到“网络”项,点击“接口”,找到wan,编辑,在“设备”处将br-lan改成eth0。现在,你的openwrt应该可以正常访问网络了,但宿主机应该还不行。
往后,在“接口”这里,添加新接口,命名为lan,选择eth1作为设备,为其指定一个与openwrt的wan口所在网段不同的新网段(如10.0.0.1/24),并分配一个ip地址,同时不指定ipv4网关(这样它的地址就会是wan口地址),点击保存。
接下来还有关键的一步:为lan口配置NAT。方法很简单,在“网络”栏里找到“防火墙”,找到wan口所属的防火墙区域,启用“动态ip伪装”,NAT就成功打开了。(当然如果你是个高手你想要自己配置路由表想要自己实现不同的NAT类型也可以自己用自己的方法……)
此时,宿主机应该成功连上网了。
接下来我们来配置ipv6。
首先新建一个接口(你不会还不知道在哪里新建吧?翻一下上文),命名为wan6(其实只是为了管理方便,爱叫什么叫什么),协议那里选择DHCPv6,设备同样是eth0。然后在同样的配置页面,找到dhcp服务器设置,在常规设置里选择“忽略此接口”,然后在ipv6设置里,勾选“指定的主接口”,将RA、DHCPv6、NDP代理都改为“中继模式(Relay mode)”,勾选学习路由,保存。在接口页面,再找到lan,编辑。同样是DHCP设置里,把IPv6设置中的RA和NDP代理改为中继模式(relay mode),DHCPv6改为混合模式(hybrid mode),勾选本地IPv6DNS服务器,勾选学习路由,保存。
现在你应该可以在test-ipv6.com的测试中获得全部通过的高评价了……
不过,到了这里,我们只是实现了openwrt和宿主机的联网,还有其它虚拟机呢。配置方法很简单,在hyper-v管理器中,点击“虚拟交换机设置”,添加一个专用虚拟交换机(对应eth2),然后在openwrt中将其添加进去,在openwrt的接口设置页面,为eth1和eth2添加一个网桥,把lan口的设备由eth1改为这个网桥,配置就完成了。后续的虚拟机只需要添加上这个专用虚拟交换机,就可以连上网啦!
最后是mentoHUST,在“系统”-“软件包”处,用搜索框直接搜mentoHUST,找到luci-mentoHUST(还是什么来着,我忘了反正是大概的一个名字),按提示完成安装,最后在“服务”-“mentoHUST”里,输入你的校园网账号密码,就完成配置了。(其实截止到发文前我都没有试验过它是否行得通,因为放着假呢……)
那这个时候就有人要问了:如何绕过锐捷的多设备检测呢?这又是另一个话题了。
相关文章
暂无相关文章
