vô hiệu hóa thiết bị PCI cụ thể khi khởi động


14

Tôi vừa cài đặt lại Debian trên máy tính xách tay Sony VAIO của tôi dmesgvà tất cả các bảng điều khiển ảo của tôi đều bị spam với cùng một tin nhắn lặp đi lặp lại.

[   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

Tôi tin rằng những tin nhắn này đến từ một thiết bị USB được kết nối nội bộ, rất có thể là webcam (vì đó là thứ duy nhất không hoạt động). Cách duy nhất tôi dường như có thể tắt nó (mà không làm mất các cổng USB thực sự hữu ích của tôi) là vô hiệu hóa một trong các bộ điều khiển máy chủ USB:

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

Điều này cũng làm mất giao diện Bluetooth của tôi, nhưng tôi ổn với điều đó.

Tôi muốn cài đặt này được duy trì, để tôi có thể sử dụng lại bảng điều khiển ảo một cách dễ dàng trong trường hợp tôi cần. Tôi muốn hệ điều hành của mình (Debian amd64) không bao giờ đánh thức nó, nhưng tôi không biết làm thế nào để làm điều này. Tôi đã cố gắng liệt kê danh sách mô-đun cho thiết bị PCI, nhưng dường như bị bỏ qua:

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

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

Làm cách nào để đảm bảo rằng thiết bị PCI cụ thể này không bao giờ được kích hoạt tự động mà không tắt hoàn toàn trình điều khiển của thiết bị?


-edit- Mô-đun đã được đổi tên gần đây, bây giờ các công việc sau đây từ userland:

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

Tuy nhiên, tôi đang tìm cách ngăn hạt nhân liên kết thiết bị đó ngay từ đầu.


1
Một cách tiếp cận có thể chấp nhận được là vô hiệu hóa thiết bị USB cụ thể này thông qua bus USB chứ không phải bus PCI?
slm

Ngoài ra, bạn có chắc chắn bạn có thể đưa vào danh sách đen bằng cách sử dụng chuỗi pci: ... như thế không? Tôi chỉ từng thấy các mô-đun hạt nhân nằm trong danh sách đen trong tệp /etc/modprobe.d/blacklist. Bạn không thể sử dụng lspci -k để xác định mô-đun nào thiết bị muốn và sau đó danh sách đen thay thế?
slm

Sau khi thêm mục vào danh sách đen, phải không update-initramfs -u -k all?
Stefan Seidel

@StefanSeidel: Điểm tốt. Tôi có bây giờ, nhưng nó dường như không giúp đỡ. Có lẽ slm đã đúng khi nghĩ rằng danh sách đen một phương thức như thế này cần một cú pháp hoặc phương thức khác.
Rhymoid

@slm: Tôi không chắc chắn nếu tôi có thể chặn modaliases thông qua danh sách đen modprobe (hệ thống của tôi dường như bỏ qua dòng Tôi đưa cho nó), nhưng tôi không thể chỉ cần loại bỏ các mô-đun ( ehci_hcd), vì đó sẽ vô hiệu hóa tất cả các host USB trên hệ thống của tôi. Tôi chỉ muốn vô hiệu hóa thiết bị cụ thể này, dựa trên nhà cung cấp, dev, subvendor và subev của nó.
Rhymoid

Câu trả lời:


4

Gần đây tôi gặp vấn đề này trong khi cấu hình hộp xen của mình với nhiều thiết bị usb. Tôi muốn một cái được sử dụng bởi Dom-0 và cái kia được VM sử dụng, vì vậy tôi cần thiết bị này có sẵn để xen-pciback. Tuy nhiên, trình điều khiển usb đã được tuân thủ trong kernel của tôi, vì vậy tôi không thể đưa vào danh sách đen trình điều khiển. Giải pháp của tôi là tạo ra một tập lệnh initramfs tùy chỉnh hủy kết nối cổng pci cụ thể từ rất sớm trong quá trình khởi động.

Đây là Ubuntu 2016.04, nhưng nó sẽ hoạt động trong các phiên bản trước.

Có ba tập tin liên quan. Tôi đặt tên cho trường hợp sử dụng cụ thể của mình, nhưng ymmv:

Tệp đầu tiên, tệp có tên /etc/unbindpcilà một csv đơn giản của số thiết bị pci và trình điều khiển (cấu hình khi cần ở đây):

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

Tập tin thứ hai /etc/initramfs-tools/hooks/xenfiles, sao chép cấu hình trên vào initramfs.

#! /bin/bash

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

Tập tin thứ ba là những gì làm việc tại thời điểm khởi động, tôi đặt nó vào /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

Cuối cùng, chạy update-initramfs -k all -uvà khởi động lại.

Tôi có thể bao gồm hỗ trợ cho các bình luận trong tập tin cấu hình và có rất nhiều công việc dọn dẹp ở đây, nhưng nó hoạt động với tôi.


Đây vẫn là một giải pháp mà bạn hủy kết nối thiết bị PCI sau khi thiết bị được khởi chạy, nhưng này, nó có vẻ tốt hơn là giải quyết nó /etc/init.d! Tôi hiện không sử dụng máy và tôi có thể không bao giờ khởi động lại với Debian, vì vậy tôi không thể kiểm tra nó. Tuy nhiên, vì nó có thể đã hoạt động trong trường hợp của tôi, tôi sẽ chấp nhận nó như một câu trả lời.
Rhymoid

Đồng ý, tôi vẫn chưa tìm được giải pháp ngăn chặn khởi tạo thiết bị mà không đưa vào danh sách đen mô-đun. Dòng "radeon" là một ví dụ về một nỗ lực ban đầu, thực sự.
Steve Czetty

Buồn cười tôi nghĩ rằng udevtất cả các xe buýt đi qua và tải trong khi khởi động kernel và mọi thứ grub đã làm initramfschỉ được đọc và bị mất. khi kernel được tải. Tôi đã cố gắng để thiết lập setpcitrong initramfs-toolsnhưng đã từ bỏ và đang cố gắng một udevquy tắc bây giờ.
WinEunuuchs2Unix

4

Không có câu trả lời nào giải quyết được vấn đề tương tự của tôi, nhưng chúng đã đưa tôi vào con đường giải quyết nó!

Lỗi nhật ký hệ thống của tôi:

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

Đây là cổng trung tâm usb nội bộ cho tùy chọn bluetooth mà tôi không có.

hủy liên kết với thiết bị pci chỉ dẫn đến việc hub bật lên như một hub khác (5 trong trường hợp của tôi) và làm ngập syslog hơn nữa.

Tình cờ tôi nhận thấy một cấu trúc không ràng buộc dưới /sys/bus/usb/drivers/hub. Sử dụng các ví dụ ở trên tôi chỉ cần thêm vào sau đây trong RC.local:

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

Kết quả là syslog im lặng! Bây giờ để thêm ví dụ về kịch bản của kshurig cho quản lý năng lượng và tôi nên là vàng.


4

Bạn có thể xóa thiết bị PCI bằng cách thêm quy tắc udev trong /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'"

Thay thế 0000:00:03.0bằng địa chỉ thiết bị pci bạn muốn xóa


Điều này khá hữu ích. Tuy nhiên, như OP đã đề cập, điều này sẽ dẫn đến tất cả các cổng USB bị hỏng. Có cách nào để thêm quy tắc cho một thiết bị cụ thể và id nhà cung cấp để các thiết bị hoạt động với tất cả các cổng USB khác nhưng sẽ bỏ qua một thiết bị nhất định không?
Mosty Mostacho

2

Tìm thấy chủ đề này trên Askubfox:

Sử dụng lspci -vvđể xác định khe cắm PCI của thiết bị mà bạn muốn tắt, có vẻ như bạn có thể sử dụng lệnh này để tắt thiết bị của khe đó:

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

1
Tôi biết làm thế nào tôi có thể vô hiệu hóa nó bất cứ lúc nào, nhưng tôi muốn ngăn chặn hạt nhân kích hoạt nó. Bên cạnh đó, vì đây là thiết bị PCI cứng (giống như hầu hết các bộ điều khiển USB), nên nó không có khe cắm. Máy tôi đang nói đến là một máy tính xách tay và khe cắm duy nhất mà nó có ( /sys/bus/pci/slots/1) là khe cắm ExpressCard ở bên ngoài, mà tôi có thể bỏ trống bằng tay.
Rhymoid

2

Khi bạn đã có echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbindtrong /etc/rc.localcho khởi động hơn bạn chỉ cần đặt nó vào một kịch bản cho công tác quản lý điện deamon là tốt.

Thích như thế này: Tạo một tệp bash script thực thi có tên 0_disable_webcamtrong thư mục /etc/pm/sleep.d/:

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

Nó sẽ hoạt động ngay lập tức. Tôi đã thử nó với một ổ USB và nó hoạt động (có nghĩa là nó vẫn bị vô hiệu hóa) miễn là ổ đĩa được cắm. Việc thay thế sẽ cần các quy tắc udev nhưng vì webcam của bạn sẽ không được rút ra nên nó hoạt động. Nếu điều đó không thực hiện được thì tôi có một gợi ý khác.


Nếu cách trên không hoạt động thì bạn phải tìm đúng cổng usb. Tôi đoán đó là "1-1.2" (nếu không thì kiểm tra tree /sys/bus/pci/devices/0000\:00\:1a.0/bên dưới "usbX" có nghĩa là cổng là một số tương tự). Nếu nó là "1-1.2" thay vì echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbindtập lệnh của bạn nên có echo "auto" > /sys/bus/usb/devices/1-1.2/power/control; echo -n "1-1.2" > /sys/bus/usb/drivers/usb/unbind.
kschurig

0

không phải là một câu trả lời cho câu hỏi của bạn nhiều như một công việc xung quanh.

Tại sao không đơn giản ngăn chặn việc ghi nhật ký tin nhắn vào bảng điều khiển bằng cách sửa đổi syslog / (Tôi không biết nếu bạn sử dụng syslog hoặc rsyslog hoặc thứ gì khác, vì vậy tôi thực sự không thể chỉ cho bạn cụ thể hơn trong thư mục chính xác, nhưng nếu bạn tìm kiếm các tệp cấu hình syslog của bạn cho "console" và "tty", điều đó sẽ cung cấp cho bạn một nơi khởi đầu tốt - thực tế, bạn có thể thay đổi giao diện điều khiển thành / dev / tty1 [ví dụ] và chỉ có các thông điệp chỉ đăng nhập vào tty1 bảng điều khiển.

Giải pháp khác (để trả lời câu hỏi của bạn, nhưng tôi không thích), bạn có thể liệt kê danh sách đen mô-đun ehci_hcd (nếu được tải) hoặc biên dịch lại kernel của bạn để chỉ sử dụng mô-đun asa. Hãy xem h ttp: //www.cyberciti.biz/faq/rhel-redhat-centos-kernel-usb-reset-high-speed-ehci_hcd/ giải quyết chính xác câu hỏi bạn đang hỏi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.