规范拓扑管理器 - PTM
PTM 是一种动态布线验证工具,可以检测和消除错误。PTM 在 topology.dot
文件中使用 Graphviz-DOT 指定的网络布线计划,并将其与来自 LLDP 的运行时信息相结合,以验证布线是否与规范匹配。检查发生在网络中每个节点的每个链路转换时。
您可以自定义 topology.dot
文件,以在全局和网络级别以及节点和端口级别控制 PTM 服务 (ptmd
)。
支持的功能
- 使用 LLDP 进行拓扑验证。
ptmd
服务创建到 LLDP 服务 (lldpd
) 的客户端连接,并检索网络中节点或端口之间的邻居关系,并将其与topology.dot
文件中指定的规定拓扑进行比较。 - PTM 仅支持物理接口,例如 swp1 或 eth0。您不能在拓扑文件中指定虚拟接口,例如 bond 或子接口。
- 与 FRR 集成(PTM 到 FRR 的 BFD 状态通知)。
- 客户端管理;
ptmd
服务在启动时创建一个抽象命名套接字/var/run/ptmd.socket
。其他应用程序可以连接到此套接字以接收通知和发送命令。 - 事件通知。
- 使用
topology.dot
文件进行配置;请参见下文。
配置 PTM
ptmd
服务根据 DOT 指定的网络图文件 /etc/ptm.d/topology.dot
验证物理网络拓扑。
PTM 支持 无向图。
在启动时,ptmd
服务通过 Unix 套接字连接到 lldpd
服务,并检索邻居名称和端口信息。然后,它将检索到的端口信息与从拓扑文件中读取的配置信息进行比较。如果匹配,则为 PASS
,否则为 FAIL
。
PTM 使用 PortID ifname TLV 信息执行其 LLDP 邻居检查。
ptmd 脚本
对于每个经历更改的接口,ptmd
服务在 /etc/ptm.d/if-topo-pass
和 /etc/ptm.d/if-topo-fail
处执行脚本,并在 LLDP 或 BFD 检查通过时运行 if-topo-pass
,或在检查失败时运行 if-topo-fails
。这些脚本接收一个参数字符串,该字符串是 ptmctl
命令的结果;请参阅 下面的 ptmd
命令。
您可以修改这些默认脚本。
配置参数
您可以在拓扑文件中配置 ptmd
参数。这些参数是仅主机参数、全局参数、每端口或节点参数以及模板。
仅主机参数
仅主机参数应用于运行 PTM 的整个主机。您可以包含 hostnametype
仅主机参数,该参数指定 PTM 在图形文件中查找 self-node
时是仅使用主机名 (hostname
) 还是完全限定域名 (fqdn
)。例如,在下面的图形文件中,PTM 忽略 FQDN,仅查找 switch04,因为那是它正在运行的交换机的主机名
- 始终将主机名用双引号引起来;例如,
"www.example.com"
以防止ptmd
失败。 - 为避免启动
ptmd
服务时出错,请确保/etc/hosts
和/etc/hostname
都反映您在topology.dot
文件中使用的主机名。
graph G {
hostnametype="hostname"
"cumulus":"swp44" -- "switch04.cumulusnetworks.com":"swp20"
"cumulus":"swp46" -- "switch04.cumulusnetworks.com":"swp22"
}
在下一个示例中,PTM 使用 FQDN 进行比较,并查找 switch05.cumulusnetworks.com,这是它正在运行的交换机的 FQDN
graph G {
hostnametype="fqdn"
"cumulus":"swp44" -- "switch05.cumulusnetworks.com":"swp20"
"cumulus":"swp46" -- "switch05.cumulusnetworks.com":"swp22"
}
全局参数
全局参数应用于拓扑文件中的每个端口。默认情况下 LLDP 处于启用状态;如果不存在关键字,PTM 将对所有端口使用默认值。
graph G {
LLDP=""
"cumulus":"swp44" -- "qct-ly2-04":"swp20"
"cumulus":"swp46" -- "qct-ly2-04":"swp22"
}
每端口参数
每端口参数在端口级别提供更精细的控制。这些参数会覆盖任何全局或编译的默认值。例如
graph G {
LLDP=""
"cumulus":"swp44" -- "qct-ly2-04":"swp20"
"cumulus":"swp46" -- "qct-ly2-04":"swp22"
}
模板
模板提供灵活性,以便您可以选择不同的参数组合并将它们应用于给定的端口。模板指示 ptmd
引用命名的参数字符串而不是默认字符串。在以下配置中,LLDP1 和 LLDP2 是 LLDP 参数的模板
例如
graph G {
LLDP=""
LLDP1="match_type=ifname"
LLDP2="match_type=portdescr"
"cumulus":"swp44" -- "qct-ly2-04":"swp20" [LLDP="lldptmpl=LLDP1"]
"cumulus":"swp46" -- "qct-ly2-04":"swp22" [LLDP="lldptmpl=LLDP2"]
"cumulus":"swp46" -- "qct-ly2-04":"swp22"
}
支持的 LLDP 参数
ptmd
支持以下 LLDP 参数
match_type
,默认为接口名称 (ifname
),但如果您希望lldpd
将拓扑与端口描述而不是接口名称进行比较,则可以接受端口描述 (portdescr
)。您可以全局或在每端口级别设置此参数。match_hostname
,默认为主机名 (hostname
),但允许 PTM 使用 LLDP 提供的完全限定域名 (fqdn
) 匹配拓扑。
以下是端口级别具有 LLDP 的拓扑示例
graph G {
"cumulus-1":"swp44" -- "cumulus-2":"swp20" [LLDP="match_hostname=fqdn"]
"cumulus-1":"swp46" -- "cumulus-2":"swp22" [LLDP="match_type=portdescr"]
}
当您指定 match_hostname=fqdn
时,PTM 会匹配整个 FQDN(在下面的示例中为 cumulus-2.domain.com)。如果您未指定 match_hostname
的值,PTM 将仅基于主机名(下面的 cumulus-3)进行匹配,并忽略 URL 的其余部分
graph G {
"cumulus-1":"swp44" -- "cumulus-2.domain.com":"swp20" [LLDP="match_hostname=fqdn"]
"cumulus-1":"swp46" -- "cumulus-3":"swp22" [LLDP="match_type=portdescr"]
}
BFD
BFD 提供低开销和快速检测两个网络设备之间路径中的故障。PTM 提供了一种统一的机制,用于检测所有介质和协议层上的链路,并与 FRR 集成以启用 BFD。使用 BFD 检测任何两个网络设备之间 IPv4 和 IPv6 单跳或多跳路径的故障,包括单向路径故障检测。有关配置 BFD 的信息,请参阅 BFD。
检查链路状态
您可以启用 PTM 以执行其他检查,以确保路由邻接关系仅在具有连通性且符合 PTM 定义的规范的链路上形成。
您只需要启用 PTM 来检查链路状态。您无需启用 PTM 来确定 BFD 状态。
cumulus@switch:~$ nv set router ptm enable
cumulus@switch:~$ nv config apply
要禁用检查链路状态
cumulus@switch:~$ nv unset router ptm enable
cumulus@switch:~$ nv config apply
cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# ptm-enable
switch(config)# end
switch# write memory
switch# exit
cumulus@switch:~$
要禁用检查链路状态,请设置 no ptm-enable
参数
cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# no ptm-enable
switch(config)# end
switch# write memory
switch# exit
cumulus@switch:~$
要检查接口上的 PTM 状态,请运行 vtysh show interface <interface>
命令。
cumulus@switch:~$ show interface swp51
Interface swp51 is up, line protocol is up
Link ups: 0 last: (never)
Link downs: 0 last: (never)
PTM status: disabled
...
ptmd 服务命令
PTM 以 CSV 格式发送客户端通知。
要启动 ptmd
服务,请运行 sudo systemctl start ptmd.service
命令。topology.dot
文件必须存在才能启动服务。
cumulus@switch:~$ sudo systemctl start ptmd.service
要重启 ptmd
服务,请运行 sudo systemctl restart ptmd.service
命令
cumulus@switch:~$ sudo systemctl restart ptmd.service
要指示 ptmd
服务再次读取 topology.dot
文件以将新配置应用于运行状态而不重启,请运行 sudo systemctl reload ptmd.service
命令
cumulus@switch:~$ sudo systemctl reload ptmd.service
要停止 ptmd
服务,请运行 sudo systemctl stop ptmd.service
命令
cumulus@switch:~$ sudo systemctl stop ptmd.service
要检索 ptmd
服务的当前运行状态,请运行 sudo systemctl status ptmd.service
命令
cumulus@switch:~$ sudo systemctl status ptmd.service
ptmctl 命令
ptmctl
是 ptmd
服务的客户端,它检索交换机上配置的端口的操作状态以及来自 ptmd
的 BFD 会话信息。ptmctl
解析 ptmd
发送的 CSV 通知。有关更多信息,请参阅 man ptmctl
。
ptmctl 示例
以下示例包含 cbl status
列输出中的以下关键字
cbl 状态关键字 | 定义 |
---|---|
pass | 拓扑文件定义了接口,接口接收 LLDP 信息,并且接口的 LLDP 信息与拓扑文件中的信息匹配。 |
fail | 拓扑文件定义了接口,接口接收 LLDP 信息,并且接口的 LLDP 信息与拓扑文件中的信息不匹配。 |
N/A | 拓扑文件定义了接口,但接口未接收到 LLDP 信息。接口可能已关闭或断开连接,或者邻居未发送 LLDP 数据包。N/A 和 fail 状态可能指示需要调查的布线问题。当您将 -l 选项与 ptmctl 一起使用时,不会显示 N/A 状态;输出仅显示正在接收 LLDP 信息的接口。 |
对于基本输出,请使用不带任何选项的 ptmctl
当您通过与 FRR 集成配置 BFD 时,PTM show 命令输出会显示 BFD 状态。
cumulus@switch:~$ sudo ptmctl
-------------------------------------------------------------
port cbl BFD BFD BFD BFD
status status peer local type
-------------------------------------------------------------
swp1 pass pass 11.0.0.2 N/A singlehop
swp2 pass N/A N/A N/A N/A
swp3 pass N/A N/A N/A N/A
要获得更详细的输出,请使用 -d
选项
cumulus@switch:~$ sudo ptmctl -d
--------------------------------------------------------------------------------------
port cbl exp act sysname portID portDescr match last BFD BFD
status nbr nbr on upd Type state
--------------------------------------------------------------------------------------
swp45 pass h1:swp1 h1:swp1 h1 swp1 swp1 IfName 5m: 5s N/A N/A
swp46 fail h2:swp1 h2:swp1 h2 swp1 swp1 IfName 5m: 5s N/A N/A
#continuation of the output
-------------------------------------------------------------------------------------------------
BFD BFD det_mult tx_timeout rx_timeout echo_tx_timeout echo_rx_timeout max_hop_cnt
peer DownDiag
-------------------------------------------------------------------------------------------------
N/A N/A N/A N/A N/A N/A N/A N/A
N/A N/A N/A N/A N/A N/A N/A N/A
要显示 ptmd
服务正在跟踪的活动 BFD 会话的信息,请使用 -b
选项
cumulus@switch:~$ sudo ptmctl -b
----------------------------------------------------------
port peer state local type diag
----------------------------------------------------------
swp1 11.0.0.2 Up N/A singlehop N/A
N/A 12.12.12.1 Up 12.12.12.4 multihop N/A
要显示 LLDP 信息,请使用 -l
选项。输出仅显示 ptmd
服务正在跟踪的活动邻居。
cumulus@switch:~$ sudo ptmctl -l
---------------------------------------------
port sysname portID port match last
descr on upd
---------------------------------------------
swp45 h1 swp1 swp1 IfName 5m:59s
swp46 h2 swp1 swp1 IfName 5m:59s
要显示 ptmd
服务正在跟踪的活动 BFD 会话的详细信息,请使用 -b
和 -d
选项
cumulus@switch:~$ sudo ptmctl -b -d
----------------------------------------------------------------------------------------
port peer state local type diag det tx_timeout rx_timeout
mult
----------------------------------------------------------------------------------------
swp1 fe80::202:ff:fe00:1 Up N/A singlehop N/A 3 300 900
swp1 3101:abc:bcad::2 Up N/A singlehop N/A 3 300 900
#continuation of output
---------------------------------------------------------------------
echo echo max rx_ctrl tx_ctrl rx_echo tx_echo
tx_timeout rx_timeout hop_cnt
---------------------------------------------------------------------
0 0 N/A 187172 185986 0 0
0 0 N/A 501 533 0 0
ptmctl 错误输出
如果拓扑文件中存在错误或没有会话,PTM 将返回相应的输出。典型的错误字符串是
Topology file error [/etc/ptm.d/topology.dot] [cannot find node cumulus] -
please check /var/log/ptmd.log for more info
Topology file error [/etc/ptm.d/topology.dot] [cannot open file (errno 2)] -
please check /var/log/ptmd.log for more info
No Hostname/MgmtIP found [Check LLDPD daemon status] -
please check /var/log/ptmd.log for more info
No BFD sessions . Check connections
No LLDP ports detected. Check connections
Unsupported command
例如
cumulus@switch:~$ sudo ptmctl
-------------------------------------------------------------------------
cmd error
-------------------------------------------------------------------------
get-status Topology file error [/etc/ptm.d/topology.dot]
[cannot open file (errno 2)] - please check /var/log/ptmd.log
for more info
如果您遇到 topology.dot
文件错误,可以使用 dot
(包含在 Graphviz 包中)来验证拓扑文件的语法。
使用 Graphviz 打开拓扑文件,以确保该文件可读且文件格式正确。
如果您从 Windows 系统编辑 topology.dot
文件,请务必仔细检查文件格式;可能存在额外的字符,导致图形无法正常工作。
基本拓扑示例
以下示例显示了一个基本 DOT 文件及其对应的拓扑图。在所有交换机上使用相同的 topology.dot
文件,并且不要为每个设备拆分文件,以便通过在每个设备上使用完全相同的文件来实现轻松自动化。
graph G {
"spine1":"swp1" -- "leaf1":"swp1";
"spine1":"swp2" -- "leaf2":"swp1";
"spine2":"swp1" -- "leaf1":"swp2";
"spine2":"swp2" -- "leaf2":"swp2";
"leaf1":"swp3" -- "leaf2":"swp3";
"leaf1":"swp4" -- "leaf2":"swp4";
"leaf1":"swp5s0" -- "server1":"eth1";
"leaf2":"swp5s0" -- "server2":"eth1";
}

注意事项
端口描述中的逗号
如果 LLDP 邻居通告包含逗号的 PortDescr
,则 ptmctl -d
会在逗号上拆分字符串,并将其组件错误地放置在其他列中。请勿在端口描述中使用逗号。