你试过在devel登录中使用Linux路由命令的'-C'选项吗?看看所有的参赛作品会很有趣!
'ip'和'route'命令似乎都不是MikroTik随RouterOS提供的busybox二进制文件的一部分,这就是为什么我直接与'proc'虚拟文件系统交互。l雷竞技雷竞技网站我计划构建并尝试一个更完整的静态链接的busybox二进制文件,其中包括'ip'命令,尽管我还没有检查busybox的'ip'版本是否完整。
——内森
编辑:更新:
我现在有一个静态链接的busybox二进制文件,其中包括'ip'和'route'。busybox版本的'route'不支持-C参数,但'ip route show cache'确实有效,如果我在路由缓存大小失控的情况下在有问题的机器上运行它,它不会显示任何异常:路由缓存大小显示10000+个,但'ip route show cache'只显示5个左右的路由,我希望在这个特定的路由器上看到。这很有趣。
不过,这个问题(至少是我的问题)肯定与MikroTik的新PPP代码有关。雷竞技网站我将尝试把一个一步一步的方法来复制这个bug,一旦我把它100%钉住了,但现在它似乎被触发,如果你正在运行一个基于ppp的服务器(PPTP, L2TP, SSTP,甚至PPPoE等),你有几个连接到它上下。最终,在其中一个PPP断开连接后,当它试图拆除PPP接口时,似乎会出现某种竞争条件。在路由缓存开始失控后不久,'dmesg'输出在我的路由器上显示了大量这样的消息:
Unregister_netdevice:等待ppp1变为free。unregister_netdevice:等待ppp1空闲。unregister_netdevice:等待ppp1空闲。unregister_netdevice:等待ppp1空闲。用法计数= 1[…]
…一个nd something just keeps repeating that message over and over again. This is despite the fact that 'ppp1' as an interface no longer exists:
# busybox ifconfig ppp1 ifconfig: ppp1:获取接口信息错误:Device not found
…年代o it's trying to unregister a device that doesn't exist?
更坏的消息是:一旦它达到这种状态,似乎不可能刷新添加到它的条目的缓存(我假设是通过PPP?)。似乎PPP子系统中的某些东西对这些条目有锁,并且无法释放它们。调整路由缓存垃圾收集器的值也不会有什么不同…这个数字不会下降。我知道这些proc/sysctl值实际上是有效的,因为我在一个具有相当大的路由缓存的microtik上测试了它们,但是它没有失控,并且能够成功地刷新缓存并明雷竞技网站显地看到垃圾收集器的行为变化。然而,一旦这个特定的错误被触发,唯一可以治愈它的方法就是重新启动。我甚至尝试杀死ppp和ppp-worker进程,但是尽管它们在发送SIGTERM后干净地退出,路由缓存仍然臃肿,并且“unregister_netdevice”控制台错误继续快速发生。
最后,这可能与MPPE有关。我注意到问题开始后,'ppp_mppe'内核模块显示它正在被某些东西使用并且无法卸载,即使在我终止所有PPP隧道并关闭PPP服务之后:
# lsmod | busybox grep mppe ppp_mppe 5585 6 - Live 0x90d5d000
然而,这可能只是另一种症状,而不是原因,特别是如果人们也遇到了SSTP的问题,MPPE应该没有用处。
编辑2:这就有意思了。我想我已经设法找到了一种方法来重现这个错误的一个版本,但现在我已经这样做了,我尝试再次手动刷新路由缓存,这次这样做有效果。即使在刷新之后,它也会继续增长,但这次执行刷新实际上是有效的,并清除了缓存(暂时)。奇怪。