setpci更友好的界面和更多的调试功能,常用于PCI设备的性能分析、故障排除和寄存器调试。
pcitweak 不是所有Linux发行版的标准工具,可能需要从源码编译安装。它是一个底层硬件调试工具,错误使用可能导致系统不稳定。
pcitweak 是一个强大的PCI设备调试工具,它结合了lspci的信息显示功能和setpci的寄存器操作功能,并添加了许多调试和性能分析特性。它通常用于以下场景:
pcitweak 通常需要从源码编译安装,因为它不是主流发行版的官方包:
# Ubuntu/Debian
sudo apt update
sudo apt install build-essential git libpci-dev
# CentOS/RHEL
sudo yum groupinstall "Development Tools"
sudo yum install git pciutils-devel
git clone https://git.kernel.org/pub/scm/utils/pciutils/pciutils.git
cd pciutils
make
sudo make install
which pcitweak
pcitweak --version
pcitweak工具。如果找不到,可以尝试其他仓库或第三方提供的版本。
pcitweak [全局选项] 命令 [命令选项] [参数]
pcitweak 设备标识符 [操作]pcitweak -s 设备标识符 命令pcitweak -d 厂商:设备 命令| 参数 | 说明 |
|---|---|
-h 或 --help |
显示帮助信息 |
-V 或 --version |
显示版本信息 |
-v 或 --verbose |
详细输出模式 |
-q 或 --quiet |
安静模式,减少输出 |
-s [[域]:]总线:设备.功能 |
指定要操作的PCI设备 |
-d [厂商]:[设备] |
按厂商和设备ID选择设备 |
-c 或 --class |
按设备类别筛选 |
-t 或 --tree |
以树状结构显示设备 |
-D 或 --dump |
转储设备配置空间 |
-M 或 --monitor |
监控寄存器变化 |
-T 或 --test |
执行设备测试 |
-R 或 --read |
读取寄存器值 |
-W 或 --write |
写入寄存器值 |
-A 或 --analyze |
分析设备性能 |
-C 或 --check |
执行规范一致性检查 |
显示指定设备的详细信息:
sudo pcitweak -s 01:00.0
以树状结构显示PCI拓扑:
sudo pcitweak -t
显示所有NVIDIA设备的详细信息:
sudo pcitweak -d 10de:
转储设备完整配置空间:
sudo pcitweak -s 01:00.0 -D
转储并以十六进制和ASCII显示:
sudo pcitweak -s 01:00.0 -D -v
分析设备配置:
sudo pcitweak -s 01:00.0 -A
输出可能包括BAR分析、中断配置、电源管理等信息。
读取命令寄存器:
sudo pcitweak -s 01:00.0 -R 04
写入命令寄存器(启用总线主控):
sudo pcitweak -s 01:00.0 -W 04=0004
批量读取多个寄存器:
sudo pcitweak -s 01:00.0 -R 00,04,08,0c,10
监控寄存器变化:
sudo pcitweak -s 01:00.0 -M 04
监控多个寄存器:
sudo pcitweak -s 01:00.0 -M 04,08,0c
设置监控间隔(毫秒):
sudo pcitweak -s 01:00.0 -M 04 -i 100
执行设备基本测试:
sudo pcitweak -s 01:00.0 -T
检查设备是否符合PCI规范:
sudo pcitweak -s 01:00.0 -C
检查所有设备的规范一致性:
sudo pcitweak -C
详细检查并生成报告:
sudo pcitweak -s 01:00.0 -C -v > pci_check_report.txt
检查特定设备类别的规范:
# 检查所有网络设备(类别0200)
sudo pcitweak -c 0200 -C
分析设备性能特征:
sudo pcitweak -s 01:00.0 -A performance
分析DMA性能:
sudo pcitweak -s 01:00.0 -A dma
分析中断性能:
sudo pcitweak -s 01:00.0 -A interrupt
生成性能报告:
#!/bin/bash
DEVICE="01:00.0"
REPORT_FILE="pci_perf_$(date +%Y%m%d_%H%M%S).txt"
echo "PCI设备性能分析报告" > "$REPORT_FILE"
echo "====================" >> "$REPORT_FILE"
echo "设备: $DEVICE" >> "$REPORT_FILE"
echo "分析时间: $(date)" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
sudo pcitweak -s "$DEVICE" -A >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
echo "中断配置分析:" >> "$REPORT_FILE"
sudo pcitweak -s "$DEVICE" -R 3c,3d >> "$REPORT_FILE"
echo "报告已保存到: $REPORT_FILE"
pcitweak 的配置空间分析功能可以解析PCI配置空间的各个字段:
sudo pcitweak -s 01:00.0 --analyze-config
输出示例:
PCI 设备分析: 0000:01:00.0
================================
设备识别:
厂商ID: 10de (NVIDIA Corporation)
设备ID: 2204 (GA102 [GeForce RTX 3090])
修订ID: a1
类别: 0300 (显示控制器)
命令寄存器 (0x04): 0006
[x] I/O Space Enabled
[x] Memory Space Enabled
[x] Bus Master Enabled
[ ] Special Cycle Monitor
[ ] Memory Write & Invalidate
[ ] VGA Palette Snoop
[ ] Parity Error Response
[ ] Wait Cycle Control
[ ] System Error Enable
[ ] Fast Back-to-Back Enable
状态寄存器 (0x06): 0010
[ ] Capabilities List
[ ] 66MHz Capable
[ ] User Definable Features
[ ] Fast Back-to-Back Capable
[x] Master Data Parity Error
[ ] DEVSEL Timing: Fast (0)
BAR 寄存器:
BAR0: fd000000 (32-bit, non-prefetchable, Memory)
BAR1: e0000000 (64-bit, prefetchable, Memory)
BAR2: f0000000 (64-bit, prefetchable, Memory)
BAR3: 00000000 (未使用)
BAR4: 0000c000 (I/O端口)
BAR5: fd080000 (32-bit, non-prefetchable, Memory)
中断配置:
中断线: 10 (IRQ 16)
中断引脚: A (INT A)
电源管理:
当前状态: D0 (完全供电)
支持状态: D0, D1, D2, D3
版本: 1.2
pcitweak 提供多种故障诊断功能:
sudo pcitweak -s 01:00.0 --diagnose
检查设备状态、驱动绑定、中断分配等。
sudo pcitweak -s 01:00.0 --test-connectivity
测试设备与总线的连接性。
sudo pcitweak -s 01:00.0 --check-registers
验证寄存器值的合理性。
sudo pcitweak -s 01:00.0 --test-dma
测试设备的DMA功能。
#!/bin/bash
DEVICE=${1:-"01:00.0"}
echo "PCI设备故障诊断报告"
echo "===================="
echo "设备: $DEVICE"
echo "时间: $(date)"
echo ""
# 检查设备是否存在
if ! sudo pcitweak -s "$DEVICE" --quick-check > /dev/null 2>&1; then
echo "❌ 设备不存在或无法访问"
exit 1
fi
echo "✅ 设备可访问"
# 检查驱动绑定
DRIVER=$(sudo pcitweak -s "$DEVICE" --get-driver)
if [ -z "$DRIVER" ] || [ "$DRIVER" = "(none)" ]; then
echo "⚠️ 警告: 设备无驱动绑定"
else
echo "✅ 驱动绑定: $DRIVER"
fi
# 检查命令寄存器
CMD_REG=$(sudo pcitweak -s "$DEVICE" -R 04 | awk '{print $NF}')
if [ $((0x$CMD_REG & 0x0007)) -eq 0 ]; then
echo "⚠️ 警告: 设备可能被禁用 (命令寄存器: $CMD_REG)"
else
echo "✅ 设备已启用 (命令寄存器: $CMD_REG)"
fi
# 检查中断配置
IRQ_LINE=$(sudo pcitweak -s "$DEVICE" -R 3c | awk '{print $NF}')
if [ "$IRQ_LINE" = "ff" ] || [ "$IRQ_LINE" = "00" ]; then
echo "⚠️ 警告: 中断未正确配置 (中断线: $IRQ_LINE)"
else
echo "✅ 中断已配置 (中断线: $IRQ_LINE)"
fi
echo ""
echo "诊断完成"
pcitweak 的性能调优功能可以帮助优化PCI设备性能:
# 查看当前Latency Timer
sudo pcitweak -s 01:00.0 --get-latency
# 设置Latency Timer(0-255,通常64-128为佳)
sudo pcitweak -s 01:00.0 --set-latency 128
# 查看当前Cache Line Size
sudo pcitweak -s 01:00.0 --get-cacheline
# 设置Cache Line Size(通常与CPU cache line对齐)
sudo pcitweak -s 01:00.0 --set-cacheline 64
# 启用中断合并(如果设备支持)
sudo pcitweak -s 01:00.0 --enable-msi
# 设置MSI-X向量数量
sudo pcitweak -s 01:00.0 --set-msix-vectors 32
# 监控设备性能计数器
sudo pcitweak -s 01:00.0 --monitor-perf --interval 1000 --duration 30
--dry-run模拟操作-v参数获取详细信息dmesg和内核日志分析自动化PCI设备健康检查:
#!/bin/bash
# PCI设备健康检查脚本
LOG_FILE="/var/log/pci_health_$(date +%Y%m%d).log"
echo "PCI设备健康检查报告 - $(date)" > "$LOG_FILE"
check_device() {
local device=$1
echo "检查设备: $device" | tee -a "$LOG_FILE"
# 检查设备可访问性
if ! sudo pcitweak -s "$device" --quick-check > /dev/null 2>&1; then
echo " ❌ 设备不可访问" | tee -a "$LOG_FILE"
return 1
fi
# 检查驱动绑定
local driver=$(sudo pcitweak -s "$device" --get-driver 2>/dev/null)
if [ -z "$driver" ] || [ "$driver" = "(none)" ]; then
echo " ⚠️ 无驱动绑定" | tee -a "$LOG_FILE"
else
echo " ✅ 驱动: $driver" | tee -a "$LOG_FILE"
fi
# 检查设备状态
local status=$(sudo pcitweak -s "$device" --get-status 2>/dev/null)
echo " 📊 状态: $status" | tee -a "$LOG_FILE"
# 检查错误计数器
local errors=$(sudo pcitweak -s "$device" --get-errors 2>/dev/null)
if [ -n "$errors" ] && [ "$errors" != "0" ]; then
echo " ⚠️ 错误计数: $errors" | tee -a "$LOG_FILE"
fi
echo "" | tee -a "$LOG_FILE"
return 0
}
# 检查所有PCI设备
echo "开始检查所有PCI设备..." | tee -a "$LOG_FILE"
echo "==============================" | tee -a "$LOG_FILE"
for device in $(sudo pcitweak --list-devices | awk '{print $1}'); do
check_device "$device"
done
echo "检查完成,报告保存到: $LOG_FILE"
PCI设备性能优化脚本:
#!/bin/bash
# PCI设备性能优化脚本
DEVICE="01:00.0" # 网络控制器或存储控制器
echo "优化PCI设备性能: $DEVICE"
# 1. 启用总线主控
echo "启用总线主控..."
sudo pcitweak -s "$DEVICE" -W 04=0006
# 2. 优化Latency Timer(减少延迟)
echo "优化Latency Timer..."
sudo pcitweak -s "$DEVICE" --set-latency 64
# 3. 设置合适的Cache Line Size
echo "设置Cache Line Size..."
sudo pcitweak -s "$DEVICE" --set-cacheline 64
# 4. 启用MSI中断(如果支持)
echo "检查MSI支持..."
if sudo pcitweak -s "$DEVICE" --check-msi | grep -q "supported"; then
echo "启用MSI中断..."
sudo pcitweak -s "$DEVICE" --enable-msi
fi
# 5. 验证优化结果
echo "验证优化结果..."
sudo pcitweak -s "$DEVICE" --analyze performance
echo "性能优化完成"
lspci - 列出PCI设备信息setpci - 配置PCI寄存器pcimodules - 显示PCI设备模块信息update-pciids - 更新PCI ID数据库pciutils - PCI工具集合dmidecode - DMI/SMBIOS信息edid-decode - 显示EDID信息i2c-tools - I2C总线工具spi-tools - SPI总线工具usbutils - USB设备工具pcitweak直接操作硬件寄存器,错误使用可能导致系统崩溃或硬件损坏