最简方案是用ip -s link show eth0查RX errors聚合值,持续上涨表明物理层或驱动问题;再用ethtool -S定位具体错误类型如rx_crc_errors,并区分网卡与硬盘UDMA_CRC_Error_Count。

直接看 ip -s link show 的 RX errors 是最简方案
系统没有单独的“CRC错误数”字段,RX errors 是物理层错误的聚合值,包含 rx_crc_errors、rx_frame_errors 等。只要它在持续上涨,就说明底层链路或驱动有问题,不是配置问题。
执行命令即可快速确认:
ip -s link show eth0 | grep -A 2 "RX:"
输出中类似这样的行就是关键:
RX: bytes packets errors dropped overruns mcast<br> 12345678 12345 42 0 0 0
注意:errors 这一列是重点;dropped 和 overruns 属于协议栈或 ring buffer 问题,和 CRC 无关。
ethtool -S 才能定位到真实 CRC 错误类型
ip -s link 只告诉你“错了”,但不知道哪类错。ethtool -S 读取网卡驱动寄存器,能暴露具体错误项,比如 rx_crc_errors 或 rx_frame_errors。
- 先确保已安装:
sudo apt install ethtool(Debian/Ubuntu)或sudo yum install ethtool(RHEL/CentOS) - 过滤关键字段更高效:
ethtool -S eth0 | grep -i "crc\|frame\|miss\|over"
- 常见对应关系:
–rx_crc_errors高 → 网线松动、交换机端口故障、线缆质量差
–rx_missed_errors高 → ring buffer 太小或中断处理不及时,不是物理层问题
–rx_over_errors或rx_fifo_errors→ 接收 FIFO 溢出,常与驱动或队列设置有关
别信 /proc/net/dev 的 errs 列
这个文件第三列叫 errs,但它只是 ip -s link 中 RX errors 的镜像,而且部分驱动(尤其是虚拟网卡或老芯片)根本不会动态更新它。
典型陷阱:
-
cat /proc/net/dev显示errs为 0,但ip -s link show显示非零 → 优先信后者 - 它的
drop列对应的是rx_dropped,无法区分是 backlog 溢出还是 skb 分配失败 - 该文件本质是静态注册的 proc 接口,不能替代实时寄存器读取
硬盘 UDMA_CRC 错误和网卡 CRC 错误别混了
看到 “CRC” 就查网卡,容易忽略另一个常见来源:硬盘 SATA/U.2 接口的 UDMA_CRC_Error_Count。
如果系统日志(dmesg)里频繁出现 hard resetting link 或 UNC 错误,要立刻检查硬盘:
sudo smartctl -a /dev/sda | grep -i "udma\|crc"
输出中若 UDMA_CRC_Error_Count(ID 199)> 0,且其他 SMART 值正常,基本可锁定是数据线接触不良或主板 SATA 接口老化,跟网卡无关。
网卡 CRC 错误和硬盘 CRC 错误共享同一术语,但发生层完全不同:一个在 OSI 第一层(物理层以太网),一个在 ATA 协议的数据链路层。排查时必须分清路径 —— 网络问题查 ethtool,存储问题查 smartctl。


















