资讯动态

Linux下PCI设备热插拔实战:手把手教你用sysfs的remove和rescan命令(以Intel I350网卡为例)

发布时间:2026/8/12 6:22:16 来源:尧图企业网站定制
Linux下PCI设备热插拔实战深入解析sysfs操作与Intel I350网卡管理当服务器上的Intel I350网卡突然停止响应或者需要在不重启系统的情况下更换故障设备时掌握PCI设备的热插拔技术就显得尤为重要。本文将带你深入Linux内核的sysfs接口通过实战演示如何安全地对PCI设备进行动态移除与重新识别。1. PCI设备热插拔基础与原理PCI设备热插拔是指在系统运行过程中无需关机即可添加或移除硬件设备的能力。Linux内核通过sysfs文件系统提供了对PCI设备的精细控制接口。1.1 sysfs中的PCI设备表示在/sys/bus/pci/目录下每个PCI设备都有一个对应的子目录命名格式为domain:bus:slot.function。例如/sys/bus/pci/devices/0000:03:00.0/关键文件节点包括remove写入1可触发设备移除rescan写入1可触发总线重新扫描resource显示设备的内存和I/O资源分配1.2 设备树结构解析使用lspci -t命令可以查看PCI设备的树状结构-[0000:00]--01.4-[03]---00.0 Intel Corporation I350 Gigabit Network Connection | \-00.1 Intel Corporation I350 Gigabit Network Connection在这个结构中00:01.4是根端口(root port)03:00.0和03:00.1是I350网卡的两个功能(function)2. 安全移除PCI设备的完整流程2.1 准备工作与状态检查在操作前务必进行以下检查确认设备当前状态lspci -nn | grep I350输出示例03:00.0 Ethernet controller [0200]: Intel Corporation I350 Gigabit Network Connection [8086:1521] (rev 01) 03:00.1 Ethernet controller [0200]: Intel Corporation I350 Gigabit Network Connection [8086:1521] (rev 01)检查设备是否正在使用lsof /dev/sd* # 对于存储设备 ss -tulnp | grep 网卡名 # 对于网络设备备份重要配置ethtool -g eth0 eth0_settings.txt ip addr show eth0 eth0_network.txt2.2 执行设备移除对于Intel I350网卡的两个功能分别执行echo 1 /sys/bus/pci/devices/0000:03:00.0/remove echo 1 /sys/bus/pci/devices/0000:03:00.1/remove关键注意事项确保没有进程正在使用该设备移除操作不可逆务必提前备份配置对于多功能设备可能需要移除所有相关功能2.3 验证移除结果再次运行lspci确认设备已消失检查内核日志dmesg | tail -20预期会看到类似日志[73835.573048] pci 0000:03:00.0: Removing from sysfs [73835.573066] pci 0000:03:00.0: PCIe link lost3. 设备重新扫描与恢复3.1 全局总线扫描方法最简单的恢复方式是触发整个PCI总线的重新扫描echo 1 /sys/bus/pci/rescan这种方法会扫描所有PCI总线重新发现所有未初始化的设备自动加载相应的驱动程序3.2 精确的局部扫描方法对于大型系统全局扫描可能耗时较长。更高效的方法是只扫描特定总线echo 1 /sys/bus/pci/devices/0000:00:01.4/rescan这里00:01.4是I350网卡所在总线的上游端口。这种方法只会扫描bus 03上的设备效率更高。3.3 恢复验证与配置确认设备重新出现lspci -nn | grep I350检查设备资源分配dmesg | grep assigned典型输出[72131.692082] pci 0000:03:00.0: BAR 0: assigned [mem 0xef600000-0xef61ffff] [72131.692087] pci 0000:03:00.1: BAR 0: assigned [mem 0xef620000-0xef63ffff]恢复网络配置ip addr add 192.168.1.100/24 dev eth0 ip link set eth0 up4. 高级应用场景与故障排查4.1 驱动问题处理当设备重新扫描后未被正确识别时手动卸载驱动modprobe -r igb重新加载驱动modprobe igb强制设备探测echo 0000:03:00.0 /sys/bus/pci/drivers_probe4.2 资源冲突解决如果设备无法获得所需资源检查PCI桥设置lspci -vv -s 00:01.4尝试释放其他设备资源必要时调整BIOS中的PCI资源分配4.3 自动化脚本示例以下脚本实现了安全的热插拔流程#!/bin/bash DEVICE0000:03:00.0 BACKUP_DIR/root/pci_backup # 备份配置 mkdir -p $BACKUP_DIR ethtool -i $(basename $(readlink /sys/bus/pci/devices/$DEVICE/net/*)) $BACKUP_DIR/ethtool.txt ip addr show $BACKUP_DIR/network.txt # 安全移除 echo Removing device $DEVICE echo 1 /sys/bus/pci/devices/$DEVICE/remove sleep 2 # 重新扫描 echo Rescanning PCI bus echo 1 /sys/bus/pci/rescan sleep 5 # 恢复配置 echo Restoring configuration ip addr flush dev eth0 ip addr add 192.168.1.100/24 dev eth0 ip link set eth0 up5. 内核机制深度解析5.1 remove操作的内核调用栈当向remove文件写入时内核执行路径如下pci_remove_bus_device → pci_stop_and_remove_bus_device_locked → remove_store → kernfs_fop_write → vfs_write → ksys_write → do_syscall_64关键操作包括停止设备I/O操作调用驱动程序的remove回调释放PCI资源配置从sysfs中移除设备节点5.2 rescan操作的内核实现rescan操作主要完成两个任务资源分配pci_assign_resource → assign_requested_resources_sorted → __assign_resources_sorted → __pci_bus_assign_resources → pci_assign_unassigned_bus_resources → pci_rescan_bus → rescan_store设备探测pci_device_probe → really_probe → driver_probe_device → bus_for_each_drv → __device_attach → pci_bus_add_device → pci_bus_add_devices → pci_rescan_bus → rescan_store在实际项目中我发现精确的局部rescan通过父设备比全局rescan更可靠特别是在处理复杂PCIe拓扑结构时。这种方法减少了系统中断时间对生产环境的影响更小。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价