找回密码
 加入我们
搜索
      
查看: 25094|回复: 123

[网络] 重发: 编译OpenWRT虚拟化软路由,顺便聊聊玩家家庭网络构架

 火.. [复制链接]
发表于 2023-3-28 12:28 | 显示全部楼层 |阅读模式
本帖最后由 tedaz 于 2023-3-28 12:27 编辑

注:原贴发布于2017年,由于已经归档无法访问,2023年重发,并做了一点更新。

前言


如果您只需要刷朋友圈看抖音,随便京东买个路由器就行;
甚至可直接用联通、电信光纤宽带赠送的带有无线路由功能的光猫。
别往下看了,浪费时间。


刷路由器固件,折腾软路由的玩家大多有点儿其他需求,比如屏蔽广告等。

之前发过几个关于编译Hyper-V x86 OpenWRT的帖子,包括如何从源代码开始编译OpenWRT,具体可以看看这里https://www.chiphell.com/thread-1652999-1-1.html

有个高人的帖子,很不错,建议看看https://www.lifetyper.com/posts/build_your_own_x86_router.html
此高人对Linux、TCP/IP、路由器、网络技术等很有研究,还写过一本很不错的书,这是少有的外行可以看懂的、将各种网络知识融会贯通成一个外行可以理解的实例应用的书https://github.com/rampageX/FreeRouter_V2

关于LEDE:2016年OpenWRT的一些开发者重组了一个新的软路由项目,叫做LEDE,主页https://lede-project.org/
后来,LEDE和OpenWRT又再次合并为新的OpenWrt。两者基本上是一个东西,代码什么的都差不多;
只是曾经有些OpenWrt的开发者不满当年另一些人的风格,才中途搞了LEDE,后来LEDE的这些沟通很好的开发者成为主流,再次将LEDE和OpenWrt合并。
下面是一个具体实例,体会到LEDE接受补丁的速度远高于当年的OpenWRT,跟LEDE开发者沟通很顺畅。


用于OpenWRT的Hyper-V补丁曾经被莫名搁置n久;
2017年LEDE团队则高效的接受了Hyper-V补丁,而且是内核级补丁。
具体可以看LEDE的pull request #628,链接https://github.com/lede-project/source/pull/628

之后只要迁出LEDE/OpenWrt源代码,设置target=x86,sub-target=x86_64,直接编译生成img,然后用主流Linux的qemu-img命令转换为vhd镜像,就可以在Windows Hyper-V虚拟机上正常运行了。内核中已经集成了Hyper-V显卡、网卡、磁盘等驱动,无需自己添加驱动就可以完美支持Hyper-V,网卡、磁盘的性能都是正常的。这个是64位的,多核心、大内存都没问题。

所以现在编译OpenWRt已经不再需要手动集成之前的patch了,方便了很多。

注:下文有些链接需要xx才能访问;特别是OpenWrt的编译过程需要访问海量被屏蔽的网址下载源代码,比如github和其他很多开源代码网站。
玩软路由的人应该不会问“访问……超时该怎么办啊”之类的问题吧;一句话解法:编译时全局xx。

思路
“让路由器只做属于路由器的工作,其他工作交给其他设备。”


之前有些朋友问可否集成xx,可否集成yy,可否集成……
回答:建议只集成确实需要在路由器上完成的功能。

下面是个示意图:
示意图.png
  • OpenWrt软路由运行在Hyper-V虚拟机VM1上,仅提供必要的路由功能;
  • 为了远程访问,同一个Hyper-V宿主上还有另外一个虚拟机VM2,运行CentOS,提供PPXP、VXN等远程接入功能,方便从办公室等地方访问家里的网络设备和资源。(注:这个不是用来XX的。)
  • 然后,软路由VM1连接一个硬件交换机,提供交换机功能;
  • 再然后,硬件交换机连接一个无线AP,提供无线网络功能。
  • 最后,如果需要NAS,就弄个NAS连接到交换机上。

这样,每个部分都是独立的,便于维护。

设备型号举例:
  • Hyper-V宿主:DQ77KB,E3-1265L v2,8GB*2,mSATA 512GB。Windows Server 2016 DataCenter。
  • VM1:OpenWrt x64,8个vCPU,最小保留30%,最大保留50%;固定内存1GB。
  • VM2:CentOS,4个vCPU,最小保留20%,最大保留100%;固定内存768MB。
  • 交换机:MikroTik CRS309万兆交换机、HP  1920-16G Switch三层交换机
  • 无线AP:TP-LINK XDR6080设置为AP模式
  • NAS1:Supermicro 5028L,i7-6700T,16GB*2,1*SSD安装Windows Server 2016开启Hyper-V角色;4*机械硬盘存储数据。宿主运行utorrent和emule。加装MCX311万兆光口网卡
  • NAS2:Supermicro 5028D,Xeon D-1540, 32GB*4,多个Hyper-V虚拟机,运行比如Win7、迅雷、旋风以及各种网盘客户端。主板集成双万兆电口,并加装MCX311万兆光口网卡。

特别的,使用虚拟化运行软路由,可以一劳永逸的解决:
  • 路由器刷机变砖的问题。对于虚拟化软路由,升级时只需要创建一个新的虚拟机并加载新编译的vhd即可;待调试完成后,关闭或删除旧的虚拟机。如果调试失败,也很简单,删除新创建的有问题的虚拟机,继续启动旧的的虚拟机就行了。虚拟化软路由可以方便的保存多个固件版本——就是多保存几个虚拟机的事儿。实体路由器就没这么方便了——一堆路由器堆在墙角,其中还有好多砖了的~
  • 裸机装OpenWrt第三方固件、驱动、性能、节能等问题。OpenWrt已经在内核中集成了Hyper-V的各种驱动,只要Windows Server宿主驱动正常,Hyper-V和Hyper-V虚拟机就正常。
  • 正是由于上述两个原因,也就不建议裸机直接安装x86 OpenWrt,因为无法同时保留多个OpenWrt版本,并且还有很多硬件层面的驱动要折腾。

为什么用Hyper-V虚拟化?
常见的虚拟化就两个,一是ESXi,二是Hyper-V。
其他Xen、KVM、容器啥的就不说了,更小众,问题更多,更不是一般人能搞定的。

两者的主要区别在于驱动和性能不同;其次是宿主的“可利用性”不同。

先说驱动和性能:
  • ESXi的缺点是挑硬件,很多常见的民用、家用硬件(比如NUC)安装ESXi后网卡驱动有问题,导致网络性能极其低下或不稳定;芯片组磁盘驱动有问题,导致磁盘性能极其低下或不稳定。
  • Hyper-V没有驱动问题,现在民用、家用的硬件基本上都能安装Windows,而且驱动功能、性能都很正常。

再说宿主的“可利用性”:
这主要是针对两个比较特别的应用(功能):PT(utorrent)和电驴(emule)。这两个服务都有非常小巧、安全的客户端软件,直接运行在Windows宿主上就很好,性能绝对强悍,比什么路由器挂transmission都好用。这两个东西可能都需要下载大量的文件,完全没必要放在虚拟机里面或挂在NFS之类的。
Hyper-V的话宿主肯定是Windows,直接在宿主上运行utorrent和emule就挺好。
ESXi的话只能使用虚拟机运行这两哥俩,那就需要处理很多问题,比如大量的PT文件如何保存和访问,一不留神就陷入了低速磁盘或低速网卡问题中了。

其他功能:
  • SS/VXN:这个最好运行在路由上,无论是基于域名的还是全局的,运行在路由器上可以使局域网中的任何设备畅游Internet而无需运行客户端,方便啊。
  • AdBlock:这个可以运行在路由上,但是存在误判的可能性,可能会对正常访问造成影响。
  • 迅雷、旋风、网盘客户端们:这些肯定是运行在客户机上更方便;也可以创建第n个虚拟机,Windows 7/10,专门用来运行这些乱七八糟的客户端。
  • ownCloud、SVN等:弄个Linux虚拟机或Windows虚拟机吧,省心;别集成在路由器上。

小结:
Hyper-V软路由怎么挂U盘?
怎么直通硬盘给Hyper-V软路由用于下载?
……
这些都不是事儿。
您都用Hyper-V了,没必要把U盘挂到软路由器;
您都用Hyper-V了,Windows宿主直接下载不好嘛,没必要用软路由下载。
您都用Hyper-V了,多创建几个虚拟机,什么功能都能实现,就别让那些奇奇怪怪的功能骚扰软路由了。

最后就是关于硬件,功耗真的不是问题,没必要为了节约几瓦功耗而上那些非常迷你的工控机、魔改NUC
既然是玩家,直接上mini-ITX,性能强悍很多,而且各种硬件的通用性非常高,便于长期维护、升级。
罕见硬件、魔改硬件非常不利于后期的维护与升级。


编译OpenWrt
编译环境,ubuntu 22.04 LTS。
先更新一下系统:
  • apt-get update
  • apt-get upgrade

安装编译需要的基本工具:
  1. apt install build-essential gawk gcc-multilib flex git gettext libncurses5-dev libssl-dev python3-distutils zlib1g-dev
复制代码

迁出源代码:
  1. git clone https://git.openwrt.org/openwrt/openwrt.git 22030
复制代码

切换为22.03.0版本的代码:
  1. cd 22030
  2. git checkout tags/v22.03.0
复制代码

更新和安装feeds(也就是官方标准的插件)
  1. ./scripts/feeds update -a
  2. ./scripts/feeds install -a
复制代码

进入buildroot:
  1. make menuconfig
复制代码

更改编译设置:
  1. TargetSystem (x86) ---> (*) x86
  2. Subtarget选中x86_64
  3. Target Profile选中Generic x86/64
复制代码

配目标文件系统为 EXT4并生成vhd文件用于Hyper-V虚拟机:
勾选下述选项
  • ext4
  • Build GRUB images (Linux x86 or x86_64 host only)
  • Build GRUB EFI images (Linux x86 or x86_64 host only)
取消选中ext4之外的其他镜像格式。

Seconds to wait before booting the default entry
改为0,每次启动时等待0秒。

用web界面要加 luci,
LuCI-->Collection选中luci。这个是通过网页访问软路由所必须的组建,建议选中;否则就只能使用虚拟化串口或ssh访问软路由了。

LuCI->Applications中选中
  • luci-app-ddns
  • luci-app-qos
  • luci-app-statistics
  • luci-app-upnp
  • luci-app-vnstat
这是几个常见应用,根据个人喜好随便选。

Base system
  • 取消选中dnsmasq
  • 选中dnsmasq-full
因为dnsmasq-full支持ipset功能,对于基于域名的xx很有用。

Network->File Transfer中选中
  • curl
  • wget
顺手选中两个下载工具。

Network->IP Addresses and Names中选中
  • bind-dig
  • ddns-scripts_No-IP_com。(用来支持no-ip.com的ddns服务)
一个是测试工具;
另一个是某个ddns支持,还有其他ddns支持,也可以酌情选中。

Network->Routing and Rediction中选中
  • ip-full
这个很关键。

Network中选中
  • iperf3
  • ipset
一个是测试工具;
另一个是ipset,用于支持基于域名的xx。

Utilities->Editors中选中
  • nano
也可以选中vim,无所谓,反正都是文本编辑器,选个顺手的就好。

Utilities->Shells中选中
  • bash
如果您喜欢自己写脚本,可以选中bash,比默认的ash强大一些。

点击Save,保存为.config。
一路Exit退出。

在命令行输入make开始编译。

这是交叉编译,首次编译时会自动下载很多编译工具的源代码,先编译得到编译工具;
然后才是软路由和软件包的编译过程,期间也要下载所有的源代码。
只要您的网速足够快,XX足够给力足够稳,一般40分钟左右可以完成编译。
定量的说,网速也不用太快,只需要通过VXN测速,下行速率为100Mbps就够了,40分钟应该可以搞定。

之后再次编译时,除非手动指定,否则很多工具不会重新编译,源代码也不会重新下载,编译速度会大大加快。

结果
编译完成后,img文件生成到了下面的文件夹bin/targets/x86/64。
文件名类似于openwrt-x86-64-generic-ext4-combined.img。

运行Ubuntu命令qemu-img,将img文件转换为Windows Server Hyper-V可用的vhd文件:
  1. qemu-img convert -f raw ./bin/targets/x86/64/openwrt-x86-64-generic-ext4-combined.img -O vpc ./bin/targets/x86/64/openwrt-x86-64-generic-ext4-combined.vhd
复制代码

最后使用vhd文件创建Hyper-V虚拟机就可以了。

评分

参与人数 4邪恶指数 +65 收起 理由
jimmyjin + 50 就是NB
幼稚園班長 + 5 就是NB
Mufasa + 5 就是NB
kevinho86 + 5 666

查看全部评分

发表于 2023-3-28 12:34 | 显示全部楼层
还是建议软路由单独用一台机器,不然在宿主上折腾的时候,需要重启啥的,直接全屋断网。
发表于 2023-3-28 12:53 | 显示全部楼层
支持支持
发表于 2023-3-28 12:55 | 显示全部楼层
我目前的轻度使用方案:
1、破解光猫开启桥接模式;
2、软路由:N1 openwrt,github上每周定期自动编译固件,在线下载更新,有兴趣的点此链接下载
3、小米ax1800,开ssh,进后台设置vlan,让N1实现单臂路由。在家庭环境下完全能够胜任网管交换机+AP需求;
4、轻NAS,armbian系统,实现其它任何功能。
发表于 2023-3-30 19:21 来自手机 | 显示全部楼层
就是LZ的原帖学会了Op的编译,运行自己编译的op于软路由上(几个月后因功耗忧虑还是拆件卖掉了)

但是在折腾期间起码熟悉了Linux(ubuntu)的操作
也是文内的思路,我现在也是路由器做路由的事,无线路由做无线发射的事,各司其职,稳定得很
发表于 2023-3-30 19:35 | 显示全部楼层
现在dnsmasq-full默认不勾选ipset支持,需要手动勾选一下
 楼主| 发表于 2023-3-30 19:40 | 显示全部楼层
litccc 发表于 2023-3-30 19:35
现在dnsmasq-full默认不勾选ipset支持,需要手动勾选一下

对的,ipset,ip-full等都属于关键package。
编译前一定要手动检查一下关键package是否都选中了,不能过度依赖自动选择。
发表于 2023-3-30 19:44 | 显示全部楼层
感谢分享,学习一下
发表于 2023-3-30 21:33 | 显示全部楼层
虽然我不会这样自己编译,但楼主的思路确实和我想的差不多。

软路由就做好路由的事情,其他什么下载,Docker,交给另外的虚拟机。
发表于 2023-3-30 21:40 | 显示全部楼层
摩拜大神。
我之前用的openwrt,毕竟不是it从业者,配置这块研究完就那么用了,等到想改配置的时候,早都忘了咋搞了。

最近一年多了吧,总感觉家里网络很差,很卡,但是又不知道是哪的问题,懒得搞就将就用着,结果那天心血来潮想着吧openwrt上的东西都关掉,结果关完直接断网了,wan能拨号,但是上不去网,也懒得研究直接刷了个ikuai,好处是比op直观太多了,看个网速,找个设备,都很方便了,网络也好了很多。

但是吧,偶尔还是会有某些网站或者app卡顿,所以我觉得现在很多时候网络不好,不光是家里软路由问题,貌似isp那边也有控制。
发表于 2023-3-30 21:48 | 显示全部楼层
码住,收藏了
发表于 2023-3-30 22:57 | 显示全部楼层
现在官方都可以自己构建镜像了,根本没必要自己手动编译。而且你这个也没有改内核模块,不如去官网搞一个,也就几分钟的事。
然后你说KVM小众,是不是有点过分了是台linux服务器都支持KVM,服务器Linux占比不知道比windows高多少。
发表于 2023-3-30 23:07 | 显示全部楼层
旁路由是终极归宿,品牌路由器和自己部署的软路由 肯定自己部署的未知性更多。从不喜欢ALL IN ONE。各司其职就行,为那点所谓的电费,不值当。
发表于 2023-3-30 23:08 | 显示全部楼层
需要留学的那几个xx如何添加进去编译呢。
 楼主| 发表于 2023-3-30 23:29 | 显示全部楼层
highchh 发表于 2023-3-30 23:08
需要留学的那几个xx如何添加进去编译呢。

常见的方法有两个,效果一样:
(1)用git clone到package文件夹,然后进入menucofig应该就可以勾选了;
(2)编辑feeds.conf.default,添加类似于下面的代码:
  1. src-git kenzo https://github.com/kenzok8/openwrt-packages
  2. src-git small https://github.com/kenzok8/small
复制代码
将这两行添加到feeds,然后进入menuconfig就可以勾选了。

只不过,这种第三方的package需要观察下到底应该勾选哪个package,注意冲突的库别选择重复了,否则会编译失败。
发表于 2023-3-31 00:07 | 显示全部楼层
确实只集成自己用的到的功能,集成的越多越容易出问题。不过说实在的,小白看了lz文章也搞不定编译,步骤确实简单几步,但稳定的XX线路非常非常重要,99%的错误都是因为这个问题导致。另外的情况就需要看懂错误提示和懂一点linux了操作了,否则第一次很难完成。第一次编译推荐用单线程,再加上v=s或v=99,这样报错能看到错误提示。
发表于 2023-3-31 03:58 | 显示全部楼层
LEDE不是已经几年前就已经合并回OpenWrt项目了吗?
发表于 2023-3-31 07:55 | 显示全部楼层
感谢分享,学习一下
发表于 2023-3-31 07:58 | 显示全部楼层
备注备用
 楼主| 发表于 2023-3-31 08:39 | 显示全部楼层
ishadow 发表于 2023-3-31 00:07
确实只集成自己用的到的功能,集成的越多越容易出问题。不过说实在的,小白看了lz文章也搞不定编译,步骤确 ...

对,稳定xx非常重要,但这个话题就不能在这里深入讨论了。并且v=s编译也非常重要,这样单线程编译才能看到完整的错误信息。


其实还有一个步骤,就是将下载和编译分开:在menuconfig中勾选好要编译的package后保存退出,先不要直接make,而是
  1. make download V=s
复制代码

这个命令时仅下载交叉编译需要的工具们。

在正式开始编译之前,一定要确保所有下载都是成功的。
如果有失败的,会显示具体的链接地址,可以将链接地址复制到浏览器中看是否可以访问。
发表于 2023-3-31 08:45 | 显示全部楼层
码住,收藏了
发表于 2023-3-31 21:02 | 显示全部楼层
每次想自己编译一下结果就是各个教程都是看个大概,迷迷糊糊的,看的多问题多,最后都放弃了。
各种版本,眼花缭乱。哪些插件是什么功能,怎么加,有的插件好像还要单独编译。
我是r4s,只知道插件应该选aarch64_generic版本。只会选人家编译好的固件,另外单独安装下别人制作好的ipk。
有的ipk还用不了,安装不了,应该是版本问题,但怎么解决就不知道了
全局环境倒没问题,怕网络不稳定我还可以用海外鸡,没怎么用。
 楼主| 发表于 2023-3-31 21:29 | 显示全部楼层
hayse 发表于 2023-3-31 21:02
每次想自己编译一下结果就是各个教程都是看个大概,迷迷糊糊的,看的多问题多,最后都放弃了。
各种版本, ...

如果不是喜欢折腾it的朋友,就用别人做好的东西吧。

如果喜欢折腾,那么以下几个建议供参考:
首先要从官方途径和官方思路入手,不要一上来就看乱七八糟的高手魔改教程。具体来说就是,到openwrt官方网站看一下自己的路由器是否在正式支持的列表中,只有正式支持的路由器,小白才有可能编译成功(有可能不代表一定);非官方支持的路由器,小白失败率>99%。
OpenWrt官方R4S链接https://openwrt.org/toh/friendlyarm/nanopi_r4s_v1


查了一下,R4S是刚刚才被22.03.3支持的,也就是说在这个版本之前,你只能使用友善魔改的代码,或者高手魔改的代码,openwrt官方代码肯定无法正常使用。
第二,既然是硬件路由器,那就需要确认具体支持的情况,下面的截图显示R4S的4GB版本可以使用。但依然不保证所有硬件功能,比如无线是正常的。

最后,还是回到1楼的帖子,最适合的是虚拟化软路由,因为Hyper-V的OpenWrt驱动已经被官方搞定了,肯定可以正常驱动,而且折腾Hyper-V虚拟化软路由可以方便测试。
snapshot 2023-03-31 21 22 52.png
发表于 2023-3-31 21:44 | 显示全部楼层
这个环境用什么做好。。我有个ARM的机器,是用虚拟卡好 还是直接用ARM搞一个
 楼主| 发表于 2023-3-31 21:57 | 显示全部楼层
iamyangyi 发表于 2023-3-31 21:44
这个环境用什么做好。。我有个ARM的机器,是用虚拟卡好 还是直接用ARM搞一个 ...

编译环境吗?
本帖的编译环境是Windows桌面版安装VMware Workstation,然后安装Ubuntu 22.04虚拟机。
发表于 2023-3-31 22:00 | 显示全部楼层
本帖最后由 hayse 于 2023-3-31 22:02 编辑
tedaz 发表于 2023-3-31 21:29
如果不是喜欢折腾it的朋友,就用别人做好的东西吧。

如果喜欢折腾,那么以下几个建议供参考:


本来你主贴的我看个大概,思路很清晰,不涉及其他插件的话,依样画葫芦感觉可以。
你这个链接发来,我又懵了。
-
这个官网我以前也看过,东西太多,就乱了。r4s官方有做好的固件,但是插件什么的没有,所有我没用,直接用的istroes,就是一些科学插件太老了。
发表于 2023-3-31 22:04 | 显示全部楼层
tedaz 发表于 2023-3-31 21:57
编译环境吗?
本帖的编译环境是Windows桌面版安装VMware Workstation,然后安装Ubuntu 22.04虚拟机。 ...


我直接搞个盒子做环境 ARMBIAN可以不
 楼主| 发表于 2023-3-31 22:36 | 显示全部楼层
hayse 发表于 2023-3-31 22:00
本来你主贴的我看个大概,思路很清晰,不涉及其他插件的话,依样画葫芦感觉可以。
你这个链接发来 ...

友善官方和openwrt官方是完全不同的。

友善官方的固件和代码这里不讨论,友善官方代码属于最顶级高手魔改的,一般小白没有二次开到的机会。

openwrt官方的话,主要是学会看硬件路由器是否被支持,从哪个版本开始支持的,以及支持了原厂的哪些功能和特性。比如很多硬件路由器虽然被Openwrt支持,但是5G wifi有问题。
 楼主| 发表于 2023-3-31 22:39 | 显示全部楼层
iamyangyi 发表于 2023-3-31 22:04
我直接搞个盒子做环境 ARMBIAN可以不

编译速度太慢了吧,要玩的爽,肯定是用x64虚拟机,单核频率越高越好,这样编译速度才是最快的。多核心对于多线程编译没有实质性帮助,因为交叉编译实际上很多环节都是单线程编译。

比如编译Openwrt 22.03.3,i9-9900K (8C16T)比E5-2697v3 (14C28T)快两倍左右。
发表于 2023-3-31 22:44 | 显示全部楼层
本帖最后由 kevinho86 于 2023-3-31 22:46 编辑
iamyangyi 发表于 2023-3-31 22:04
我直接搞个盒子做环境 ARMBIAN可以不


试过用树莓派4B(环境:4GB版本,Ubuntu Server 20.04)编译最简单配置的op(Luci,luci-app-statistics、luci-app-upnp、luci-app-vnstat,取消dnsmasq改选dnsmasq-full,ip-full),用了12小时。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2024-5-18 14:21 , Processed in 0.017573 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表