nonaktifkan perangkat PCI tertentu saat boot

14

Saya baru saja menginstal ulang Debian di laptop Sony VAIO saya, dmesgdan konsol virtual saya dan semua mendapatkan spam dengan pesan yang sama berulang-ulang.

[   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

Saya percaya pesan-pesan ini datang dari perangkat USB yang terhubung secara internal, kemungkinan besar webcam (karena hanya itu yang tidak berfungsi). Satu-satunya cara saya bisa mematikannya (tanpa membunuh port USB saya yang sebenarnya berguna) adalah dengan menonaktifkan salah satu pengontrol host USB:

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

Ini juga menurunkan antarmuka Bluetooth saya, tapi saya baik-baik saja dengan itu.

Saya ingin pengaturan ini bertahan, sehingga saya dapat menggunakan konsol virtual saya tanpa rasa sakit lagi jika saya membutuhkannya. Saya ingin sistem operasi saya (Debian amd64) tidak pernah membangunkannya, tetapi saya tidak tahu bagaimana melakukan ini. Saya sudah mencoba membuat daftar hitam alias modul untuk perangkat PCI, tetapi tampaknya diabaikan:

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

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

Bagaimana cara memastikan bahwa perangkat PCI spesifik ini tidak pernah diaktifkan secara otomatis, tanpa menonaktifkan drivernya sama sekali?


-edit- Modul ini berganti nama baru-baru ini, sekarang karya berikut dari userland:

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

Tetap saja, saya mencari cara untuk menghentikan kernel dari mengikat perangkat itu di tempat pertama.

Rhymoid
sumber
1
Apakah pendekatan yang dapat diterima adalah menonaktifkan perangkat USB khusus ini melalui bus USB daripada bus PCI?
slm
Anda juga yakin bisa daftar hitam menggunakan pci: ... string seperti itu? Saya hanya pernah melihat modul kernel masuk daftar hitam di file /etc/modprobe.d/blacklist. Tidak bisakah Anda menggunakan lspci -k untuk mengidentifikasi modul mana yang diinginkan perangkat dan kemudian daftar hitam itu?
slm
Setelah menambahkan entri ke daftar hitam, bukan update-initramfs -u -k all?
Stefan Seidel
@StefanSeidel: Poin bagus. Saya punya sekarang, tetapi sepertinya tidak membantu. Mungkin slm benar dalam berpikir bahwa memasukkan daftar hitam modalias seperti ini membutuhkan sintaks atau metode yang berbeda.
Rhymoid
@slm: Saya tidak yakin apakah saya dapat memblokir modaliases melalui daftar hitam modprobe (sistem saya tampaknya mengabaikan baris yang saya berikan), tapi saya tidak bisa begitu saja menghapus modul ( ehci_hcd), karena itu akan menonaktifkan semua host USB pada sistem saya. Saya hanya ingin menonaktifkan perangkat khusus ini, berdasarkan vendor, dev, subvendor, dan subdev.
Rhymoid

Jawaban:

4

Saya baru-baru ini mengalami masalah ini saat mengkonfigurasi kotak xen saya dengan beberapa perangkat usb. Saya ingin satu digunakan oleh Dom-0, dan yang lainnya digunakan oleh VM, jadi saya membutuhkan perangkat yang tersedia untuk xen-pciback. Namun, driver usb tersebut telah memenuhi kernel saya, jadi saya tidak bisa hanya memasukkan driver tersebut ke daftar hitam. Solusi saya adalah membuat skrip initramfs khusus yang tidak mengikat port pci tertentu di awal proses boot.

Ini adalah Ubuntu 2016.04, tetapi seharusnya berfungsi di versi sebelumnya.

Ada tiga file yang terlibat. Saya menamai mereka untuk use case khusus saya, tetapi ymmv:

File pertama, dinamai /etc/unbindpci file yang merupakan csv sederhana dari nomor perangkat pci dan driver (konfigurasikan seperlunya di sini):

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

File kedua /etc/initramfs-tools/hooks/xenfiles , yang menyalin konfigurasi di atas ke dalam initramfs.

#! /bin/bash

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

File ketiga adalah apa yang berfungsi saat boot, saya menempatkannya /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

Akhirnya, jalankan update-initramfs -k all -udan reboot.

Saya dapat memasukkan dukungan untuk komentar dalam file konfigurasi, dan ada banyak pembersihan yang harus dilakukan di sini, tetapi itu berfungsi untuk saya.

Steve Czetty
sumber
Ini masih merupakan solusi di mana Anda melepaskan ikatan perangkat PCI setelah diinisialisasi, tapi hei, itu terlihat lebih baik daripada menyelesaikannya /etc/init.d! Saya tidak menggunakan mesin sekarang, dan saya mungkin tidak akan pernah boot lagi dengan Debian, jadi saya tidak bisa mengujinya. Namun, karena mungkin akan berhasil dalam kasus saya, saya akan menerimanya sebagai jawaban.
Rhymoid
Setuju, saya masih belum menemukan solusi untuk mencegah inisialisasi perangkat tanpa memasukkan modul ke dalam daftar hitam. Garis "radeon" adalah contoh dari upaya awal itu, sebenarnya.
Steve Czetty
Lucu saya pikir udevsemua bus berjalan dan memuat selama boot kernel dan apa pun yang dilakukan grub initramfshanya dapat dibaca dan hilang. ketika kernel dimuat. Saya telah mencoba untuk setup setpcidi initramfs-toolstetapi menyerah dan mencoba sebuah udevaturan sekarang.
WinEunuuchs2Unix
4

Tidak ada jawaban yang memecahkan masalah saya yang serupa, tetapi mereka memang menempatkan saya pada jalan untuk menyelesaikannya!

Kesalahan syslog saya:

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

Ini adalah hub-port usb internal untuk opsi bluetooth yang tidak saya miliki.

melepaskan ikatan ke perangkat pci hanya mengakibatkan hub muncul kembali sebagai hub lain (5 dalam kasus saya) dan membanjiri syslog lebih lanjut.

Secara kebetulan saya melihat struktur yang tidak mengikat di bawah /sys/bus/usb/drivers/hub. Menggunakan contoh di atas saya baru saja menambahkan yang berikut ini di rc.local:

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

Hasilnya adalah syslog diam! Sekarang untuk menambahkan contoh skrip kshurig untuk manajemen daya dan saya harus menjadi emas.

Kujo770
sumber
4

Anda dapat menghapus perangkat PCI dengan menambahkan aturan udev di bawah /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'"

Ganti 0000:00:03.0dengan alamat perangkat pci yang ingin Anda hapus

lunastorm
sumber
Ini sangat berguna. Namun, seperti yang disebutkan OP, ini akan menyebabkan semua port USB turun. Adakah ada untuk menambahkan aturan untuk perangkat tertentu dan id vendor sehingga perangkat bekerja dengan semua port USB lainnya tetapi akan mengabaikan perangkat yang diberikan?
Mosty Mostacho
2

Menemukan utas ini di askubuntu:

Menggunakan lspci -vvuntuk mengidentifikasi slot PCI perangkat yang ingin Anda nonaktifkan, sepertinya Anda bisa menggunakan perintah ini untuk mematikan perangkat slot itu:

% echo 0 > /sys/bus/pci/slot/$N/power
slm
sumber
1
Saya tahu bagaimana saya bisa menonaktifkannya kapan saja, tetapi saya ingin menghentikan kernel untuk mengaktifkannya sama sekali. Selain itu, karena ini adalah perangkat PCI bawaan (seperti kebanyakan pengontrol USB), ia tidak memiliki slot. Mesin yang saya bicarakan adalah laptop, dan satu-satunya slot yang dimilikinya ( /sys/bus/pci/slots/1) adalah slot ExpressCard di luar, yang dapat saya tinggalkan secara manual.
Rhymoid
2

Ketika Anda sudah echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbindmasuk/etc/rc.local untuk booting dari Anda hanya perlu memasukkannya ke dalam naskah untuk manajemen daya deamon juga.

Seperti ini: Membuat file skrip bash yang dapat dieksekusi yang bernama 0_disable_webcamdalam direktori /etc/pm/sleep.d/:

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

Itu harus bekerja secara instan. Saya mencobanya dengan USB thumb drive dan berfungsi (artinya tetap dinonaktifkan) selama drive dicolokkan. Memasang kembali akan membutuhkan aturan udev tetapi karena webcam Anda tidak akan dicabut, itu akan berfungsi. Jika itu tidak berhasil, saya punya saran lain.

kschurig
sumber
Jika hal di atas tidak berhasil maka Anda harus menemukan port usb yang benar. Saya kira itu "1-1.2" (kalau tidak periksa di tree /sys/bus/pci/devices/0000\:00\:1a.0/bawah "usbX" yang berarti port adalah nomor yang sama). Jika "1-1.2", bukan echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbindskrip Anda yang seharusnya echo "auto" > /sys/bus/usb/devices/1-1.2/power/control; echo -n "1-1.2" > /sys/bus/usb/drivers/usb/unbind.
kschurig
0

bukan jawaban untuk pertanyaan Anda sebanyak pekerjaan di sekitar.

Mengapa tidak hanya menekan logging pesan ke konsol dengan memodifikasi syslog / (Saya tidak tahu apakah Anda menggunakan syslog atau rsyslog atau sesuatu yang lain, jadi saya tidak bisa benar-benar mengarahkan Anda lebih spesifik di direktori yang benar, tetapi jika Anda cari file konfigurasi syslog Anda untuk "konsol" dan "tty", yang akan memberi Anda tempat awal yang baik - pada kenyataannya, Anda mungkin dapat mengubah konsol ke / dev / tty1 [misalnya] dan memiliki pesan yang hanya masuk ke tty1 daripada semua konsol.

Solusi lain (untuk menjawab pertanyaan Anda, tetapi saya tidak suka), Anda dapat memasukkan blacklist modul ehci_hcd (jika sudah dimuat), atau mengkompilasi ulang kernel Anda untuk menggunakannya hanya sebagai modul. Lihatlah h ttp: //www.cyberciti.biz/faq/rhel-redhat-centos-kernel-usb-reset-high-speed-ehci_hcd/ yang menyelesaikan persis pertanyaan yang Anda tanyakan

davidgo
sumber