在 Linux 中重新枚举和使用 PCIe SSD 而无需关机
Posted
技术标签:
【中文标题】在 Linux 中重新枚举和使用 PCIe SSD 而无需关机【英文标题】:Re-Enumerate and use PCIe SSD in Linux without shutdown 【发布时间】:2016-07-01 12:48:01 【问题描述】:早安,
我目前正在开展一个项目,通过 VDBench 和 Iometer 等基准程序不断更换和测试 PCIe SSD。我现在面临的问题,仅在 Linux 端(在 Windows 上运行良好)是,如果驱动器在初始启动时没有打开,它们永远不会出现在 GParted 或磁盘下。这是我所做的:
冷启动,PCIe 插卡 SSD 已关闭。然后通过逻辑控制的直通卡打开电源,以确保电源和短路不成问题。
我打开设备,然后运行:
sudo sh -c "echo 1 > /sys/bus/pci/rescan"
表演
lspci -tv
设备在树中显示没有问题。但是,当我在磁盘下检查时,它不存在。
我尝试了一堆不同的命令,但似乎没有一个对我有帮助。我试过了
partprobe
什么都没做。和:
sudo sh -c "echo 1 > /sys/bus/pci/devices/0000:82:00.0/remove"
又进行了一次重新扫描:
sudo sh -c "echo 1 > /sys/bus/pci/rescan"
还有:
sudo sh -c "echo 1 > /sys/bus/pci/devices/0000:82:00.0/enable"
还是什么都没有。还跑了:
dmesg
其中显示,除其他外:
[ 68.128778] pci 0000:82:00.0: [8086:0953] type 00 class 0x010802
[ 68.128797] pci 0000:82:00.0: reg 0x10: [mem 0x00000000-0x00003fff 64bit]
[ 68.128820] pci 0000:82:00.0: reg 0x30: [mem 0x00000000-0x0000ffff pref]
[ 68.133398] pci 0000:84:00.0: [1c58:0003] type 00 class 0x010802
..............................
[ 68.141751] nvme 0000:82:00.0: enabling device (0100 -> 0102)
..............................
我确实在 dmesg 中看到很多其他地址的失败,例如:
[ 1264.718446] pcieport 0000:03:04.0: BAR 14: no space for [mem size 0x00400000]
[ 1264.718448] pcieport 0000:03:04.0: BAR 14: failed to assign [mem size 0x00400000]
[ 1264.718451] pcieport 0000:03:04.0: BAR 13: no space for [io size 0x1000]
[ 1264.718453] pcieport 0000:03:04.0: BAR 13: failed to assign [io size 0x1000]
虽然我觉得这些与我正在做的事情无关,尽管我很乐意有人证明我错了。
那么,在所有这些尝试之后,有没有人知道是否有办法(或者是否有可能)扫描这个 PCIe 插件 NVMe SSD 并能够在不重新启动的情况下使用它?我还查看了其他 HDD 的一些线程,这些线程引用了基于 sata 的驱动器的重新扫描,但事实并非如此,因此引用也无济于事。
提前致谢。
【问题讨论】:
【参考方案1】:我尝试这样做是为了节省重启所用的时间。当时的 PCI 设备驱动程序在成功重新扫描并连续获得所有鸭子方面充其量是狡猾。该设备是一个 FPGA,为我正在开发的设备驱动程序提供专有接口设备。那是在 2014 年 3 月左右尝试使用内核 2.6.30。我的(不合标准,但可以接受)解决方案是重新启动系统。
【讨论】:
现在重新启动对于测试来说不是问题,但最终我正在做的工作是在一个开发站上,最终将进入自动异步测试机,其中一个单元会断电将连接多个设备将不再被视为异步。不过感谢您的反馈【参考方案2】:我在使用 QEMU / Proxmox 对 nvme PCIE 直通进行基准测试时遇到了同样的问题。
首先记下正在使用的驱动:
lspci -nnk -s '0000:82:00.0'
应该说
正在使用的内核驱动程序:vfio-pci
现在解除绑定驱动,然后重新探测:
echo '0000:82:00.0' > /sys/bus/pci/drivers/vfio-pci/unbind
echo '0000:82:00.0' > /sys/bus/pci/drivers_probe
再次检查驱动程序:
lspci -nnk -s '0000:82:00.0'
正在使用的内核驱动程序:nvme
lsblk 现在应该显示驱动器。找到程序here
【讨论】:
以上是关于在 Linux 中重新枚举和使用 PCIe SSD 而无需关机的主要内容,如果未能解决你的问题,请参考以下文章