我正在尝试调试 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"
- 还行吧