부팅시 특정 PCI 장치 비활성화


14

방금 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

이것은 또한 내 블루투스 인터페이스를 중단 시키지만 괜찮습니다.

이 설정을 유지하여 필요할 때 가상 콘솔을 다시 사용할 수 있습니다. 내 운영 체제 (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
PCI 버스가 아닌 USB 버스를 통해이 특정 USB 장치를 비활성화하는 접근 방법이 있습니까?
slm

또한 pci : ... 문자열을 사용하여 블랙리스트에 올릴 수 있습니까? /etc/modprobe.d/blacklist 파일에서 차단 가능한 커널 모듈 만 보았습니다. lspci -k를 사용하여 장치가 원하는 모듈을 식별하고 대신 블랙리스트에 올릴 수 없습니까?
slm

블랙리스트에 항목을 추가 한 후, 당신은 update-initramfs -u -k all했습니까?
Stefan Seidel

@StefanSeidel : 좋은 지적입니다. 나는 지금 가지고 있지만 도움이되지 않는 것 같습니다. 아마도 slm은 이와 같은 modalias를 블랙리스트에 올리려면 다른 구문이나 방법이 필요하다고 생각하는 것이 맞을 것입니다.
Rhymoid 2019

@ slm : modprobe 블랙리스트를 통해 modaliases를 차단 할 수 있는지 확실하지 않습니다 (시스템은 내가 준 줄을 무시하는 것 같습니다).하지만 모든 USB 호스트를 ehci_hcd비활성화 할 수 있기 때문에 모듈을 제거 할 수는 없습니다 ( ) 내 시스템. 공급 업체, dev, subvendor 및 subdev를 기반으로이 특정 장치를 비활성화하고 싶습니다.
Rhymoid

답변:


4

최근 여러 USB 장치로 xen 상자를 구성하는 동안이 문제가 발생했습니다. 하나는 Dom-0에서 사용하고 다른 하나는 VM에서 사용하기를 원했기 때문에 xen-pciback에 사용할 수있는 장치가 필요했습니다. 그러나 usb 드라이버는 커널에 적합하기 때문에 드라이버를 블랙리스트에 올릴 수 없었습니다. 내 솔루션은 부팅 프로세스 초기에 특정 pci 포트를 바인딩 해제하는 사용자 지정 initramfs 스크립트를 만드는 것입니다.

Ubuntu 2016.04이지만 이전 버전에서 작동해야합니다.

세 가지 파일이 관련되어 있습니다. 특정 유스 케이스로 이름을 지정했지만 ymmv :

/etc/unbindpcipci 장치 번호와 드라이버의 간단한 csv 인 이름이 file 인 첫 번째 파일 (필요에 따라 구성) :

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! 지금 컴퓨터를 사용하지 않고 있으며 데비안으로 다시 부팅하지 않을 수도 있으므로 테스트 할 수 없습니다. 그러나 아마도 제 경우에는 효과가 있었을 것이므로 대답으로 받아 들일 것입니다.
Rhymoid

동의하지만, 여전히 모듈을 블랙리스트에 올리지 않고 장치 초기화를 방지하는 솔루션을 찾지 못했습니다. "라데온"라인은 실제로 초기 시도의 예입니다.
Steve Czetty

웃긴 나는 udev커널 부팅 중에 모든 버스가 지나가고 로딩되는 것을 생각 했고 grub이 수행 한 모든 initramfs것은 읽기 전용이며 잃어 버렸습니다. 커널이로드 될 때 나는 설정 setpci을 시도 initramfs-tools했지만 포기하고 udev지금 규칙을 시도하고 있습니다.
WinEunuuchs2Unix 1

4

그 대답 중 어느 것도 내 비슷한 문제를 해결하지 못했지만 그들은 그것을 해결하는 길에 나를 넣었습니다!

내 syslog 오류 :

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

이것은 내가 가지고 있지 않은 블루투스 옵션을위한 내부 USB 허브 포트입니다.

pci 장치에 바인딩을 해제하면 허브가 다른 허브 (필자의 경우 5)로 다시 튀어 나와 syslog를 더 많이 넘치게됩니다.

우연히 나는 아래에 바인딩되지 않은 구조를 발견했습니다 /sys/bus/usb/drivers/hub. 위의 예제를 사용하여 rc.local에 다음을 추가했습니다.

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

결과는 syslog 침묵입니다! 전원 관리를 위해 kshurig의 스크립트 예제를 추가하려면 황금색이어야합니다.


4

/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'"

0000:00:03.0제거하려는 pci 장치 주소로 교체


이것은 매우 유용합니다. 그러나 OP가 언급했듯이 모든 USB 포트가 다운됩니다. 장치가 다른 모든 USB 포트와 작동하지만 지정된 장치는 무시하도록 특정 장치 및 공급 업체 ID에 대한 규칙을 추가해야합니까?
Mosty Mostacho

2

askubuntu에서이 스레드를 찾았습니다.

사용 lspci -vv하지 않도록 설정할하는 장치의 PCI 슬롯을 식별하는 데, 그 슬롯의 장치를 해제하려면이 명령을 사용할 수 있습니다 당신처럼 소리 :

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

1
다른 시간에 비활성화 할 수있는 방법을 알고 있지만 커널이 전혀 활성화하지 못하게하고 싶습니다. 게다가 이것은 유선 USB 장치 (대부분의 USB 컨트롤러와 마찬가지로)이기 때문에 슬롯이 없습니다. 내가 말하고있는 기계는 랩탑이고, 슬롯이있는 유일한 슬롯 ( /sys/bus/pci/slots/1)은 외부의 ExpressCard 슬롯이며 수동으로 비울 수 있습니다.
Rhymoid

2

당신이 이미 가지고있는 경우 echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbind/etc/rc.local부팅 당신은 aswell 데몬 전원 관리를위한 스크립트에 넣어 필요한 것보다.

다음과 같이 실행 0_disable_webcam됩니다. directory에 이름이 지정된 실행 가능한 bash 스크립트 파일을 작성하십시오 /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"에서 확인하십시오 . 포트가 비슷한 번호임을 의미합니다). echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbind스크립트 대신 "1-1.2"인 경우 스크립트에 있어야합니다 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 구성 파일에서 "console"및 "tty"를 검색하면 좋은 시작 위치가됩니다. 실제로 콘솔을 / dev / tty1 (예 :)로 변경하고 메시지가 모두 tty1에만 기록되도록 할 수 있습니다. 콘솔.

다른 해결책 (질문에 대답하지만 마음에 들지 않음)은 ehci_hcd 모듈을 블랙리스트에 올리거나 (로드 된 경우) 커널을 다시 컴파일하여 모듈로만 사용할 수 있습니다. h ttp : //www.cyberciti.biz/faq/rhel-redhat-centos-kernel-usb-reset-high-speed-ehci_hcd/ 를 살펴보십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.