ปิดใช้งานอุปกรณ์ PCI เฉพาะเมื่อบู๊ต


14

ฉันเพิ่งติดตั้ง Debian ใหม่บนแล็ปท็อป 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-โมดูลถูกเปลี่ยนชื่อเมื่อเร็ว ๆ นี้ตอนนี้ทำงานต่อไปนี้จาก userland:

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

ถึงกระนั้นฉันกำลังมองหาวิธีที่จะหยุดเคอร์เนลจากการผูกอุปกรณ์นั้นในสถานที่แรก


1
วิธีการที่ยอมรับได้คือการปิดการใช้งานอุปกรณ์ USB นี้ผ่านบัส USB ไม่ใช่บัส PCI หรือไม่
slm

คุณแน่ใจหรือว่าคุณสามารถขึ้นบัญชีดำโดยใช้ pci: ... ฉันเคยเห็นโมดูลเคอร์เนลที่สามารถขึ้นบัญชีดำได้ในไฟล์ /etc/modprobe.d/blacklist คุณไม่สามารถใช้ lspci -k เพื่อระบุโมดูลที่อุปกรณ์ต้องการแล้วทำรายการดำแทนได้หรือไม่
slm

หลังจากเพิ่มรายการในบัญชีดำแล้วคุณupdate-initramfs -u -k allล่ะ?
Stefan Seidel

@StefanSeidel: จุดดี ฉันมีตอนนี้ แต่ดูเหมือนจะไม่ช่วย บางที slm คิดถูกว่าการขึ้นบัญชีดำแบบนี้ต้องใช้ไวยากรณ์หรือวิธีการต่างกัน
Rhymoid

@slm: ฉันไม่แน่ใจว่าฉันสามารถบล็อก modaliases ผ่านบัญชีดำ modprobe (ระบบของฉันดูเหมือนจะไม่สนใจบรรทัดที่ฉันให้) แต่ฉันไม่สามารถลบโมดูล ( ehci_hcd) ได้เนื่องจากจะปิดการใช้งานโฮสต์ USB ทั้งหมดบน ระบบของฉัน ฉันแค่ต้องการที่จะปิดการใช้งานอุปกรณ์เฉพาะนี้ขึ้นอยู่กับผู้ขาย, dev, subvendor และ subev
Rhymoid

คำตอบ:


4

ฉันเพิ่งพบปัญหานี้ในขณะที่กำหนดค่ากล่อง xen ของฉันด้วยอุปกรณ์ usb หลายตัว ฉันต้องการให้ Dom-0 ใช้และอีกอันใช้โดย VM ดังนั้นฉันจึงต้องการอุปกรณ์ที่จะใช้งานกับ xen-pciback อย่างไรก็ตามไดรเวอร์ usb ถูกใช้งานกับเคอร์เนลของฉันดังนั้นฉันจึงไม่สามารถขึ้นบัญชีดำได้ วิธีแก้ปัญหาของฉันคือการสร้างสคริปต์ initramfs ที่กำหนดเองที่ unbinds พอร์ต pci ที่ระบุเฉพาะในขั้นตอนการบู๊ต

นี่คือ Ubuntu 2016.04 แต่มันควรจะทำงานในเวอร์ชันก่อนหน้า

มีสามไฟล์ที่เกี่ยวข้อง ฉันตั้งชื่อพวกเขาสำหรับกรณีการใช้งานเฉพาะของฉัน แต่ ymmv:

ไฟล์แรกชื่อ/etc/unbindpciไฟล์ซึ่งเป็น csv อย่างง่ายของหมายเลขอุปกรณ์ pci และไดรเวอร์ (กำหนดค่าตามที่ต้องการที่นี่):

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! ฉันไม่ได้ใช้งานเครื่องในตอนนี้และฉันอาจไม่เคยบูตด้วย Debian อีกเลยดังนั้นฉันจึงไม่สามารถทดสอบได้ อย่างไรก็ตามเนื่องจากมันอาจจะใช้ได้ในกรณีของฉันฉันจะยอมรับมันเป็นคำตอบ
Rhymoid

ตกลงฉันยังไม่พบวิธีแก้ปัญหาในการป้องกันการเริ่มต้นอุปกรณ์โดยไม่ขึ้นบัญชีดำของโมดูล บรรทัด "radeon" เป็นตัวอย่างของความพยายามแรกเริ่มที่จริง ๆ แล้ว
Steve 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

นี่เป็นฮับ 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

คุณสามารถลบอุปกรณ์ PCI ได้โดยเพิ่มกฎ udev ภายใต้ /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'"

แทนที่0000:00:03.0ด้วยที่อยู่อุปกรณ์ pci ที่คุณต้องการลบ


มันมีประโยชน์มาก อย่างไรก็ตามดังที่ OP กล่าวถึงสิ่งนี้จะส่งผลให้พอร์ต USB ทั้งหมดหยุดทำงาน อย่างไรก็ตามมีการเพิ่มกฎสำหรับอุปกรณ์เฉพาะและรหัสผู้ขายเพื่อให้อุปกรณ์ทำงานกับพอร์ต USB อื่น ๆ ทั้งหมด แต่จะไม่สนใจอุปกรณ์ที่กำหนดหรือไม่
Mosty Mostacho

2

พบกระทู้นี้ใน Askubuntu:

การใช้ lspci -vvเพื่อระบุสล็อต PCI ของอุปกรณ์ที่คุณต้องการปิดการใช้งานฟังดูเหมือนว่าคุณสามารถใช้คำสั่งนี้เพื่อปิดอุปกรณ์ของสล็อตนั้น:

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

1
ฉันรู้ว่าฉันสามารถปิดการใช้งานได้ตลอดเวลา แต่ฉันต้องการหยุดเคอร์เนลไม่ให้เปิดใช้งานเลย นอกจากนี้เนื่องจากเป็นอุปกรณ์ PCI แบบเดินสาย (เช่นคอนโทรลเลอร์ USB ส่วนใหญ่) จึงไม่มีสล็อต เครื่องที่ฉันกำลังพูดถึงคือแล็ปท็อปและมีเพียงช่องเดียวที่มี ( /sys/bus/pci/slots/1) คือช่องเสียบ ExpressCard ที่ด้านนอกซึ่งฉันสามารถออกได้ด้วยตนเอง
Rhymoid

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

มันควรจะทำงานได้ทันที ฉันลองกับ usb thumb drive และใช้งานได้ (หมายความว่ามันยังคงปิดการใช้งาน) ตราบเท่าที่เสียบไดรฟ์ การแทนที่จะต้องมีกฎของ udev แต่เนื่องจากเว็บแคมของคุณจะไม่ได้ถอดปลั๊กออกจึงควรใช้งานได้ หากไม่ได้ทำเคล็ดลับฉันมีข้อเสนอแนะอื่น


หากข้างต้นไม่ทำงานคุณต้องค้นหาพอร์ต usb ที่ถูกต้อง ฉันเดาว่ามันคือ "1-1.2" (มิฉะนั้นตรวจสอบด้วยtree /sys/bus/pci/devices/0000\:00\:1a.0/ภายใต้ "usbX" ซึ่งหมายความว่าพอร์ตเป็นหมายเลขที่คล้ายกัน) ถ้ามันคือ "1-1.2" แทนคุณสคริปต์ที่ควรจะมีecho "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbind 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 config files ของคุณสำหรับ "console" และ "tty" ซึ่งจะทำให้คุณเริ่มต้นได้ดี - อันที่จริงคุณสามารถเปลี่ยน console เป็น / dev / tty1 [ตัวอย่าง] และมีข้อความเข้าสู่ tty1 เท่านั้น คอนโซล

โซลูชันอื่น (เพื่อตอบคำถามของคุณ แต่ฉันไม่ชอบ) คุณสามารถขึ้นบัญชีดำโมดูล ehci_hcd (ถ้ามันโหลด) หรือคอมไพล์เคอร์เนลของคุณเพื่อใช้เป็นโมดูล asa เท่านั้น ลองดูที่ 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.