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


14

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デバイス、おそらくウェブカメラから送信されたものだと思います(動作しないのはそれだけだからです)。(実際に役立つUSBポートを殺すことなく)シャットダウンするように思える唯一の方法は、USBホストコントローラーのいずれかを無効にすることです。

# 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

それでも、私はカーネルがそもそもそのデバイスをバインドするのを止める方法を探しています。


1
PCIバスではなくUSBバスを介してこの特定のUSBデバイスを無効にすることは、受け入れられるアプローチでしょうか?
slm

また、そのようなpci:...文字列を使用してブラックリストに登録できることを確認していますか?/etc/modprobe.d/blacklistファイルでカーネルモジュールがブラックリストに登録されているのを見たことがあります。lspci -kを使用して、デバイスが必要とするモジュールを識別し、代わりにブラックリストを作成できませんでしたか?
slm

エントリをブラックリストに追加した後、しましたかupdate-initramfs -u -k all
ステファンザイデル

@StefanSeidel:良い点。私は今持っていますが、助けにはならないようです。おそらく、slmは、このようなモダリアをブラックリストに登録するには別の構文または方法が必要だと考えるのが正しいでしょう。
ライモイド

@slm:私はmodprobeをブラックリストを通じてmodaliasesをブロックすることができる場合、私は(私のシステムは、私はそれを与えた行を無視しているようだ)わからないんだけど、私はただのモジュールを削除(ことができないehci_hcdことが無効になるため、)すべてのUSBホストを私のシステム。ベンダー、開発者、サブベンダー、およびサブ開発者に基づいて、この特定のデバイスを無効にするだけです。
ライモイド

回答:


4

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

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

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

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

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

/etc/initramfs-tools/hooks/xenfiles上記の設定をinitramfsにコピーする2番目のファイル。

#! /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して再起動します。

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


PCIデバイスの初期化後にバインドを解除するソリューションでもありますが、解決するよりも見た目が良い/etc/init.dです!私は現在マシンを使用しておらず、Debianで二度と起動しないかもしれないので、テストできません。ただし、おそらく私の場合はうまくいくはずなので、答えとして受け入れます。
ライモイド

同意しましたが、モジュールをブラックリストに登録せずにデバイスの初期化を防ぐための解決策はまだ見つかりませんでした。「ラデオン」行は、実際にはそれに対する初期の試みの例です。
スティーブツェッティ16

面白いのudevは、カーネルブート中にすべてのバスウォークとロードinitramfsが行われ、grubで行われた操作はすべて読み取り専用で失われると思ったからです。カーネルがロードされたとき。私はセットアップしようとしましsetpciinitramfs-toolsが、あきらめて、udev今ルールを試しています。
WinEunuuchs2Unix

4

答えのどれも私の同様の問題を解決しませんでしたが、彼らは私をそれを解決する道につけました!

私の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の沈黙です!ここで、電源管理用のkshurigのスクリプト例を追加します。


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デバイスアドレスに置き換えます


これは非常に便利です。ただし、OPが述べたように、これによりすべてのUSBポートがダウンします。とにかく特定のデバイスとベンダーIDにルールを追加して、デバイスが他のすべてのUSBポートで動作するが、特定のデバイスを無視するようにする方法はありますか?
モスティモスタチョ14年

2

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

使用してlspci -vv無効にすることを、デバイスのPCIスロットを識別するために、それはそのスロットのデバイスをオフにするには、このコマンドを使用することができますように聞こえました。

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

1
私はいつでもそれを無効にする方法を知っていますが、カーネルがそれをアクティブにするのをまったく止めたいです。また、これはハードワイヤードPCIデバイスであるため(ほとんどのUSBコントローラーと同様)、スロットはありません。私が話しているマシンはラップトップであり、それが持っている唯一のスロット(/sys/bus/pci/slots/1)は外側のExpressCardスロットであり、手動で空けることができます。
ライモイド

2

あなたが既に持っているときecho "0000:00:1a.0" > /sys/bus/pci/drivers/ehci_hcd/unbind/etc/rc.local、ブートのためのあなただけのaswellデーモン電源管理用スクリプトにそれを置くために必要以上に。

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


上記が機能しない場合は、正しい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の設定ファイルで「コンソール」と「tty」を検索します。これにより、適切な出発点が得られます。実際、コンソールを/ dev / tty1 [たとえば]に変更し、すべてではなくtty1のみにメッセージを記録できます。コンソール。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.