web-dev-qa-db-ja.com

起動時に特定のPCIデバイスを無効にする

Sony VAIOラップトップにDebianを再インストールしたところ、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デバイス、おそらくWebカメラから送信されていると思います(それが機能しないのはこのためです)。 (実際に役立つUSBポートを強制終了せずに)シャットダウンしたように見える唯一の方法は、USBホストコントローラーの1つを無効にすることです。

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

これは私のBluetoothインターフェースもダウンさせますが、私はそれで大丈夫です。

この設定を維持したいので、必要に応じて仮想コンソールを簡単に再度使用できます。私のオペレーティングシステム(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-モジュールの名前が最近変更されましたが、ユーザーランドから次のように動作します:

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

それでも、そもそもカーネルがそのデバイスをバインドしないようにする方法を探しています。

14
Rhymoid

最近、複数のUSBデバイスでXenボックスを構成しているときにこの問題に遭遇しました。 1つはDom-0で使用し、もう1つはVMで使用したかったため、xen-pcibackで使用できるデバイスが必要でした。しかし、usbドライバーはカーネルに準拠しているため、ドライバーをブラックリストに載せることはできませんでした。私の解決策は、起動プロセスの非常に早い段階で特定のPCIポートをアンバインドするカスタムinitramfsスクリプトを作成することでした。

これはUbuntu 2016.04ですが、以前のバージョンでも動作するはずです。

関係するファイルは3つあります。私は特定のユースケースに合わせて名前を付けましたが、ymmv:

最初のファイルは/etc/unbindpciという名前で、pciデバイス番号とドライバーの単純なcsvです(ここで必要に応じて構成します)。

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

2番目のファイル/etc/initramfs-tools/hooks/xenfiles。上記の構成をinitramfsにコピーします。

#! /bin/bash

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

3番目のファイルは起動時に機能するもので、/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を実行して再起動します。

構成ファイルにコメントのサポートを含めることができます。ここで行うクリーンアップはたくさんありますが、私にとってはうまくいきます。

4
Steve Czetty

/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デバイスアドレス

4
lunastorm

答えはどれも私の同様の問題を解決しませんでしたが、それらは私を解決への道に導きました!

私のsyslogエラー:

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

これは、私が持っていないBluetoothオプション用の内部USBハブポートです。

pciデバイスにバインドを解除すると、ハブが別のハブ(私の場合は5)として再びポップアップし、syslogがさらにフラッディングします。

たまたま、/sys/bus/usb/drivers/hubの下にバインドされていない構造があることに気づきました。上記の例を使用して、rc.localに次のコードを追加しました。

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

結果は、syslog silenceです。ここで、電源管理のためのkshurigのスクリプト例を追加すると、私は黄金のはずです。

4
Kujo770

Askubuntuでこのスレッドを見つけました:

lspci -vvを使用して、無効にするデバイスのPCIスロットを特定すると、次のコマンドを使用してそのスロットのデバイスをオフにできるように思えます。

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

ブート用のecho "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbind/etc/rc.localがすでにある場合は、電源管理デーモン用のスクリプトに追加するだけで済みます。

次のようになります:0_disable_webcamという名前の実行可能なbashスクリプトファイルをディレクトリ/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サムドライブで試してみましたが、ドライブが接続されている限り、機能していました(無効のままでした)。再接続にはudevルールが必要ですが、Webカメラは接続解除されないため、機能するはずです。それでうまくいかない場合は、別の提案をします。

2
kschurig

回避策ほど質問に対する回答ではありません。

Syslog /を変更して、コンソールへのメッセージのロギングを単に抑制しないのはなぜですか(syslogまたはrsyslogなどを使用しているかどうかはわかりません。そのため、正確に正しいディレクトリを示すことはできませんが、 Syslog設定ファイルで「コンソール」と「tty」を検索します。これにより、適切な出発点が得られます。実際、おそらくコンソールを/ dev/tty1に変更し、メッセージをすべてではなくtty1にのみ記録することができます。コンソール。

他の解決策(あなたの質問には答えますが、私は好きではありません)は、ehci_hcdモジュール(ロードされている場合)をブラックリストに載せるか、カーネルを再コンパイルして、モジュールのみを使用することができます。 h ttp://www.cyberciti.biz/faq/rhel-redhat-c​​entos-kernel-usb-reset-high-speed-ehci_hcd/ を見てください。これは、あなたが求めている質問を正確に解決します

0
davidgo