Cumulus Linux 5.1 & NVUE 使用笔记

Linux 交换机不就是个大软路由嘛……好吧,还是有些不一样。

怎么前一段时间搞软路由,这次搞起大号硬路由了(并非)

Cumulus Linux 是 NVIDIA 给交换机做的 Linux 系统,基于 Debian。NVIDIA 把交换机 ASIC 的配置抽象出来以 Linux 配置的方式呈现,实际用下来使用相对熟悉的逻辑还是更方便一些。

虽然是基于 Debian 的,但 NV 似乎并没有完全承诺兼容,况且交换机上那颗双核 X86 CPU 恐怕连星露谷都带不起来,还是别整花活了。不同的 Cumulus Linux 版本自带的软件包也不同,操作逻辑等有着显著的差距。NV 网站上有适用于各个版本的文档,当确定不下来的时候,与其找一个不知哪来的野文档 (包括这篇) 或是版本号对不上,不妨问问 ChatGPT,让它开联网搜一搜。

从 5.0 版本开始,Cumulus Linux 引入了 NVUE(NVIDIA Unified Extensible)配置框架(也就是 nv 命令这一套),用来取代 NCLU(即 net 命令)。在包括 5.1 在内的多个版本中,NCLU 的后端也是 NVUE,而在更新的一些版本中,则干脆没有了 NCLU。无论如何什么时候,都应该尽量避免直接编辑 /etc/network/interfaces,更不应该使用 systemd-networkd、netplan 或者 NetworkManager 之类的工具,尽量将 NVUE 作为 single source of truth。

用户管理

https://docs.nvidia.com/networking-ethernet-software/cumulus-linux-51/System-Configuration/Authentication-Authorization-and-Accounting/User-Accounts/

默认用户名是 cumulus,但和其他许多 Linux 一样,可以通过 adduser 工具添加用户,正常地设置密码,正常地配置 SSH public key。

与简单的判断 sudoer 不同,NVUE 有着自己的更细粒度的用户组权限控制。三个不同等级的用户组分别为:

  • nvshow,只能查看配置(如 nv show config),不能修改
  • nvset,可以执行 setunset 命令,但不能实际提交(即真正生效)
  • nvapply,不仅可以编辑 staging 的配置,还可以提交生效

声明式配置管理

https://docs.nvidia.com/networking-ethernet-software/nvue-reference/Config-Commands/

NVUE 进行系统配置的方法是声明式的。有些读者可能会立即想到 Nix,事实上它们确实很相似:系统的状态由配置文件描述,更改系统的配置本质上就是更新配置文件,然后触发系统的重配置。的确,Linux 系统的网络配置仍然由命令式的 ifupdown 等工具处理,NVUE 只是将配置文件抽象为 NVUE 的配置模型,然后替我们生成底层的配置文件,或是调用对应的命令。只需查看 nvued.service 的日志就能发现这一点。

声明式配置的一个好处是,可以用一个文件直接描述系统的配置状态。只需要 nv config show 命令,就可以看到当前交换机的所有配置信息,就像这样:

yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
- set:
    bridge:
      domain:
        tor_bridge:
          type: vlan-aware
          stp:
            state:
              up: {}
          vlan:
            '102': {}

    qos:
      roce:
        enable: on
        mode: lossless

    system:
      config:
        snippet:
          ifupdown2_eni:
            swp1: |
              post-up   ip neigh replace 10.0.255.2 lladdr 90:0a:84:xx:xx:xx dev swp1 nud permanent
              pre-down  ip neigh del     10.0.255.2 dev swp1              

    vrf:
      tora:
        table: auto
        router:
          static:
            192.168.106.0/24:
              address-family: ipv4-unicast
              via:
                10.0.255.2:
                  type: ipv4-address

    interface:
      eth0:
        type: eth
        ip:
          address:
            10.0.25.1/16: {}

      swp1:
        type: swp
        ip:
          address:
            10.0.255.1/24: {}
          vrf: tora

      tor_bridge:
        type: bridge

      vlan102:
        base-interface: tor_bridge
        type: svi
        vlan: 102
        ip:
          address:
            192.168.102.1/24: {}

这个片段展示了一个简单的交换机配置,包括 VLAN、VRF、QoS 以及接口配置等。可以看到,配置是以层次化的 YAML 格式呈现的,非常直观。值得注意的是里面有以命令形式存在的 snippet,虽然的确是命令式配置,但也是 NVUE 不支持配置情况下的无奈之举(5.1.0 还不支持固定 neighbor)。

用文件描述配置的另一个好处在于,版本控制非常方便。事实上 NVUE 也是这么做的:它真的用 Git 来管理历史,不信可以试试 nv config history 命令,应用的配置相当于被 commit 了。同样还有来自 Git 的 staging 概念,熟悉 Git 的读者应该很容易上手这几个选项:

  • nv config apply:将暂存中的配置生效
  • nv config detach:放弃暂存的配置,从当前应用的配置开始做修改

对暂存的配置作出修改,有三种方式:其一是直接使用 nv setnv unset 命令,其二是用新的配置文件替换当前的配置,其三则是将新的配置文件合并到当前的配置中。第一种方式相对更接近先前的命令式配置习惯,至于后两种方式,则使用下面的例子来说明。

假设当前 nv show config 输出如下:

yaml
1
2
3
4
5
6
7
- set:
    interface:
      eth0:
        type: eth
        ip:
          address:
            10.0.25.1/16: {}

有一个新的配置文件 new.yaml,内容如下:

yaml
1
2
3
4
5
6
- set:
      swp1:
        type: swp
        ip:
          address:
            10.0.255.1/24: {}

如果使用 nv config replace new.yaml 进行替换,那非常不巧,你的 eth0 配置就丢了,下一步大概就是去找串口线改配置了。而如果使用 nv config merge new.yaml,那就会把 swp1 的配置加进去,eth0 依然保留。

当你终于下定决心,要试试新调整的配置会不会把交换机搞崩的时候,可以使用 nv config apply 把配置提交生效。好消息是 NVIDIA 早就考虑到了配置错了 SSH 都连不上的问题,所以可以加一个 --confirm 选项,在 10 分钟内没有手动确认的话,配置会自动回滚,即使刚刚误用了 replace,也只是断 10 分钟而已。

排除连接问题

https://docs.nvidia.com/networking-ethernet-software/cumulus-linux-51/Monitoring-and-Troubleshooting/Troubleshooting-Network-Interfaces/Troubleshoot-Layer-1/

有时候因为各种原因某个口死活 up 不起来,Cumulus Linux 提供了一个方便的工具:l1-show

shell
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
cyp0633@cumulus:mgmt:~$ sudo l1-show 1-3
Port:  swp1
  Module Info
      Vendor Name: FINISAR CORP.          PN: FTLC1154RDNL-FH
      Identifier: 0x11 (QSFP28)           Type: 100g-lr4
  Configured State
      Admin: Admin Up     Speed: 100G     MTU: 9216
      Autoneg: Off                        FEC: Auto
  Operational State
      Link Status: Kernel: Up             Hardware: Up
      Speed: Kernel: 100G                 Hardware: 100G
      Autoneg: Off                        FEC: RS
      TX Power (mW): [1.8559, 1.839, 1.7584, 1.783]
      RX Power (mW): [0.878, 1.0508, 0.9174, 0.9853]
      Topo File Neighbor: None, None
      LLDP Neighbor:      cumulus, swp3
  Port Hardware State:
      Compliance Code: 100GBASE-LR4 or 25GBASE-LR
      Cable Type: Optical Module (separated)
      Speed: 100G                         Autodetect: FORCE - 100G
      Eyes: 385, 365, 419, 366            Grade: 31012, 21952, 31012, 25147
      Troubleshooting Info: No issue was observed.

当某个接口起不来的时候,不妨直接看 l1-show 的输出,在 Troubleshooting Info 一栏中,基本上有什么问题一目了然。

许可证:CC BY-SA 4.0
最后更新于 2025 年 11 月 16 日 17:11
Artalk ErrorFailed to load comments
TypeError: Failed to fetch


Retry