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

13

Acabei de reinstalar o Debian no meu laptop Sony VAIO, e meu dmesg e consoles virtuais todos 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 para calar a boca (sem matar minhas portas USB realmente úteis) é desabilitar um dos controladores de 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 o 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 este dispositivo PCI específico nunca seja ativado automaticamente, sem desativar completamente o driver?


-editar- 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.

Rhymoid
fonte
1
Uma abordagem aceitável seria desabilitar esse dispositivo USB por meio do barramento USB em vez do barramento PCI?
slm
Também tem certeza que você pode fazer uma lista negra usando uma string pci: ... como essa? Eu só vi os módulos do kernel em listas negras no arquivo /etc/modprobe.d/blacklist. Você não poderia usar o lspci -k para identificar qual módulo o dispositivo quer e, em seguida, listar em negrito isso?
slm
Depois de adicionar a entrada à lista negra, você update-initramfs -u -k all?
Stefan Seidel
@ StefanSeidel: bom ponto. Eu tenho agora, mas parece não ajudar. Talvez slm esteja certo ao pensar que a lista negra de modalias como essa precisa de uma sintaxe ou método diferente.
Rhymoid
@slm: Não tenho certeza se posso bloquear modalias através da lista negra modprobe (meu sistema parece ignorar a linha que eu forneci), mas não posso simplesmente remover o módulo ( ehci_hcd ), uma vez que isso desativaria todos Hosts USB no meu sistema. Eu só quero desativar este dispositivo específico, com base em seu fornecedor, dev, subvendor e subdev.
Rhymoid

Respostas:

4

Recentemente, me deparei com esse problema ao configurar minha caixa de xen 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 arquivo que é um simples csv do número do dispositivo pci e o 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 faz o trabalho 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

Finalmente, corra update-initramfs -k all -u e reinicie.

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

Steve Czetty
fonte
Ainda é uma solução onde você desvincula o dispositivo PCI depois que ele foi inicializado, mas olha, parece melhor do que resolvê-lo em /etc/init.d! Eu não estou usando a máquina agora, e talvez eu nunca a inicialize novamente com o Debian, então não posso testá-la. No entanto, como provavelmente teria funcionado no meu caso, aceito isso como uma resposta.
Rhymoid
De acordo, ainda não encontrei uma solução para impedir a inicialização do dispositivo sem colocar o módulo na lista negra. A linha "radeon" é um exemplo de uma tentativa inicial, na verdade.
Steve Czetty
Engraçado eu pensei udev fez todo o ônibus percorrer e carregando durante a inicialização do kernel e qualquer coisa grub fez em initramfs foi lido apenas e perdido. quando o kernel é carregado. Eu tentei configurar setpci em initramfs-tools mas desisti e estou tentando um udev governar agora.
WinEunuuchs2Unix
4

Nenhuma das respostas resolveu o meu problema semelhante, mas eles 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 para o dispositivo pci apenas resultou no hub popping de volta para cima como outro hub (5 no meu caso) e inundação syslog ainda mais.

Por acaso notei uma estrutura de desconexão sob /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.

Kujo770
fonte
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'"

Substituir 0000:00:03.0 com o endereço do dispositivo pci que você deseja remover

lunastorm
fonte
Isso é muito útil. No entanto, como o OP mencionou, isso resultará na queda de todas as portas USB. Existe alguma maneira de adicionar uma regra para um dispositivo específico e o ID do fornecedor para que os dispositivos funcionem com todas as outras portas USB, mas desconsidere um determinado dispositivo?
Mosty Mostacho
2

Encontrei este tópico no askubuntu:

Usando lspci -vv Para identificar o slot PCI de um dispositivo que você deseja desativar, parecia que você poderia usar este comando para desativar o dispositivo desse slot:

% echo 0 > /sys/bus/pci/slot/$N/power
slm
fonte
1
Eu sei como posso desabilitá-lo em qualquer outro momento, mas eu quero impedir que o kernel o ative. Além disso, como este é um dispositivo PCI com fio (como a maioria dos controladores USB), ele não possui slot. A máquina que eu estou falando é um laptop, e o único slot que tem ( /sys/bus/pci/slots/1 ) é o slot ExpressCard no lado externo, que eu posso desocupar manualmente.
Rhymoid
2

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

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.

kschurig
fonte
Se o acima não funcionar, então você tem que encontrar a porta usb correta. Eu acho que é "1-1.2" (caso contrário, verifique com tree /sys/bus/pci/devices/0000\:00\:1a.0/ em "usbX", o que significa que a porta é um número semelhante. Se é "1-1.2" em vez de seu echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbind o script deve ter echo "auto" > /sys/bus/usb/devices/1-1.2/power/control; echo -n "1-1.2" > /sys/bus/usb/drivers/usb/unbind.
kschurig
0

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

Por que não simplesmente suprimir o log das mensagens para o console, modificando syslog / (não sei se você usa syslog ou rsyslog ou qualquer outra coisa, então eu não posso realmente apontá-lo mais especificamente no diretório correto, mas se você pesquise seus arquivos de configuração do syslog por "console" e "tty", que lhe dariam um bom ponto de partida - na verdade, você provavelmente pode alterar o console para / dev / tty1 [por exemplo] e ter apenas log de mensagens para tty1 consoles.

A outra solução (para responder a sua pergunta, mas eu não gosto), você poderia 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 h ttp: //www.cyberciti.biz/faq/rhel-redhat-centos-kernel-usb-reset-high-speed-ehci_hcd/ que resolve exatamente a pergunta que você está fazendo

davidgo
fonte