2. Arista EOS诊断基础环境搭建

Arista EOS 的故障诊断能力之所以强,很大程度上源于它把「网络操作系统」和「Linux 系统」两层诊断入口同时暴露给运维人员。EOS 本身是一个基于 Fedora 的 Linux 发行版,交换机上运行的每个 EOS 进程、每条转发表项、每个硬件计数器,最终都能在 Linux 层面找到对应的进程、文件或内存映射。因此,搭建诊断环境的第一步不是急着敲 show 命令,而是先建立一张「从 CLI 到内核」的入口地图,知道什么问题该从哪一层切入。

四层诊断入口的定位

EOS 的诊断入口可以按抽象层次从高到低分为四层,每一层解决的问题不同:

  • EOS CLI:面向网络语义,用 show、clear、debug 等命令查看协议状态、接口计数、路由表、邻居关系。这是最常用的一层,但它只呈现 EOS 已经「整理好」的信息,遇到进程卡死、内存异常、驱动问题时往往看不到根因。
  • Linux Shell(Bash):通过 bash 命令从 CLI 进入底层 Linux 环境,可以执行 ps、top、ip、netstat、tcpdump、strace 等标准工具,观察进程、线程、socket、文件描述符和系统调用。
  • Sysdb:EOS 的中央状态数据库,所有 agent(如 FibAgent、BgpAgent、IntfAgent)都通过 Sysdb 读写共享状态。用 show sysdb 系列命令可以查看某个路径下的原始键值,判断「CLI 显示的状态」与「agent 实际持有的状态」是否一致。
  • Procfs:即 /proc 文件系统,暴露内核视角的进程、内存、中断、网络统计。例如 /proc/interrupts 看中断分布,/proc/net/dev 看接口收发,/proc/<pid>/stack 看内核栈。

这四层不是并列的四个工具,而是一条从「现象」到「根因」的逐层下钻路径。下图给出它们之间的调用与数据关系。

EOS 四层诊断入口与下钻路径 ① EOS CLI(网络语义层) show interfaces / show ip route / show bgp summary / show lldp neighbors 输出:协议状态、接口计数、邻居关系、路由表 —— 现象层 ② Linux Shell / Bash(系统层) ps -ef / top -H / ip -s link / ss -tlnp / tcpdump -i et1 / strace -p <pid> 输出:进程与线程、socket、抓包、系统调用 —— 行为层 ③ Sysdb(共享状态层) show sysdb / show sysdb path /Sysdb/intf/status/eth/1/ / show sysdb trace 输出:agent 持有的原始键值、状态变更轨迹 —— 状态一致性层 ④ Procfs / 内核(内核层) cat /proc/interrupts / cat /proc/net/dev / cat /proc/<pid>/stack / dmesg 输出:中断分布、内核栈、驱动日志、内存映射 —— 根因层 逐层下钻 进入方式 CLI 直接登录 bash show sysdb bash 后 cat /proc sudo 提权 enable configure terminal length 0 logging buffered management api http ssh 诊断原则:CLI 看现象 → Bash 看行为 → Sysdb 看状态 → Procfs 看根因

从 CLI 进入 Bash 与提权

默认登录 EOS 后处于 CLI 的 user 模式,提示符为 switch>。要进入 Linux 层,直接输入 bash 即可,提示符会变成类似 [admin@switch ~]$。此时身份是 admin,属于受限用户,很多内核文件和进程信息需要 root 权限才能读取。EOS 提供了 sudo 机制,常用做法是:

switch> enable
switch# bash
[admin@switch ~]$ sudo su -
[root@switch ~]# ps -ef | grep -i fib
[root@switch ~]# cat /proc/interrupts | head -20

需要注意,sudo su - 进入的是完整 root shell,操作风险高,生产环境应遵循变更流程。日常诊断更推荐用 sudo <command> 单条执行,例如 sudo tcpdump -i et1 -c 100 -w /tmp/cap.pcap,避免长时间停留在 root 会话中。

Sysdb 的查看方法

Sysdb 是 EOS 内部所有 agent 共享的状态总线,路径采用类似文件系统的层级命名,例如 /Sysdb/intf/status/eth/1/ 保存接口 eth1 的状态,/Sysdb/bgp/ 下保存 BGP 相关状态。查看方式有两种:

switch# show sysdb path /Sysdb/intf/status/eth/1/
switch# show sysdb trace /Sysdb/intf/status/eth/1/operStatus

前者列出该路径下所有键值,后者显示某个键的变更历史。当 CLI 显示接口 up 但流量不通时,可以对比 show interfaces eth1 与 show sysdb path /Sysdb/intf/status/eth/1/ 中的 operStatus,若两者不一致,说明 CLI 缓存或 agent 同步存在问题,需要进一步检查 IntfAgent 进程状态。

Procfs 的典型读取点

/proc 是内核暴露的运行时信息接口,诊断中高频使用的几个文件如下表所示。读取时建议先 sudo,部分文件普通用户不可读。

路径含义典型用途
/proc/interrupts各 CPU 中断计数判断某网卡中断是否集中在单核,排查收包丢包
/proc/net/dev接口收发字节/包/错误计数与 CLI 计数交叉验证,确认丢包发生在驱动还是协议栈
/proc/<pid>/stack进程内核栈进程 D 状态卡死时看阻塞在哪个内核函数
/proc/meminfo内存总量与分配判断是否因内存不足触发 OOM 或 agent 重启
/proc/softirqs软中断统计分析 NET_RX 软中断是否成为瓶颈

实验拓扑与远程采集环境

为了把上述入口串起来练习,建议搭建一个最小实验拓扑:两台 Arista vEOS(或物理交换机)通过 eth1 互联,管理口 eth0 接入管理网,另有一台 Linux 采集服务器。拓扑逻辑如下:

  • SW1 eth1(10.0.1.1/30)—— SW2 eth1(10.0.1.2/30),用于验证接口、LLDP、路由与抓包。
  • SW1/SW2 eth0 管理地址 192.168.10.11/24、192.168.10.12/24,网关 192.168.10.1。
  • 采集服务器 192.168.10.100/24,运行 syslog 与文件接收服务。

远程采集环境的关键配置包括三部分。第一,开启 SSH 与 eAPI,便于远程执行 CLI 和 Bash 命令:

switch# configure terminal
switch(config)# management api http-commands
switch(config-mgmt-api-http-cmds)# protocol https
switch(config-mgmt-api-http-cmds)# no shutdown
switch(config-mgmt-api-http-cmds)# end
switch# show management api http-commands

第二,配置 syslog 指向采集服务器,把诊断期间的日志集中留存:

switch(config)# logging host 192.168.10.100
switch(config)# logging trap informational
switch(config)# logging source-interface Management1

第三,配置 terminal length 0 避免分页,并在采集脚本中使用 FastCli 或 eAPI 批量拉取命令输出。一个可用的远程采集脚本骨架如下,它通过 SSH 登录后依次执行 CLI 命令并把结果落到本地文件:

#!/bin/bash
# collect_eos.sh —— 示例采集脚本
HOST=$1
USER=admin
OUT=./eos_${HOST}_$(date +%Y%m%d_%H%M).txt
CMDS=(
  "show version"
  "show interfaces status"
  "show ip route"
  "show bgp summary"
  "show sysdb path /Sysdb/intf/status/eth/1/"
  "show logging last 200"
)
{
  echo "===== $HOST @ $(date) ====="
  for c in "${CMDS[@]}"; do
    echo "----- $c -----"
    ssh -o StrictHostKeyChecking=no ${USER}@${HOST} "$c"
  done
} > "$OUT" 2>&1
echo "saved to $OUT"

脚本中的命令列表就是一份最小诊断快照,覆盖了版本、接口、路由、BGP、Sysdb 和日志。实际排障时可按问题类型增删,例如怀疑丢包时加入 show interfaces counters errors 和 show platform sand counters。

建议在实验环境中先验证 bash、sudo、show sysdb 三条入口是否可用,再运行采集脚本。若 sudo 被限制,需要检查 aaa authorization 配置或用户角色。
生产环境执行 sudo su -、tcpdump 长时间抓包、strace 附加到关键进程时,可能影响转发性能或触发进程超时,务必在维护窗口或经审批后操作,并控制抓包文件大小与时长。