监控和故障排除

本章介绍监控和故障排除 Cumulus Linux 的基础知识。

串行控制台

如果您经常重启交换机或没有可靠的网络连接,请使用串行控制台调试问题。

默认串行控制台波特率为 115200,这也是 ONIE 使用的波特率。

配置串行控制台

在 x86 交换机上,您可以通过编辑 grub 配置串行控制台波特率。

grub 中的错误配置设置会导致通过控制台无法访问交换机。在实施 grub 更改之前,请仔细检查。

波特率的有效值是

  • 300
  • 600
  • 1200
  • 2400
  • 4800
  • 9600
  • 19200
  • 38400
  • 115200

要更改串行控制台波特率

  1. 编辑 /etc/default/grub 文件,并为 --speed 和 console 变量提供有效值

    GRUB_SERIAL_COMMAND="serial --port=0x2f8 --speed=115200 --word=8 --parity=no --stop=1"
    GRUB_CMDLINE_LINUX="console=ttyS1,115200n8 cl_platform=accton_as5712_54x"
    
  2. 保存对 grub 配置的更改后,在命令提示符下键入以下内容

    cumulus@switch:~$ update-grub
    
  3. 如果您计划通过串行控制台访问交换机 BIOS,则需要在交换机 BIOS 中更新波特率。有关更多信息,请参阅此知识库文章

  4. 重启交换机。

更改控制台日志级别

默认情况下,控制台打印除调试消息外的所有日志消息。要调整控制台日志记录以减少冗余,以便不打印某些级别的消息,请运行 dmesg -n <level> 命令,其中日志级别为

级别描述
0紧急消息(系统即将崩溃或不稳定)。
1严重情况;您必须立即采取行动。
2危急情况(严重的硬件或软件故障)。
3错误情况(通常由驱动程序用于指示硬件困难)。
4警告消息(不严重,但可能指示问题)。
5许多情况的消息通知,包括安全事件。
6信息性消息。
7调试消息。

只有值低于指定级别的消息才会打印到控制台。例如,如果您指定级别 3,则只有级别 2(危急情况)、级别 1(严重情况)和级别 0(紧急消息)打印到控制台

cumulus@switch:~$ sudo dmesg -n 3

您也可以运行 dmesg --console-level <level> 命令,其中日志级别为 emergalertcriterrwarnnoticeinfodebug。例如,要打印危急情况,请运行以下命令

cumulus@switch:~$ sudo dmesg --console-level crit

dmesg 命令应用到下次重启。

有关 dmesg 命令的更多详细信息,请运行 man dmesg

显示系统信息

Cumulus Linux 提供了获取系统信息和显示您正在运行的 Cumulus Linux 版本的命令。在执行系统诊断、排除性能故障或提交支持请求时,请使用这些命令。

要显示有关交换机上运行的 Cumulus Linux 版本的信息,请运行 nv show system 命令

cumulus@switch:~$ nv show system
            operational          applied
-----------  -------------------  -------
hostname     leaf01                
build        Cumulus Linux 5.12        
uptime       0:02:50                     
timezone     Etc/UTC                     
maintenance                              
  mode       disabled                    
  ports      enabled

要以字节为单位显示系统内存信息,请运行 nv show system memory 命令

cumulus@switch:~$ nv show system memory
Type      Buffers     Cache        Free         Total         Used         Utilization
--------  ----------  -----------  -----------  ------------  -----------  -----------
Physical  81661952 B  571834368 B  373276672 B  1813528576 B  786755584 B  79.4%
Swap                               0 B          0 B           0 B          0.0%

要显示系统 CPU 信息,请运行 nv show system cpu 命令

cumulus@switch:~$ nv show system cpu
             operational                  
-----------  -----------------------------
model        QEMU Virtual CPU version 2.5+
core-count   1                            
utilization  0.3%

要显示有关交换机的一般信息,请运行 nv show platform 命令

cumulus@switch:~$ nv show platform
              operational                            
------------  ---------------------------------------
system-mac    44:38:39:22:01:b1                      
manufacturer  Accton                                 
cpu           x86_64 QEMU Virtual CPU version 2.5+ x1
memory        1751856 kB                             
disk-size     n/a                                    
port-layout   n/a                                    
asic-model    n/a                                    
system-uuid   a6bfbd6d-70ac-426f-b46d-3743e16e1f4b

使用 cl-support 文件进行诊断

您可以生成一个单独导出的 cl-support 文件,其中包含有关交换机配置的各种详细信息,并且对于远程调试和故障排除非常有用。

在提交支持请求之前,生成一个 cl-support 文件以调查问题。您可以运行 NVUE nv action generate system tech-support 命令或 Linux sudo cl-support 命令

cumulus@switch:~$ nv action generate system tech-support
...

有关更多信息,请参阅了解 cl-support 输出文件

将日志文件发送到 syslog 服务器

您可以配置 Cumulus Linux 将日志文件发送到一个或多个远程 syslog 服务器。

以下示例配置 Cumulus Linux 将日志文件发送到远程 syslog 服务器,该服务器的地址为 192.168.0.254,位于默认 VRF 上,端口为 514,使用 UDP。

您必须在命令中指定 VRF。

cumulus@switch:~$ nv set service syslog default server 192.168.0.254 port 514
cumulus@switch:~$ nv set service syslog default server 192.168.0.254 protocol udp
cumulus@switch:~$ nv config apply

该配置创建 /etc/rsyslog.d/11-remotesyslog-default.conf 文件。该文件具有以下内容

cumulus@switch:~$ sudo cat /etc/rsyslog.d/11-remotesyslog-default.conf
# Auto-generated by NVUE!
# Any local modifications will prevent NVUE from re-generating this file.
# md5sum: c8e094c868c7f9be4cfa6ccec752b44b
#
# Remote syslog servers configured through CUE
#
action(type="omfwd" Target="192.168.0.254" Port="514" Protocol="udp")

日志技术细节

rsyslog 在 Cumulus Linux 上执行日志记录。rsyslog 提供本地日志记录到 syslog 文件以及将日志导出到外部 syslog 服务器的功能。所有 rsyslog 日志文件都使用高精度时间戳

2015-08-14T18:21:43.337804+00:00 cumulus switchd[3629]: switchd.c:1409 switchd version 1.0-cl2.5+5

Cumulus Linux 在 /var/log/ 目录中包含应用程序,这些应用程序直接写入日志文件,而无需通过 rsyslog

所有 Cumulus Linux 规则都位于 /etc/rsyslog.d/ 中的单独文件中,rsyslog/etc/rsyslog.conf 文件的 GLOBAL DIRECTIVES 部分末尾调用这些文件。rsyslog 忽略 rsyslog.conf 文件末尾的 RULES 部分;/etc/rsyslog.d 文件中的规则必须处理消息,/etc/rsyslog.d/99-syslog.conf 文件中的最后一行会丢弃这些消息。

本地日志记录

Cumulus Linux 通过 rsyslog 发送日志,rsyslog 将日志写入 /var/log 目录中的文件。/etc/rsyslog.d/ 目录中有默认规则,用于定义日志的写入位置

规则目的
10-rules.conf设置日志消息的默认值,包括日志格式和日志速率限制。
15-crit.confcritalertemerg 日志消息记录到 /var/log/crit.log,以确保它们不会轮换掉。
20-clagd.confclagd 消息记录到 /var/log/clagd.log 以用于MLAG
22-linkstate.conf将所有物理和逻辑网络链路的链路状态更改记录到 /var/log/linkstate
25-switchd.confswitchd 消息记录到 /var/log/switchd.log
30-ptmd.confptmd 消息记录到 /var/log/ptmd.log 以用于规定性拓扑管理器
35-rdnbrd.confrdnbrd 消息记录到 /var/log/rdnbrd.log 以用于重新分发邻居
42-nvued.confnvued 消息记录到 /var/log/nvued.log 以用于 NVUE。
45-frr.conf将路由协议消息记录到 /var/log/frr/frr.log。这包括 BGP 和 OSPF 日志消息。
50-netq-agent.conf将 NetQ 代理消息记录到 /var/log/netq-agent.log
50-netqd.confnetqd 消息记录到 /var/log/netqd.log
55-dhcpsnoop.conf将 DHCP 侦听消息记录到 /var/log/dhcpsnoop.log
66-ptp4l.conf将 PTP 消息记录到 /var/log/ptp4l.log
99-syslog.conf将所有剩余的使用 rsyslog 的进程发送到 /var/log/syslog

Cumulus Linux 轮换并将日志文件压缩到存档中。不使用 rsyslog 的进程将其写入 /var/log 目录中的自己的日志文件。有关特定日志文件的更多信息,请参阅故障排除日志文件

启用远程 syslog

Cumulus Linux 不会将所有日志消息发送到远程服务器。要将其他日志文件(例如 switchd 日志)发送到 syslog 服务器,请按照以下步骤操作

  1. /etc/rsyslog.d/ 中创建一个文件。确保文件名以小于 99 的数字开头,以便在日志消息进入之前执行,例如 20-clagd.conf25-switchd.conf。以下示例文件的名称为 /etc/rsyslog.d/11-remotesyslog.conf。添加类似于以下内容的内容

    ## Logging switchd messages to remote syslog server
    
    @192.168.1.2:514
    

    此配置将日志消息发送到远程 syslog 服务器,用于以下进程:clagdswitchdptmdrdnbrdnvuedsyslog。它遵循与 /var/log/syslog 文件相同的语法,其中 @ 表示 UDP,192.168.12syslog 服务器的 IP 地址,514 是 UDP 端口。

    • 对于基于 TCP 的 syslog,请在 IP 地址 @@192.168.1.2:514 之前使用两个 @@。
    • /etc/rsyslog.d/ 中的文件编号决定了规则如何安装到 rsyslog.d 中。编号较低的规则首先处理,rsyslog 处理以 stop 关键字终止。例如,FRR 的 rsyslog 配置位于 45-frr.conf 文件中,文件底部有一个显式的 stop。FRR 消息仅记录到本地磁盘上的 /var/log/frr/frr.log 文件(这些消息不会使用默认配置发送到远程服务器)。要远程记录 FRR 消息以及将 FRR 消息写入本地磁盘,请将 99-syslog.conf 文件重命名为 11-remotesyslog.conf11-remotesyslog.conf 规则(传输到远程服务器)首先处理 FRR 消息,然后 45-frr.conf 文件继续处理消息(写入 /var/log/frr/frr.log 文件中的本地磁盘)。
    • 请勿将 imfile 模块与 rsyslogd 写入的任何文件一起使用。

  2. 重启 rsyslog。

    cumulus@switch:~$ sudo systemctl restart rsyslog.service
    

在启用管理 VRF 的情况下写入 syslog

您可以通过应用以下配置在启用管理 VRF的情况下写入 syslog;/etc/rsyslog.d/11-remotesyslog.conf 文件注释掉了此配置。

cumulus@switch:~$ cat /etc/rsyslog.d/11-remotesyslog.conf
## Copy all messages to the remote syslog server at 192.168.0.254 port 514
action(type="omfwd" Target="192.168.0.254" Device="mgmt" Port="514" Protocol="udp")

对于每个 syslog 服务器,配置唯一的 action 行。例如,要配置两个 syslog 服务器,地址分别为 192.168.0.254 和 10.0.0.1

cumulus@switch:~$ cat /etc/rsyslog.d/11-remotesyslog.conf
## Copy all messages to the remote syslog servers at 192.168.0.254 and 10.0.0.1 port 514
action(type="omfwd" Target="192.168.0.254" Device="mgmt" Port="514" Protocol="udp")
action(type="omfwd" Target="10.0.0.1" Device="mgmt" Port="514" Protocol="udp")

如果您配置远程日志记录以使用 TCP 协议,则当远程 syslog 服务器不可达时,本地日志记录可能会停止。此外,如果您配置远程日志记录以使用 UDP 协议,则当 UDP 服务器不可达时,本地日志记录可能会停止,因为没有可用于目标 IP 地址的路由。

为避免此行为,请在 rsyslog 配置中配置磁盘队列大小和最大重试次数

action(type="omfwd" Target="172.28.240.15" Device="mgmt" Port="1720" Protocol="tcp" action.resumeRetryCount="100" queue.type="linkedList" queue.size="10000")
action(type="omfwd" Target="172.28.240.15" Device="mgmt" Port="540" Protocol="udp" action.resumeRetryCount="100" queue.type="linkedList" queue.size="10000")

速率限制 syslog 消息

如果您想限制从各个进程写入 syslog 文件的 syslog 消息数量,请将以下配置添加到 /etc/rsyslog.conf 文件。调整 interval 和 burst 值,以将消息速率限制为您的环境所需的适当级别。有关更多信息,请阅读rsyslog 文档

module(load="imuxsock"
      SysSock.RateLimit.Interval="2" SysSock.RateLimit.Burst="50")

以下测试脚本显示了速率限制输出的示例。

示例测试脚本

无害的 syslog 错误:无法重置 devices.list

当您运行 systemctl daemon-reload 并在系统启动期间,以下消息会记录到 /var/log/syslog

systemd[1]: Failed to reset devices.list on /system.slice: Invalid argument

此消息是无害的,您可以忽略它。当 systemd 尝试更改只读组属性时,它会记录此消息。Cumulus Linux 修改了 systemd 的上游版本,默认情况下不记录此消息。

当您安装 Debian 软件包时,systemctl daemon-reload 命令会运行。升级软件包时,您会多次看到此消息。

排除 syslog 故障

您可以使用以下命令来排除 syslog 问题。

验证 rsyslog 是否正在运行

要验证 rsyslog 服务是否正在运行,请使用 sudo systemctl status rsyslog.service 命令

cumulus@leaf01:mgmt-vrf:~$ sudo systemctl status rsyslog.service
rsyslog.service - System Logging Service
  Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled)
  Active: active (running) since Sat 2017-12-09 00:48:58 UTC; 7min ago
    Docs: man:rsyslogd(8)
          http://www.rsyslog.com/doc/
Main PID: 11751 (rsyslogd)
   Tasks: 4 (limit: 2032)
     Memory: 1.1M
        CPU: 20ms
     CGroup: /system.slice/rsyslog.service
             └─8587 /usr/sbin/rsyslogd -n -iNONE

Dec 09 00:48:58 leaf01 systemd[1]: Started System Logging Service.

验证您的 rsyslog 配置

在手动更改 /etc/rsyslog.d 目录中的任何文件后,请使用 sudo rsyslogd -N1 命令来识别配置文件中阻止 rsyslog 服务启动的任何错误。

在以下示例中,配置管理 VRF 的 syslog 的 11-remotesyslog.conf 文件中缺少右括号

cumulus@leaf01:mgmt-vrf:~$ cat /etc/rsyslog.d/11-remotesyslog.conf
action(type="omfwd" Target="192.168.0.254" Device="mgmt" Port="514" Protocol="udp"

cumulus@leaf01:mgmt-vrf:~$ sudo rsyslogd -N1
rsyslogd: version 8.4.2, config validation run (level 1), master config /etc/rsyslog.conf
syslogd: error during parsing file /etc/rsyslog.d/15-crit.conf, on or before line 3: invalid character '$' in object definition - is there an invalid escape sequence somewhere? [try http: /www.rsyslog.com/e/2207 ]
rsyslogd: error during parsing file /etc/rsyslog.d/15-crit.conf, on or before line 3: syntax error on token 'crit_log' [try http://www.rsyslog.com/e/2207 ]

更正无效语法后,发出 sudo rsyslogd -N1 命令会产生以下输出。

cumulus@leaf01:mgmt-vrf:~$ cat /etc/rsyslog.d/11-remotesyslog.conf
action(type="omfwd" Target="192.168.0.254" Device="mgmt" Port="514" Protocol="udp")
cumulus@leaf01:mgmt-vrf:~$ sudo rsyslogd -N1
rsyslogd: version 8.4.2, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.

tcpdump

如果 syslog 服务器不可访问以验证 syslog 消息是否正在导出,您可以使用 tcpdump

在以下示例中,syslog 服务器使用 192.168.0.254 用于端口 514 上的 UDP syslog 消息

cumulus@leaf01:mgmt-vrf:~$ sudo tcpdump -i eth0 host 192.168.0.254 and udp port 514

要生成 syslog 消息,请在另一个会话中使用 sudo,例如 sudo date。使用 sudo 会生成 authpriv 日志。

cumulus@leaf01:mgmt-vrf:~$ sudo tcpdump -i eth0 host 192.168.0.254 and udp port 514
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:57:15.356836 IP leaf01.lab.local.33875 > 192.168.0.254.syslog: SYSLOG authpriv.notice, length: 105
00:57:15.364346 IP leaf01.lab.local.33875 > 192.168.0.254.syslog: SYSLOG authpriv.info, length: 103
00:57:15.369476 IP leaf01.lab.local.33875 > 192.168.0.254.syslog: SYSLOG authpriv.info, length: 85

要查看 syslog 文件的内容,请使用 tcpdump -X 选项

cumulus@leaf01:mgmt-vrf:~$ sudo tcpdump -i eth0 host 192.168.0.254 and udp port 514 -X -c 3
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:59:15.980048 IP leaf01.lab.local.33875 > 192.168.0.254.syslog: SYSLOG authpriv.notice, length: 105
0x0000: 4500 0085 33ee 4000 4011 8420 c0a8 000b E...3.@.@.......
0x0010: c0a8 00fe 8453 0202 0071 9d18 3c38 353e .....S...q..<85>
0x0020: 4465 6320 2039 2030 303a 3539 3a31 3520 Dec..9.00:59:15.
0x0030: 6c65 6166 3031 2073 7564 6f3a 2020 6375 leaf01.sudo:..cu
0x0040: 6d75 6c75 7320 3a20 5454 593d 7074 732f mulus.:.TTY=pts/
0x0050: 3120 3b20 5057 443d 2f68 6f6d 652f 6375 1.;.PWD=/home/cu
0x0060: 6d75 6c75 7320 3b20 5553 4552 3d72 6f6f mulus.;.USER=roo
0x0070: 7420 3b20 434f 4d4d 414e 443d 2f62 696e t.;.COMMAND=/bin
0x0080: 2f64 6174 65 /date