怎么前一段时间搞软路由,这次搞起大号硬路由了(并非)
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,可以执行 set 或 unset 命令,但不能实际提交(即真正生效)
nvapply,不仅可以编辑 staging 的配置,还可以提交生效
声明式配置管理
https://docs.nvidia.com/networking-ethernet-software/nvue-reference/Config-Commands/
NVUE 进行系统配置的方法是声明式的。有些读者可能会立即想到 Nix,事实上它们确实很相似:系统的状态由配置文件描述,更改系统的配置本质上就是更新配置文件,然后触发系统的重配置。的确,Linux 系统的网络配置仍然由命令式的 ifupdown 等工具处理,NVUE 只是将配置文件抽象为 NVUE 的配置模型,然后替我们生成底层的配置文件,或是调用对应的命令。只需查看 nvued.service 的日志就能发现这一点。
声明式配置的一个好处是,可以用一个文件直接描述系统的配置状态。只需要 nv config show 命令,就可以看到当前交换机的所有配置信息,就像这样:
- 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: {}
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 set 和 nv unset 命令,其二是用新的配置文件替换当前的配置,其三则是将新的配置文件合并到当前的配置中。第一种方式相对更接近先前的命令式配置习惯,至于后两种方式,则使用下面的例子来说明。
假设当前 nv show config 输出如下:
- set:
interface:
eth0:
type: eth
ip:
address:
10.0.25.1/16: {}
1
2
3
4
5
6
7
|
- set:
interface:
eth0:
type: eth
ip:
address:
10.0.25.1/16: {}
|
有一个新的配置文件 new.yaml,内容如下:
- set:
swp1:
type: swp
ip:
address:
10.0.255.1/24: {}
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。
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.
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 一栏中,基本上有什么问题一目了然。