我刚刚在我的 Sony VAIO 笔记本电脑上重新安装了 Debian,我dmesg和虚拟控制台都一遍又一遍地收到相同消息的垃圾邮件。
[ 59.662381] hub 1-1:1.0: unable to enumerate USB device on port 2
[ 59.901732] usb 1-1.2: new high-speed USB device number 91 using ehci_hcd
[ 59.917940] hub 1-1:1.0: unable to enumerate USB device on port 2
[ 60.157256] usb 1-1.2: new high-speed USB device number 92 using ehci_hcd
Run Code Online (Sandbox Code Playgroud)
我相信这些消息来自内部连接的 USB 设备,很可能是网络摄像头(因为这是唯一不起作用的东西)。我似乎可以让它关闭的唯一方法(不杀死我真正有用的 USB 端口)是禁用 USB 主机控制器之一:
# echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbind
Run Code Online (Sandbox Code Playgroud)
这也取消了我的蓝牙接口,但我对此很好。
我希望保留此设置,以便在需要时可以轻松地再次使用我的虚拟控制台。我希望我的操作系统 (Debian amd64) 永远不会被唤醒,但我不知道如何做到这一点。我试图将 PCI 设备的模块别名列入黑名单,但似乎被忽略了:
$ cat /sys/bus/pci/devices/0000\:00\:1a.0/modalias
pci:v00008086d00003B3Csv0000104Dsd00009071bc0Csc03i20
$ cat /etc/modprobe.d/blacklist
blacklist pci:v00008086d00003B3Csv0000104Dsd00009071bc0Csc03i20
Run Code Online (Sandbox Code Playgroud)
在不完全禁用其驱动程序的情况下,如何确保永远不会自动激活此特定 PCI 设备?
-edit-该模块最近被重命名,现在从用户空间开始以下工作:
echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci-pci/unbind
Run Code Online (Sandbox Code Playgroud)
不过,我正在寻找一种方法来阻止内核首先绑定该设备。
小智 6
您可以通过在 /etc/udev/rules.d 下添加 udev 规则来删除 PCI 设备:
ACTION=="add", KERNEL=="0000:00:03.0", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:00:03.0/remove'"
Run Code Online (Sandbox Code Playgroud)
替换0000:00:03.0为要删除的 pci 设备地址
小智 5
我最近在使用多个 USB 设备配置我的 xen 盒子时遇到了这个问题。我希望其中一个由 Dom-0 使用,另一个由 VM 使用,因此我需要该设备可供 xen-pciback 使用。然而,USB 驱动程序已编译到我的内核中,因此我不能只是将驱动程序列入黑名单。我的解决方案是创建一个自定义 initramfs 脚本,在启动过程的早期解除特定 pci 端口的绑定。
这是 Ubuntu 2016.04,但它应该可以在早期版本中使用。
涉及三个文件。我根据我的具体用例命名它们,但是 ymmv:
第一个文件名为/etc/unbindpcifile,它是 pci 设备编号和驱动程序的简单 csv(此处根据需要进行配置):
0000:08:00.0,xhci_hcd
0000:03:00.0,radeon
Run Code Online (Sandbox Code Playgroud)
第二个文件/etc/initramfs-tools/hooks/xenfiles,将上述配置复制到 initramfs 中。
#! /bin/bash
if [ -f /etc/unbindpci ]; then
cp -pP /etc/unbindpci $DESTDIR/etc/unbindpci
fi
Run Code Online (Sandbox Code Playgroud)
第三个文件是在启动时起作用的,我将其放置在/etc/initramfs-tools/scripts/init-top/unbind-early-pci:
#!/bin/sh
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
# get pre-requisites
prereqs)
prereqs
exit 0
;;
esac
# This only executes if in a xen Dom-0.
# Edit if that's not your use case!
if [ -f /sys/hypervisor/uuid -a -f /etc/unbindpci ]; then
if [ $(cat /sys/hypervisor/uuid) = "00000000-0000-0000-0000-000000000000" ]; then
echo "Unbinding pci ports..."
IFS=,
while read addr driver; do
if [ -f /sys/bus/pci/drivers/$driver/unbind ]; then
echo "Unbinding $addr, device $driver"
echo $addr > /sys/bus/pci/drivers/$driver/unbind
fi
done < /etc/unbindpci
fi
fi
Run Code Online (Sandbox Code Playgroud)
最后,运行update-initramfs -k all -u并重新启动。
我可以在配置文件中包含对注释的支持,并且这里需要做很多清理工作,但这对我有用。