desativa o dispositivo PCI específico na inicialização

13

Acabei de reinstalar o Debian no meu laptop Sony VAIO, e meu dmesg e os consoles virtuais recebem spam com as mesmas mensagens repetidas vezes.

[   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

Eu acredito que essas mensagens são provenientes de um dispositivo USB conectado internamente, provavelmente a webcam (já que é a única coisa que não funciona). A única maneira que eu posso parecer calar (sem matar minhas portas USB realmente úteis) é desativar um dos controladores host USB:

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

Isso também diminui minha interface Bluetooth, mas estou bem com isso.

Eu gostaria que essa configuração persistisse, para que eu pudesse usar meu console virtual novamente, caso eu precise. Eu quero que meu sistema operacional (Debian amd64) nunca acorde, mas eu não sei como fazer isso. Eu tentei colocar na lista negra o alias do módulo para o dispositivo PCI, mas parece ser ignorado:

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

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

Como posso garantir que esse dispositivo PCI específico nunca seja ativado automaticamente, sem desativar completamente o driver?

-edit - O módulo foi renomeado recentemente, agora os seguintes trabalhos da userland:

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

Ainda assim, estou procurando uma maneira de impedir que o kernel vincule esse dispositivo em primeiro lugar.

    
por Rhymoid 25.01.2013 / 23:06

6 respostas

4

Recentemente encontrei esse problema ao configurar minha xen box com vários dispositivos usb. Eu queria que um fosse usado pelo Dom-0, e o outro a ser usado por uma VM, então eu precisava que o dispositivo estivesse disponível para o xen-pciback. No entanto, o driver usb foi cumprido no meu kernel, então eu não poderia simplesmente colocar o driver na lista negra. Minha solução foi criar um script initramfs personalizado que desassocie a porta pci específica no início do processo de inicialização.

Este é o Ubuntu 2016.04, mas deve funcionar em versões anteriores.

Existem três arquivos envolvidos. Eu os nomeei para o meu caso de uso específico, mas ymmv:

O primeiro arquivo, chamado /etc/unbindpci file, que é um simples csv do número do dispositivo pci e do driver (configure conforme necessário aqui):

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

Segundo arquivo /etc/initramfs-tools/hooks/xenfiles , que copia a configuração acima no initramfs.

#! /bin/bash

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

Terceiro arquivo é o que funciona no momento da inicialização, eu coloquei em /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

Por fim, execute update-initramfs -k all -u e reinicialize.

Eu poderia incluir suporte para comentários no arquivo de configuração, e há muita limpeza para fazer aqui, mas funciona para mim.

    
por 25.04.2016 / 21:56
4

Nenhuma das respostas resolveu meu problema semelhante, mas elas me colocaram no caminho para resolvê-lo!

Meu erro de syslog:

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

Esta é uma porta hub USB interna para uma opção bluetooth que eu não tenho.

Desvincular-se ao dispositivo pci resultou no back-up do hub como outro hub (5 no meu caso) e inundar o syslog ainda mais.

Por acaso, notei uma estrutura de desvinculação em /sys/bus/usb/drivers/hub . Usando exemplos acima, adicionei o seguinte em rc.local:

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

O resultado é o silêncio do syslog! Agora para adicionar o exemplo de script do kshurig para gerenciamento de energia e eu deveria ser de ouro.

    
por 05.03.2013 / 00:52
4

Você pode remover um dispositivo PCI adicionando uma regra do udev em /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'"

Substitua 0000:00:03.0 pelo endereço do dispositivo pci que você deseja remover

    
por 30.05.2014 / 11:30
2

Encontrou este tópico no askubuntu:

Usando lspci -vv para identificar o slot PCI de um dispositivo que você deseja desativar, parece que você pode usar esse comando para desativar o dispositivo desse slot:

% echo 0 > /sys/bus/pci/slot/$N/power
    
por 20.02.2013 / 05:30
2

Quando você já tem echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbind em /etc/rc.local para inicialização, você também precisa colocá-lo em um script para o deamon de gerenciamento de energia.

Vai assim: Crie um arquivo de script bash executável chamado 0_disable_webcam no diretório /etc/pm/sleep.d/ :

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

Deve funcionar instantaneamente. Eu tentei com um pen drive usb e funcionou (ou seja, permaneceu desativado), enquanto a unidade estava conectada. A replicação precisaria das regras do udev, mas como sua webcam não será desconectada, ela deve funcionar. Se isso não funcionar, tenho outra sugestão.

    
por 23.02.2013 / 23:36
0

não é uma resposta à sua pergunta tanto quanto uma solução.

Por que não simplesmente suprimir o registro das mensagens no console modificando syslog / (não sei se você usa syslog ou rsyslog ou qualquer outra coisa, por isso não consigo apontar mais especificamente no diretório correto, mas se você procurar seus arquivos de configuração syslog por "console" e "tty", isso lhe dará um bom ponto de partida - na verdade, você provavelmente poderá mudar o console para / dev / tty1 [por exemplo] e ter apenas log de mensagens para tty1 em vez disso, todos os consoles.

A outra solução (para responder a sua pergunta, mas eu não gosto), você pode colocar o módulo ehci_hcd na lista negra (se estiver carregado), ou recompilar seu kernel para usá-lo apenas como um módulo. Dê uma olhada em ttp: //www.cyberciti. biz / faq / rhel-redhat-centos-kernel-usb-reset-alta velocidade-ehci_hcd / que resolve exatamente a pergunta que você está fazendo

    
por 23.02.2013 / 23:20

Tags