Mikrotik RB3011上的主线Linux

2020-09-22 10:30:20

去年10月,我把家里的互联网连接升级为光纤(FTTP)。我仍然在使用80M/20M的服务,所以它并不比我原来的VDSL FTTC连接速度快,因此我在很长一段时间里继续使用我的运行OpenWRT的HomeHub5A。然而,FTTP ont意味着我已经用完了路由器上的一个额外的以太网端口,而且我已经很缺了,所以我最终也使用了一台GigE交换机。另外,我的WiFi是由Unifi处理的,它通过以太网供电。这意味着我有一台路由器、一台交换机和一个PoE注入器,它们都离我很近。我想减少设备数量,理想情况下,一旦我决定升级FTTP服务速度,就可以升级到可以扩展的设备。

环顾四周,我发现了Mikrotik RB3011UiAS-RM,这是一款机架安装式设备,有10个GigE端口(外加一个SFP插槽)和一个双核高通IPQ8064臂为其供电。有1G内存和128MB NAND闪存,以及一个USB3端口。它还支持PoE。从纸面上看,它似乎是一个理想的装置。我对在它(提供的软件)上运行RouterOS不是特别感兴趣,但它是基于Linux的,而且OpenWRT内部正在进行一些工作来添加支持,所以它看起来是一个值得试验的平台(什么,您认为这是关于我购买现成的设备并仅与提供的软件一起使用吗?)。作为一个额外的奖励,一位朋友说他有一台他没有用过的,很高兴以便宜的价格卖给我。

我一开始确实尝试过RouterOS,但我并不觉得它特别有吸引力。我习惯于在Linux命令行中配置防火墙和路由,并且在路由器上运行一些额外的服务,比如我的MQTT代理和MQTT-ARP(我的wifi设备状态监视器)。我可以移动东西,让它们在内部服务器上运行,但我认为它们是核心服务,因此我对它们在路由器上运行更满意。

第一步是在路由器上启动一些东西。幸运的是,它的背面有一个RJ45串行控制台端口,以及一个功能合理的引导加载器,可以通过网络上的TFTP进行引导。它需要的是ELF二进制文件,而不是普通的内核,但是Sergey Sergeev已经做了艰苦的工作,让u-boot在IPQ8064上工作,这意味着我可以只构建普通的u-boot映像来试用。

Linux upstream已经对我感兴趣的很多部分提供了基本支持。关于AUTO_ZRELADDR有一点模糊,因为网络协处理器需要RAM开始时的一大块内存,但是关于如何干净地处理这一问题的讨论正在进行中,我希望这最终将意味着我可以放弃这种攻击。串行、以太网、QCA8337交换机(2组5端口,绑定到处理器上的不同GigE设备)和内部NOR都有驱动程序,因此只需精心设计一个合适的DTB来使它们工作即可。这就留下了一些微不足道的地方。

首先,第二台交换机通过SGMII连接。结果发现IPQ806x stmmac驱动程序在此模式下没有正确初始化时钟,qca8k开关驱动程序也没有正确初始化时钟。所以我需要修复这两个问题(Sergey已经处理了stmmac驱动程序,所以我只需要清理并提交他的补丁)。接下来,与高通固件(SCM)对话的驱动程序已经更新,打破了IPQ8064所需的旧方法。一些吉特考古学家发现了这一点,并提供了解决方案。Ansuel Smith很有帮助地为USB端口提供了DWC3PHY驱动程序。这让我可以将Debian的armhf映像放到U盘上,并将其挂载为root,这使得调试变得容易得多。

在这一点上,我开始尝试将设备配置为实际充当路由器。我在我的家庭网络上使用了许多VLAN,所以我想确保我可以支持这些VLAN。原来stmmac驱动程序不愿意重新配置它的MTU,因为IPQ8064驱动程序没有配置FIFO大小。我找到了似乎正确的价值观,并把它们灌输进去。那么qca8k驱动程序只支持端口桥接。我希望能够有一个中继端口来连接到楼上的交换机,同时也有一个端口只有一个用于本地设备的VLAN。我想让交换机来处理这件事,而不是需要CPU来桥接流量。谢天谢地,很容易找到QCA8337数据表的副本,内核分布式交换机体系结构非常灵活,所以我能够实现必要的支持。

我坚持把Debian放在U盘上,因为它实际上已经投入生产了。如果需要的话,这使得修复变得更容易,而且U盘允许完整的Debian安装,这在128M的内部NAND上是很棘手的。这意味着我可以使用像nftables这样的东西来进行防火墙,并使用标准的Debian包来处理Colltd和Moterto之类的东西。另外,对于调试,我可以启动tcpdump或tshark之类的东西。这最终很有用,因为当我把这个设备投入生产时,我开始有一个奇怪的

这些工作中的大部分将在5.9内核发布后出现--5.8中已经有了基础知识。目前我能想到的没有排队的有以下几点:

Stmmac IPQ806x FIFO大小。我为这些发送了RFC补丁,但没有收到任何回复。我可能只需要提交这个。

NAND。这缺少对QCOM ADM DMA引擎的支持。我已经发送了我找到的支持这一功能的补丁,并收到了一些反馈,所以我希望它能在某个时候发布。

液晶屏。AFAICT LCD是一款ST7735设备,它支持内核,但是我没有花很大力气让SPI配置正常工作。

触摸屏。同样,这似乎是zt2046q或类似的,它有一个内核驱动程序,但我尝试的基本尝试没有得到任何响应。

正确的SFP功能。IPQ806x有一个PCS模块,但是stmmac驱动程序没有一种简单的方法来实现这一点。我对如何让它正常工作有一些想法(而且可以用固定的链接配置来破解),但这并不是最优先考虑的事情。

设备树添加。我后来启用的一些位还不在主线RB3011DTB中。我会在某个时候提交补丁的。

总体而言,我认为这款设备是成功的,让它正常工作是一件很有趣的事情。我运行的主要是主线内核,它可以毫不费力地处理我家的流量,而且它运行的是Debian,这使得我可以很容易地按照自己的意愿在上面投放更多的东西。然而,事实证明,RB3011并不像我希望的那样完美。PoE支持是被动的,而Unifi需要802.1af。所以我最终会有两台设备。碰巧,我买了一台便宜的D-Link DGS-1210-10P交换机,它提供PoE支持以及一些额外的交换机端口。此外,它还运行linux,因此在后面的…上有更多信息