如何在启动时禁用 PCIe 设备?

如何在启动时禁用 PCIe 设备?

我正在尝试调试 NVIDIA 显卡从挂起状态恢复的问题。这个线程让我相信这是卡 HDMI 输出的音频设备的问题。我想禁用该设备,但 udev 规则和内核参数没有效果。如何解决这些方法不起作用的问题,或使用其他方法禁用设备,以便完全排除它导致我的问题的可能性?

sudo lspci -vv我的相关设备的输出(删除了不相关的字段):

58:00.1 Audio device: NVIDIA Corporation Device 10fa (rev a1)
    Subsystem: Micro-Star International Co., Ltd. [MSI] Device 3800
    Control: (...)
    Status: (...)
    Latency: 0
    Interrupt: pin B routed to IRQ 18
    IOMMU group: 19
    Region 0: Memory at 61080000 (32-bit, non-prefetchable) [size=16K]
    Capabilities: (...)
    Kernel driver in use: snd_hda_intel
    Kernel modules: snd_hda_intel

lspci -nns 58:00.1

58:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10fa] (rev a1)

我尝试过的:

  • udev规则:
cat /etc/udev/rules.d/10-remove-nvidia-audio.rules 
ACTION==“add”, KERNEL=="0000:58:00.1", SUBSYSTEM=="pci", RUN="/bin/sh -c ‘echo 1 > /sys/bus/pci/devices/0000:58:00.1/remove’"

手动运行 RUN 命令确实会断开设备连接,但挂起问题仍然存在,并且我无法确定设备是否在恢复时重新连接(journalctl仅记录挂起操作,不记录有关恢复的任何内容,假设这是因为我必须强制关闭电源才能再次使用我的计算机)。我还需要做些什么才能让 udev 规则生效吗?

pcistub=pci-stub.ids=10de:10fa

我无法使用我查看的答案中概述的其他方法,因为snd_hda_intel它也用于我的实际音频输出。

任何建议表示赞赏。谢谢!

答案1

我通过创建在启动时删除设备的 systemd 服务来完成此操作。

服务的主体如下所示:

# systemctl cat remove-nvidia
# /etc/systemd/system/remove-nvidia.service
[Unit]
Description=removes pci nvidia upon boot

[Service]
Type=oneshot
User=root
RemainAfterExit=true
ExecStart=/usr/bin/bash -c "echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove"
 
[Install]
WantedBy=multi-user.target

您需要重新加载守护进程:

 # systemctl daemon-reload

并启用该服务

# systemctl enabled remove-nvidia

结果将是删除 pci VGA 的单独服务(在我的例子中)

pci 设备的 id 可以通过以下方式找到lspci -vv

祝你好运

答案2

一切几乎都是正确的。只是不要放在最后',它必须在那里:

  • 创建文件/etc/udev/rules.d/99-zz.rules(以确保它作为最后一条规则执行)。
  • 然后加:
    ACTION==“add”, KERNEL=="0000:58:00.1", SUBSYSTEM=="pci", RUN="/bin/sh -c ‘echo 1 > /sys/bus/pci/devices/0000:58:00.1/remove"   
    
    • 0000:58:00.1/remove'"- 不管用。
    • 0000:58:00.1/remove"- 还行吧

相关内容