önyükleme sırasında belirli PCI aygıtını devre dışı bırak


14

Debian'ı Sony VAIO dizüstü bilgisayarıma yeni dmesgyükledim ve sanal konsollarımın hepsi aynı iletilerle tekrar tekrar spam oluyor.

[   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

Bu mesajların dahili olarak bağlı bir USB cihazından, büyük olasılıkla web kamerasından geldiğine inanıyorum (çünkü bu işe yaramayan tek şey). Kapatabildiğim tek yol (gerçekten kullanışlı USB portlarımı öldürmeden) USB ana bilgisayar denetleyicilerinden birini devre dışı bırakmaktır:

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

Bu da Bluetooth arayüzümü kapatıyor, ancak bununla iyiyim.

Bu ayarın devam etmesini istiyorum, böylece ihtiyacım olursa sanal konsolumu tekrar ağrısız bir şekilde kullanabiliyorum. İşletim sistemimin (Debian amd64) asla uyanmamasını istiyorum, ancak bunu nasıl yapacağımı bilmiyorum. PCI aygıt için modül takma adını kara listeye almaya çalıştım, ancak yok sayılıyor gibi görünüyor:

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

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

Bu belirli PCI aygıtın sürücüsünü tamamen devre dışı bırakmadan asla otomatik olarak etkinleştirilmemesini nasıl sağlayabilirim?


-edit- Modül kısa süre önce yeniden adlandırıldı, şimdi kullanıcı alanından şu çalışmalar yapılıyor:

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

Yine de, çekirdeğin bu cihazı ilk etapta bağlamasını engellemenin bir yolunu arıyorum.


1
Bu özel USB aygıtını PCI veri yolu yerine USB veri yolu üzerinden devre dışı bırakmak kabul edilebilir bir yaklaşım olabilir mi?
slm

Ayrıca böyle bir pci: ... dizesi kullanarak kara listeye alabileceğinizden emin misiniz? Sadece /etc/modprobe.d/blacklist dosyasında karartılabilen çekirdek modüllerini gördüm. Cihazın hangi modülü istediğini belirlemek için lspci -k komutunu kullanabilir ve bunun yerine kara listeye alabilir misiniz?
slm

Kara listeye girişi ekledikten sonra, öyle mi update-initramfs -u -k all?
Stefan Seidel

@StefanSeidel: İyi nokta. Şimdi var, ama yardımcı olmuyor gibi görünüyor. Belki de slm, böyle bir modayanın kara listeye alınmasının farklı bir sözdizimine veya yönteme ihtiyacı olduğunu düşünmekte haklıdır.
Rhymoid

@slm: Modlibe kara listesi aracılığıyla modaliases'i engelleyebilir miyim emin değilim (sistemim verdiğim satırı görmezden geliyor gibi görünüyor), ancak tüm USB ana bilgisayarları ehci_hcddevre dışı bırakacağı için modülü ( ) kaldıramıyorum benim sistemim. Ben sadece satıcı, geliştirici, alt satıcı ve altdev dayalı bu belirli cihazı devre dışı bırakmak istiyorum.
Rhymoid

Yanıtlar:


4

Son zamanlarda xen kutumu çoklu usb cihazlarıyla yapılandırırken bu sorunla karşılaştım. Birinin Dom-0 tarafından kullanılmasını ve diğerinin bir VM tarafından kullanılmasını istedim, bu yüzden cihazın xen-pciback için kullanılabilir olması gerekiyordu. Ancak, usb sürücüsü çekirdeğime uyuldu, bu yüzden sadece sürücüyü kara listeye alamadım. Çözümüm, önyükleme işleminin çok erken döneminde belirli pci bağlantı noktasını açan özel bir initramfs komut dosyası oluşturmaktı.

Bu Ubuntu 2016.04, ancak önceki sürümlerde çalışması gerekir.

İlgili üç dosya var. Onları özel kullanım durumum için adlandırdım, ancak ymmv:

/etc/unbindpciPci aygıt numarası ve sürücünün basit bir csv'si olan dosya adı verilen ilk dosya (burada gerektiği gibi yapılandırın):

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

/etc/initramfs-tools/hooks/xenfilesYukarıdaki yapılandırmayı initramfs içine kopyalayan ikinci dosya .

#! /bin/bash

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

Üçüncü dosya önyükleme sırasında ne işe yarar, ben yerleştirilir /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

Son olarak, çalıştırın update-initramfs -k all -uve yeniden başlatın.

Yapılandırma dosyasına yorumlar için destek ekleyebilirim ve burada yapılacak çok fazla temizleme var, ama benim için çalışıyor.


Hala başlatıldıktan sonra PCI aygıtını açtığınız bir çözüm, ancak hey, çözmekten daha iyi görünüyor /etc/init.d! Makineyi şu anda kullanmıyorum ve Debian ile bir daha asla önyükleme yapamam, bu yüzden test edemiyorum. Ancak, muhtemelen benim durumumda işe yarayacağından, bunu bir cevap olarak kabul edeceğim.
Rhymoid

Kabul ediyorum, hala modülü kara listeye almadan cihazın başlatılmasını önlemek için bir çözüm bulamadım. "Radeon" çizgisi aslında bu konuda erken bir girişimin bir örneğidir.
Steve Czetty

Komik düşündüm udevtüm otobüs ile yürümek ve çekirdek önyükleme sırasında yükleme ve grub yaptığı bir şey initramfssadece okunur ve kayıp. çekirdek yüklendiğinde. Ben kurulum çalışmıştı setpciiçinde initramfs-toolsama vazgeçti ve bir çalışıyorum udevşimdi kuralı.
WinEunuuchs2Unix

4

Cevapların hiçbiri benzer sorunumu çözmedi, ama beni çözme yoluna koydular!

Sistem günlüğüm hatası:

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

Bu, sahip olmadığım bir bluetooth seçeneği için dahili bir usb hub bağlantı noktasıdır.

pci cihazı bağlamak sadece hub başka bir hub (benim durumumda 5) olarak geri haşhaş ve daha fazla syslog sel ile sonuçlandı.

Şans eseri altında bağlanmamış bir yapı fark ettim /sys/bus/usb/drivers/hub. Yukarıdaki örnekleri kullanarak sadece rc.local içinde aşağıdakileri ekledim:

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

Sonuç syslog sessizliğidir! Şimdi güç yönetimi için kshurig'in senaryo örneğini eklemek ve altın olmalıyım.


4

/Etc/udev/rules.d altına udev kuralı ekleyerek bir PCI aygıtını kaldırabilirsiniz:

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.0Kaldırmak istediğiniz pci aygıtının adresiyle değiştirin


Bu oldukça faydalı. Bununla birlikte, OP'nin belirttiği gibi, bu tüm USB bağlantı noktalarının düşmesine neden olacaktır. Cihazların diğer tüm USB bağlantı noktalarıyla çalışması ancak belirli bir cihazı göz ardı etmesi için belirli bir cihaz ve satıcı kimliği için bir kural eklemek için yine de var mı?
Mosty Mostacho

2

Bu konuyu askubuntu'da buldum:

Devre lspci -vvdışı bırakmak istediğiniz bir aygıtın PCI yuvasını tanımlamak için kullanıldığında , söz konusu yuvanın aygıtını kapatmak için bu komutu kullanabileceğiniz gibi geliyordu:

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

1
Başka bir zamanda nasıl devre dışı bırakabileceğimi biliyorum, ancak çekirdeğin onu etkinleştirmesini durdurmak istiyorum. Ayrıca, bu kablolu bir PCI aygıt (çoğu USB denetleyicisi gibi) olduğu için yuvası yoktur. Bahsettiğim makine bir dizüstü bilgisayardır ve sahip olduğu tek yuva ( /sys/bus/pci/slots/1) dışarıdaki ExpressCard yuvasıdır ve manuel olarak boşaltabilirim.
Rhymoid

2

Zaten varsa echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbindiçinde /etc/rc.localönyükleme için sadece lutfen deamon güç yönetimi için bir komut dosyası koymak gerekenden daha.

Şöyle devam ediyor: adlandırılmış bir yürütülebilir bash komut dosyası oluşturun 0_disable_webcamdizinde /etc/pm/sleep.d/:

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

Anında çalışmalıdır. Bir usb başparmak sürücü ile denedim ve sürücü takılı olduğu sürece (devre dışı kaldı anlamına gelir) çalıştı. Yeniden takma işlemi udev kurallarına ihtiyaç duyar, ancak web kameranızın fişi çekilmeyeceğinden çalışmalıdır. Bu hile yapmazsa başka bir önerim var.


Yukarıdaki işe yaramazsa, doğru usb bağlantı noktasını bulmanız gerekir. Sanırım "1-1.2" (aksi takdirde tree /sys/bus/pci/devices/0000\:00\:1a.0/port benzer bir sayı anlamına gelir "usbX" altında kontrol edin ). Eğer "1-1.2" echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbindise betiğinizin yerine sahip olmalıdır echo "auto" > /sys/bus/usb/devices/1-1.2/power/control; echo -n "1-1.2" > /sys/bus/usb/drivers/usb/unbind.
kschurig

0

soruna bir çözüm kadar değil.

Neden sadece syslog / (syslog veya rsyslog ya da başka bir şey kullanıp kullanmadığınızı bilmiyorum) syslog yapılandırma dosyalarınızda size iyi bir başlangıç ​​yeri sağlayacak "konsol" ve "tty" için arama yapın - aslında, konsolu muhtemelen / dev / tty1 [örneğin] olarak değiştirebilir ve iletilerin tümünü değil, yalnızca tty1'e giriş yapabilirsiniz konsolları.

Diğer çözüm (sorunuza cevap vermek için, ama sevmiyorum), ehci_hcd modülünü (yüklüyse) kara listeye alabilir veya yalnızca asa modülünü kullanmak için çekirdeğinizi yeniden derleyebilirsiniz. H göz at //www.cyberciti.biz/faq/rhel-redhat-centos-kernel-usb-reset-high-speed-ehci_hcd/: ttp tam soruyorsun soru giderir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.