Linux Switchdev Mellanox风格

这是Yandex NextHop 2020演讲的转录内容-页面末尾的视频






问候。我叫Alexander Zubkov,我想告诉您有关Linux Switchdev的知识-它是什么以及我们在Qrator Labs中如何与他同住。







我们已经在Mellanox交换机上使用Switchdev大约2-3年了。基于Mellanox Spectrum的交换机被归类为“白盒”,这意味着您可以在这些交换机上放置不同的操作系统。通常,供应商为此提供一些SDK,并且操作系统使用此SDK以便与交换机进行交互。对于Mellanox交换机,存在Mellanox本身的操作系统,即Cumulus。还支持SAI(交换机抽象接口)-这是为不同交换机创建标准SDK的一些尝试,而SONiC操作系统已在使用该SDK。当然,Mellanox交换机也支持Switchdev。







Switchdev是Linux内核中的此类基础结构,可让您构建内核本身的常规网络设置到数据窗格,交换机硬件的映射-这称为卸载。如图所示,粉红色是开关驱动程序,蓝色是用于配置用户空间的API和实用程序。 Switchdev在这里充当中介:对于用户空间,它表示交换机模型,对于驱动程序,它提供用于组织此显示的基础结构。







我们在Mellanox交换机上使用了一套相当标准的功能:路由,ECMP,通常没有什么异常。支持所有这些功能,并可以卸载到数据线。唯一缺少的是基于策略的路由-Mellanox驱动程序不支持。







Mellanox驱动程序位于具有Switchdev支持的原始Linux内核中-无需修补程序或其他二进制驱动程序。实际上,您可以从自己喜欢的发行版中获取内核,也可以自己编译并使用香草内核。交换机中的固件由驱动程序本身更新-您只需要添加相应的文件,该文件通常包含在linux-firmware软件包或类似文件中。







当然,要配置交换机本身,将大量使用标准Linux实用程序。还使用了一组用于QoS的iproute2,ethtool,LLDP守护程序。和sysctl一些选项。







对于Linux中的vrf,有两个网络名称空间。但是,还有一个所谓的vrf子系统-它不同于网络名称空间。在这种情况下,使用vrf时,所有接口都在同一个命名空间中。并且为了控制路由,在ip规则中有一个特殊的规则,该规则确定数据包属于哪个vrf,并据此将其定向到特定的路由表。要进行配置(在Linux中为vrf),将创建vrf类型的特殊接口,并在创建过程中将该表绑定到该表。此外,如果要向vrf添加某些接口,则使用ip link命令将此特殊设备设置为该接口的主接口。而且,由于所有这些接口都在同一个命名空间中,因此您可以显式指定从另一个vrf到路由的接口,从而在这些接口之间建立路由。







例如,我们有一个任务,其中基于策略的路由会有所帮助-我们从上行链路接收流量,并希望将其完全无条件地定向到某些过滤节点。在Cisco或Arista中,我们将制定策略路由图或某些服务策略,在Linux和ip rule中,您可以做到这一点-但是,在Linux中,所有这些都不会被卸载。







而且我们必须转身。例如,我们已经做出了这样的功能-我们将vrf分为两部分,即,一部分-在外部,与上行链路的接口,在内部,与过滤节点的接口。







这就是路由的样子。在内部vrf中,我们具有或多或少的标准路由集-也就是说,我们那里有内部路由,并且有一条通过上行链路的默认路由。并且在外部接口中,我们只有一条默认路由,但是它位于我们的过滤节点中。因此,我们获得了针对接口的伪基于策略的路由。通过上行链路接口的所有流量均沿不同的路由进行路由。







通常,在Switchdev上配置交换机时,通常通常必须先配置端口,然后配置绑定,然后再连接到网桥,vlan,vrfs,以及地址和路由的末尾。这主要是由Linux中接口的结构决定的-您应该如何配置所有内容,还有其他一些限制,这些限制不允许您随意更改设置。也就是说,这是一项相当沉闷的工作,在我们公司中,最初是由配置了所有这些内容的大型初始化脚本执行的。但是,当然,有时我们必须在生产中的运行时进行更改。







有时这很痛苦,因为您几乎必须手动整理此结构-拆卸一些接口,重新组装它们,当然,这些都充满了错误。在Cisco工作时,您可以更改设置,外壳程序将处理所有工作,然后进行一些底层工作。







好吧,感谢我们拥有Perl的事实-我们编写了一个脚本mlxrtr,该脚本接受了这样的配置并生成用于配置网络和其他所有内容的命令集。它还支持更改-如果您进行任何更改,它将读取Linux中的当前配置,并查看需要执行哪些操作才能将其恢复为所需状态。







最初,如果您运行此配置,则会为您生成这样的一组命令,而我也抛出了相同的命令。











有很多命令,但是通常,如果您的init脚本中包含命令,则可以或多或少地支持它。







例如,如果您需要将一个端口切换到另一绑定,则需要将该端口与旧绑定断开连接,从网桥断开新绑定,然后将端口连接到该绑定,然后将绑定返回到网桥,重新配置其上的VLAN-总的来说,这是一项沉闷的工作,当然,用手操作是不愉快的。该脚本自己完成所有这些操作。







进一步。 ACL是可配置的...您可以使用iptables,但不会卸载-您只能使用它来过滤控制平面流量。而且,如果要在数据线中进行过滤,那么对于Switchdev,则需要使用tc过滤器。这里值得牢记的是,tc过滤器不仅已经过滤了路由流量,还已经过滤了交换流量。而且tc过滤器也只能挂在物理端口上,因此,如果使用VLAN,则需要在此处进行更复杂的构造。但是那里有一些有趣的功能,例如,您可以将这样的块挂在几个接口上,它们会(在共享的意义上)摸索一个通用的过滤器。 tc规则中还有一个goto运算符,它也很酷,并且允许您执行非线性acl,这与同一Cisco或Arista不同。







在这里,我们还有一个用于配置acl-mlxacl的实用程序。我们主要在第三级使用VLAN,实用程序的工作方式是为每个VLAN创建一个单独的链,并在主链中简单地匹配VLAN,并转到该VLAN的相应链。







这里也有这种配置的示例-这样的命令就是结果。与交换机本身的配置情况相比,它们更少,因为一个规则映射到大约一个命令中-并不是那么困难。







但是,如果您必须进行任何更改-在这种情况下,我删除了一条规则,该实用程序以这样的方式进行所有操作:它重写所有已更改的链,然后在零-主链中重新编号,以便它们引用新链。很明显,在这种情况下,通过手动操作,可以用一个命令解决它。







但是为此,我们需要首先查看当前状态,这就是tc过滤器输出的样子-使用它非常困难。







当您处理所有这些工作时,路过的人会像这样看着您。因此,我们首先编写了该实用程序-mlxacl,因为使用它要痛苦得多,然后再逐字逐句地编写,对于其余设置,我们也编写了该实用程序。







这些实用程序(我告诉过您)已在Gitlab上公开发布-您可以使用它们。它们是根据MIT许可的,因此可以免费获得。







当然,没有任何保证。这是几个Perl脚本(预见到您的问题-因为我知道Perl并且它可以工作),相对较小,几乎没有依赖关系-它使用了标准Perl发行版和Linux实用程序中的几个Perl模块。







最后,如果您在使用COM端口的串行控制台上做了一些工作,我想提供一些建议。例如,如果有人认为这是退出Vim的一种方式,您几乎猜到了。







对于某些BIOS,这等效于Ctrl + Alt + Del,因为他们通过串行端口感知到它。也就是说,例如,如果引导加载程序挂起,并且您需要以某种方式重新引导交换机,则可以使用。



此外,谈到内核时,它自然会拦截键盘的工作,因此在这里最好让SysRq内核接受命令-否则将很难重新启动开关。对于SysRq,当您使用键盘和常规终端时,将使用PrintScreen;对于带有COM端口的串行控制台,则需要发送特殊的中断信号-在minicom中,它是Ctrl + F,在屏幕“ e Ctrl + A,Ctrl + B,然后进行特殊的SysRq键。



为了在启动时进入BIOS,当然是在交换机的BIOS中,因为事实上,就像在普通计算机中一样,通常也有一个BIOS可以通过它启动。您可以按Ctrl +B。



我只想简单地告诉你。如果您有任何疑问,我将很乐意回答。







出版物的英文版



All Articles