вимкнути конкретний пристрій PCI під час завантаження


14

Щойно я перевстановив Debian на свій ноутбук Sony VAIO, і всі мої 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

Я вважаю, що ці повідомлення надходять із внутрішньо підключеного USB-пристрою, швидше за все, з веб-камери (оскільки це єдине, що не працює). Єдиний спосіб, коли я можу зробити його заткнутим (не вбиваючи мої фактично корисні порти USB) - це відключити один з USB-хост-контролерів:

# echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbind

Це також знімає мій інтерфейс Bluetooth, але я з цим добре.

Я хотів би, щоб ця настройка зберігалася, щоб я могла знову безболісно використовувати свою віртуальну консоль у випадку, якщо вона потрібна. Я хочу, щоб моя операційна система (Debian amd64) ніколи її не пробуджувала, але я не знаю, як це зробити. Я спробував зробити чорний список псевдоніму модуля для пристрою PCI, але, здається, його ігнорують:

$ cat /sys/bus/pci/devices/0000\:00\:1a.0/modalias 
pci:v00008086d00003B3Csv0000104Dsd00009071bc0Csc03i20

$ cat /etc/modprobe.d/blacklist
blacklist pci:v00008086d00003B3Csv0000104Dsd00009071bc0Csc03i20

Як я можу гарантувати, що цей конкретний пристрій PCI ніколи не буде автоматично активовано, не вимкнувши його драйвер взагалі?


-edit- Модуль нещодавно перейменований, тепер працює наступне:

echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci-pci/unbind

І все-таки я шукаю спосіб зупинити ядро ​​від прив’язки цього пристрою насамперед.


1
Чи прийнятним підходом буде відключення цього конкретного USB-пристрою через шину USB, а не шину PCI?
slm

Ви також впевнені, що можете зайняти чорний список за допомогою рядка pci: ... Я лише бачив, щоб модулі ядра були в чорному списку у файлі /etc/modprobe.d/blacklist. Не могли б ви використовувати lspci -k, щоб визначити, який модуль бажає пристрій, а потім чорний список?
slm

Додавши запис до чорного списку, чи не так update-initramfs -u -k all?
Стефан Зайдель

@StefanSeidel: Добре. У мене зараз є, але це, здається, не допомагає. Можливо, slm є правильним, думаючи, що чорний список подібних модалій потребує іншого синтаксису чи методу.
Римоїд

@slm: Я не впевнений, чи можу я блокувати modaliases через чорний список modprobe (моя система, здається, ігнорує рядок, який я йому надав), але я не можу просто видалити модуль ( ehci_hcd), оскільки це відключить усі USB-хости на моя система. Я просто хочу відключити цей конкретний пристрій на основі його постачальника, dev, subvendor та subdev.
Римоїд

Відповіді:


4

Нещодавно я зіткнувся з цим питанням, конфігуруючи свій xen box з кількома пристроями USB. Я хотів, щоб один використовувався Dom-0, а другий використовувався VM, тому мені знадобився пристрій, щоб він був доступний xen-pciback. Однак драйвер usb був укладений у моє ядро, тому я не міг просто передати цей список драйверів у чорний список. Моє рішення полягало в тому, щоб створити спеціальний скрипт initramfs, який розв’язує певний порт pci дуже рано в процесі завантаження.

Це Ubuntu 2016.04, але він повинен працювати в більш ранніх версіях.

Задіяно три файли. Я назвав їх для мого конкретного випадку використання, але ymmv:

Перший файл, іменований /etc/unbindpciфайл, який є простим csv номером пристрою pci та драйвером (налаштуйте за потребою тут):

0000:08:00.0,xhci_hcd
0000:03:00.0,radeon

Другий файл /etc/initramfs-tools/hooks/xenfiles, який копіює вищевказаний конфігурацію в initramfs.

#! /bin/bash

if [ -f /etc/unbindpci ]; then
  cp -pP /etc/unbindpci $DESTDIR/etc/unbindpci
fi

Третій файл - це те, що працює під час завантаження, я помістив його в /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

Нарешті, запустіть update-initramfs -k all -uі перезавантажте.

Я можу включити підтримку коментарів у конфігураційний файл, і тут є багато очищення, але це працює для мене.


Це все ще рішення, коли ви від'єднаєте PCI-пристрій після його ініціалізації, але ей, це виглядає краще, ніж вирішити його /etc/init.d! Зараз я не використовую машину, і я більше ніколи не можу завантажувати її разом із Debian, тому не можу перевірити її. Однак оскільки це могло б спрацювати в моєму випадку, я прийму це як відповідь.
Римоїд

Погоджено, я все ще не знайшов рішення для запобігання ініціалізації пристрою без чорного списку модуля. Рядок "radeon" - це фактично приклад ранньої спроби.
Стів Четті

Смішно, я думав, udevщо весь автобус пройшов через і завантаження під час завантаження ядра, і все, що зробило, initramfsбуло прочитане лише та втрачене. коли ядро ​​завантажується. Я спробував встановити setpciв initramfs-toolsале здався і я пробуючи udevправило прямо зараз.
WinEunuuchs2Unix

4

Жодна з відповідей не вирішила моєї подібної проблеми, але вони поставили мене на шлях її вирішення!

Моя помилка системного журналу:

[  334.940158] hub 1-0:1.0: unable to enumerate USB device on port 7

Це внутрішній usb-порт для порту Bluetooth у мене немає.

відключення пристрою pci щойно призвело до того, що концентратор вискакує як інший концентратор (у моєму випадку 5) і далі затоплює syslog.

Випадково я помітив розв'язану структуру під /sys/bus/usb/drivers/hub. Користуючись прикладами вище, я просто додав наступне у rc.local:

echo "1-0:1.0" > /sys/bus/usb/drivers/hub/unbind

Результат - системна тиша! Тепер додамо сценарій kshurig для керування живленням, і я повинен бути золотим.


4

Ви можете видалити пристрій PCI, додавши правило udev під /etc/udev/rules.d:

ACTION=="add", KERNEL=="0000:00:03.0", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:00:03.0/remove'"

Замініть 0000:00:03.0адресу пристрою pci, який потрібно видалити


Це досить корисно. Однак, як згадувалося в ОП, це призведе до того, що всі порти USB будуть знищені. Чи варто додати правило для певного пристрою та ідентифікатора постачальника, щоб пристрої працювали з усіма іншими портами USB, але не враховували даний пристрій?
Мості Мостачо

2

Знайдено цю тему на askubuntu:

Використовуючи lspci -vvдля ідентифікації слота PCI пристрою, який ви хочете відключити, звучало так, що ви можете використовувати цю команду для вимкнення пристрою цього слота:

% echo 0 > /sys/bus/pci/slot/$N/power

1
Я знаю, як я можу його відключити в будь-який інший час, але я хочу перешкодити ядру взагалі активувати його. Крім того, оскільки це жорсткий провід PCI (як і більшість USB-контролерів), він не має слота. Машина, про яку я говорю, - це ноутбук, і єдиний у неї слот ( /sys/bus/pci/slots/1) - це слот ExpressCard зовні, який я можу вручну звільнити.
Римоїд

2

Коли ви вже echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbindв /etc/rc.localпротягом завантаження , ніж потрібно просто помістити його в сценарій для управління живленням Deamon , а також.

Виходить так: Створіть виконуваний файл скрипту bash, названий 0_disable_webcamу каталозі /etc/pm/sleep.d/:

#!/bin/sh
case "$1" in
        resume|thaw)
                echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbind
                ;;
esac

Це повинно працювати миттєво. Я спробував це за допомогою USB-накопичувача, і він працював (значить, він залишався відключеним) до тих пір, поки диск був підключений. Для повторного підключення потрібні правила udev, але оскільки ваша веб-камера не буде відключена, вона повинна працювати. Якщо це не робить трюк, у мене є ще одна пропозиція.


Якщо вищезгадане не працює, вам доведеться знайти правильний порт USB. Я думаю, що це "1-1,2" (інакше позначте tree /sys/bus/pci/devices/0000\:00\:1a.0/під "usbX", що означає, що порт має аналогічне число). Якщо це "1-1,2", замість вашого echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbindсценарію слід мати echo "auto" > /sys/bus/usb/devices/1-1.2/power/control; echo -n "1-1.2" > /sys/bus/usb/drivers/usb/unbind.
kschurig

0

не відповідь на ваше запитання стільки, скільки робота навколо.

Чому б просто не придушити журнал повідомлень на консолі, змінивши syslog / (я не знаю, чи ви використовуєте syslog чи rsyslog чи щось інше, тому я не можу реально вказати вас конкретніше на правильний каталог, але якщо ви шукайте у своїх конфігураційних файлах syslog «консоль» та «tty», це дасть вам гарне вихідне місце - адже ви, ймовірно, можете змінити консоль на / dev / tty1 [наприклад] і мати повідомлення лише увійти в tty1, а не всі консолі.

Іншим рішенням (щоб відповісти на ваше запитання, але мені це не подобається), ви можете занести в чорний список модуль ehci_hcd (якщо він завантажений) або перекомпілювати ваше ядро, щоб використовувати його лише як модуль ASA. Подивіться на h ttp: //www.cyberciti.biz/faq/rhel-redhat-centos-kernel-usb-reset-high-speed-ehci_hcd/, який вирішує саме те питання, яке ви задаєте

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.