बूट पर विशिष्ट 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

मेरा मानना ​​है कि ये संदेश आंतरिक रूप से जुड़े यूएसबी डिवाइस से आ रहे हैं, सबसे अधिक संभावना है कि वेब कैमरा (क्योंकि यह केवल एक चीज है जो काम नहीं करता है)। जिस तरह से मैं इसे बंद करने के लिए लग सकता है (मेरे वास्तव में उपयोगी यूएसबी पोर्ट को मारने के बिना) यूएसबी होस्ट नियंत्रकों में से एक को अक्षम करना है:

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

यह मेरे ब्लूटूथ इंटरफ़ेस को भी नीचे ले जाता है, लेकिन मैं इसके साथ ठीक हूं।

मैं चाहूंगा कि यह सेटिंग बनी रहे, ताकि मैं अपनी वर्चुअल कंसोल का फिर से उपयोग कर सकूं। मैं चाहता हूं कि मेरा ऑपरेटिंग सिस्टम (डेबियन am64) इसे कभी न जगाए, लेकिन मुझे नहीं पता कि यह कैसे करना है। मैंने 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 डिवाइस को निष्क्रिय करने के लिए एक स्वीकार्य दृष्टिकोण होगा?
स्लम

क्या आप सुनिश्चित हैं कि आप एक pci का उपयोग करके ब्लैकलिस्ट कर सकते हैं: ... स्ट्रिंग की तरह? मैंने कभी केवल कर्नेल मॉड्यूल को /etc/modprobe.d/blacklist फ़ाइल में काली सूची में देखा है। क्या आप lspci -k का उपयोग यह पहचानने के लिए नहीं कर सकते हैं कि डिवाइस को कौन सा मॉड्यूल चाहिए और फिर इसके बजाय काली सूची?
SLM

ब्लैकलिस्ट में प्रविष्टि जोड़ने के बाद, क्या आपने update-initramfs -u -k all?
स्टीफन सेडेल

@StefanSeidel: अच्छी बात है। मेरे पास अब है, लेकिन यह मदद करने के लिए प्रतीत नहीं होता है। शायद स्लम यह सोचने में सही है कि इस तरह एक मोलिया को ब्लैकलिस्ट करने के लिए एक अलग वाक्यविन्यास या विधि की आवश्यकता होती है।
15

@ एसएलएम: मुझे यकीन नहीं है कि अगर मैं मोडप्लॉइड को मॉडर्बाइक ब्लैकलिस्ट के माध्यम से ब्लॉक कर सकता हूं (मेरा सिस्टम मुझे दी गई लाइन को नजरअंदाज करना लगता है), लेकिन मैं सिर्फ मॉड्यूल ( ehci_hcd) को हटा नहीं सकता , क्योंकि वह सभी यूएसबी होस्ट को निष्क्रिय कर देगा । मेरा सिस्टम। मैं केवल इस विशिष्ट उपकरण को उसके विक्रेता, देव, सबवेंडर और सबदेव के आधार पर अक्षम करना चाहता हूं।
14

जवाबों:


4

मैं हाल ही में इस मुद्दे में कई USB उपकरणों के साथ अपने xen बॉक्स को कॉन्फ़िगर करते समय भाग गया। मैं चाहता था कि एक का उपयोग DOM-0 द्वारा किया जाए, और दूसरे का उपयोग VM द्वारा किया जाए, इसलिए मुझे xen-pciback के लिए डिवाइस उपलब्ध होने की आवश्यकता थी। हालाँकि, USB ड्राइवर को मेरे कर्नेल में संकलित किया गया था, इसलिए मैं ड्राइवर को केवल ब्लैकलिस्ट नहीं कर सकता था। मेरा समाधान एक कस्टम initramfs स्क्रिप्ट बनाने के लिए था जो बूट प्रक्रिया में विशिष्ट पीसीआई पोर्ट को खोल देता है।

यह उबंटू 2016.04 है, लेकिन इसे पहले के संस्करणों में काम करना चाहिए।

इसमें तीन फाइलें शामिल हैं। मैंने उन्हें अपने विशिष्ट उपयोग के मामले में नाम दिया, लेकिन ymmv:

पहली फ़ाइल, नामित /etc/unbindpciफ़ाइल जो pci डिवाइस नंबर और ड्राइवर का एक सरल सीएसवी है (यहां आवश्यकतानुसार कॉन्फ़िगर करें):

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

दूसरी फ़ाइल /etc/initramfs-tools/hooks/xenfiles, जो इनट्राम्राम्स में उपरोक्त कॉन्फिगरेशन को कॉपी करती है।

#! /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और रिबूट।

मैं कॉन्फ़िगर फ़ाइल में टिप्पणियों के लिए समर्थन शामिल कर सकता हूं, और यहां बहुत सफाई करना है, लेकिन यह मेरे लिए काम करता है।


यह अभी भी एक समाधान है जहां आप पीसीआई उपकरण को शुरू करने के बाद अनबाइंड करते हैं, लेकिन हे, यह इसे हल करने की तुलना में बेहतर दिखता है /etc/init.d! मैं अभी मशीन का उपयोग नहीं कर रहा हूं, और मैं इसे डेबियन के साथ फिर से बूट नहीं कर सकता, इसलिए मैं इसका परीक्षण नहीं कर सकता। हालाँकि, क्योंकि यह शायद मेरे मामले में काम करेगा, मैं इसे एक उत्तर के रूप में स्वीकार करूँगा।
राइमॉइड

सहमत, मुझे अभी भी मॉड्यूल को ब्लैकलिस्ट किए बिना डिवाइस को रोकने के लिए एक समाधान नहीं मिला है। "रैडॉन" लाइन वास्तव में उस समय के शुरुआती प्रयास का एक उदाहरण है।
स्टीव Czetty

मजेदार मैंने सोचा udevकि कर्नेल बूट के दौरान सभी बसों के माध्यम से और लोड हो रहा था और कुछ भी ग्रब में किया गया initramfsथा केवल पढ़ा गया और खो गया। जब कर्नेल लोड किया जाता है। मैंने सेटअप करने की कोशिश की थी setpci, initramfs-toolsलेकिन हार udevमान ली और अब नियम बनाने की कोशिश कर रहा हूं ।
WinEunuuchs2Unix

4

किसी भी उत्तर ने मेरी समान समस्या को हल नहीं किया, लेकिन उन्होंने मुझे इसे हल करने के मार्ग पर रखा!

मेरी syslog त्रुटि:

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

यह मेरे पास नहीं है ब्लूटूथ विकल्प के लिए एक आंतरिक यूएसबी हब-पोर्ट है।

पीसीआई डिवाइस को unbind करने के परिणामस्वरूप बस हब एक और हब (मेरे मामले में 5) के रूप में वापस पॉप अप हो जाता है और आगे बाढ़ आ जाती है।

संयोग से मैंने इसके तहत एक अस्पष्ट संरचना पर ध्यान दिया /sys/bus/usb/drivers/hub। ऊपर के उदाहरणों का उपयोग करते हुए मैंने निम्नलिखित को r.local में जोड़ा:

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

नतीजा है साइलॉग साइलेंस! शक्ति प्रबंधन के लिए क्षुरिग के स्क्रिप्ट उदाहरण को जोड़ने के लिए और मुझे सुनहरा होना चाहिए।


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 डिवाइस पते से बदलें जिसे आप निकालना चाहते हैं


यह बहुत उपयोगी है। हालाँकि, जैसा कि ओपी ने उल्लेख किया है, इसके परिणामस्वरूप सभी यूएसबी पोर्ट नीचे चले जाएंगे। क्या किसी विशिष्ट डिवाइस और वेंडर आईडी के लिए कोई नियम जोड़ना है ताकि डिवाइस अन्य सभी यूएसबी पोर्ट के साथ काम करे लेकिन किसी दिए गए डिवाइस की उपेक्षा करेगा?
मोस्ट मोस्टैको

2

इस धागे को आस्कुबंटु पर मिला:

lspci -vvडिवाइस के PCI स्लॉट की पहचान करने के लिए जिसका उपयोग आप अक्षम करना चाहते हैं, ऐसा लग रहा था कि आप इस कमांड का उपयोग उस स्लॉट के डिवाइस को बंद करने के लिए कर सकते हैं:

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

1
मुझे पता है कि मैं इसे किसी अन्य समय में कैसे अक्षम कर सकता हूं, लेकिन मैं कर्नेल को इसे सक्रिय करने से रोकना चाहता हूं। इसके अलावा, चूंकि यह एक हार्डवेयर्ड PCI डिवाइस है (जैसे अधिकांश USB नियंत्रक), इसमें कोई स्लॉट नहीं है। मैं जिस मशीन के बारे में बात कर रहा हूं वह एक लैपटॉप है, और इसके पास एकमात्र स्लॉट ( /sys/bus/pci/slots/1) बाहर की तरफ एक्सप्रेसकार्ड स्लॉट है, जिसे मैं खाली कर सकता हूं।
राइमॉइड

2

आपके पास पहले से जब echo "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbindमें /etc/rc.localबूट के लिए की तुलना में आप सिर्फ deamon ऊर्जा प्रबंधन के लिए एक स्क्रिप्ट में लगाने की जरूरत है अच्छी तरह से।

इस तरह जाता है: 0_disable_webcamनिर्देशिका में नामित एक निष्पादन योग्य बैश स्क्रिप्ट फ़ाइल बनाएँ /etc/pm/sleep.d/:

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

इसे तुरंत काम करना चाहिए। जब तक ड्राइव प्लग की गई थी, मैंने इसे एक थंब थंब ड्राइव के साथ आज़माया और इसका मतलब है कि यह निष्क्रिय रहा। रिपल्गिंग को udv नियमों की आवश्यकता होगी लेकिन चूंकि आपका वेबकैम अनप्लग नहीं होगा, इसलिए इसे काम करना चाहिए। अगर वह चाल नहीं चली तो मेरा एक और सुझाव है।


यदि ऊपर काम नहीं करता है, तो आपको सही यूएसबी पोर्ट ढूंढना होगा। मुझे लगता है कि यह "1-1.2" है (अन्यथा tree /sys/bus/pci/devices/0000\:00\:1a.0/"यूएसबीएक्स" के तहत जांच करें जिसका अर्थ है कि पोर्ट एक समान संख्या है)। अगर यह आपकी 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 / modifying करके दबाएं / (मुझे नहीं पता कि आप syslog या rsyslog या कुछ और का उपयोग करते हैं, इसलिए मैं वास्तव में आपको विशेष रूप से सही निर्देशिका में इंगित नहीं कर सकता, लेकिन अगर आप "कंसोल" और "ट्टी" के लिए अपनी syslog की कॉन्फिग फाइलों को खोजें, जो आपको एक अच्छी शुरुआत देंगी - वास्तव में, आप शायद कंसोल को / dev / tty1 [उदाहरण के लिए] में बदल सकते हैं और केवल tty1 पर लॉग इन करने के लिए मैसेज करें - केवल शान्ति।

अन्य समाधान (आपके प्रश्न का उत्तर देने के लिए, लेकिन मुझे पसंद नहीं है), आप ehci_hcd मॉड्यूल (यदि इसका लोड किया गया है) को ब्लैकलिस्ट कर सकते हैं, या इसे केवल asa मॉड्यूल का उपयोग करने के लिए अपने कर्नेल को फिर से जोड़ सकते हैं। H ttp पर एक नज़र डालें : //www.cyberciti.biz/faq/rhel-redhat-centos-kernel-usb-reset-high-speed-ehci_hcd/ जो आपके द्वारा पूछे जा रहे प्रश्न को ठीक से हल करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.