お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。
  • インデックス
  •  » ハードウェア
  •  » USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について

#1 2010-06-01 01:58:45

MidSpecLowLoad
メンバ
登録日: 2009-11-19

USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について

USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について
/lib/modules/$(uname -r)/modules.usbmap
で判定できるのではないかと思っているのですが、これは正しいでしょうか。

確かめようとしていることは、
「少なくてもmodules.usbmapにIdVendor,IdProductの組み合わせが載っていなければデフォルトではカーネルモジュールがロードされず動作しない。」
ということです。
(載っていたからといって、うまくいくとは限らないので)

もう一点は
「modules.usbmapにIdVendor,IdProductの組み合わせが同じ行が複数ある場合はblacklistの登録が必要」
ということです。

正しいことが確認できればWikiの方にTipsとして載せようと考えています。

以下、詳細です。

/lib/modules/$(uname -r)/modules.usbmapはdepmodによって作成されます。
元データは各モジュールの'__mod_usb_device_table'のシンボル内容です。
フォーマットはmodule-init-toolsパッケージのソースに含まれるtables.hに
下記のように定義されています。

コード:

struct usb_device_id {
    /* which fields to match against? */
    unsigned short  match_flags;

    /* Used for product specific matches; range is inclusive */
    unsigned short  idVendor;
    unsigned short  idProduct;
    unsigned short  bcdDevice_lo;
    unsigned short  bcdDevice_hi;

    /* Used for device class matches */
    unsigned char   bDeviceClass;
    unsigned char   bDeviceSubClass;
    unsigned char   bDeviceProtocol;

    /* Used for interface class matches */
    unsigned char   bInterfaceClass;
    unsigned char   bInterfaceSubClass;
    unsigned char   bInterfaceProtocol;

};
#define USB_DEVICE_SIZE32 (5 * 2 + 6 * 1 + 4)
#define USB_DEVICE_SIZE64 (5 * 2 + 6 * 1 + 8)

modules.usbmapをheadで表示してみると下記の用になっています。

コード:

# usb module         match_flags idVendor idProduct bcdDevice_lo bcdDevice_hi bDeviceClass bDeviceSubClass bDeviceProtocol bInterfaceClass bInterfaceSubClass bInterfaceProtocol driver_info
at76c50x-usb         0x0003      0x03eb   0x7603    0x0000       0x0000       0x00         0x00            0x00            0x00            0x00               0x00               0x0
at76c50x-usb         0x0003      0x066b   0x2211    0x0000       0x0000       0x00         0x00            0x00            0x00            0x00               0x00               0x0
at76c50x-usb         0x0003      0x0864   0x4100    0x0000       0x0000       0x00         0x00            0x00            0x00            0x00               0x00               0x0
at76c50x-usb         0x0003      0x0b3b   0x1612    0x0000       0x0000       0x00         0x00            0x00            0x00            0x00               0x00               0x0
at76c50x-usb         0x0003      0x03f0   0x011c    0x0000       0x0000       0x00         0x00            0x00            0x00            0x00               0x00               0x0
at76c50x-usb         0x0003      0x0cde   0x0001    0x0000       0x0000       0x00         0x00            0x00            0x00            0x00               0x00               0x0
at76c50x-usb         0x0003      0x069a   0x0320    0x0000       0x0000       0x00         0x00            0x00            0x00            0x00               0x00               0x0
at76c50x-usb         0x0003      0x0d5c   0xa001    0x0000       0x0000       0x00         0x00            0x00            0x00            0x00               0x00               0x0
at76c50x-usb         0x0003      0x04a5   0x9000    0x0000       0x0000       0x00         0x00            0x00            0x00            0x00               0x00               0x0

このファイルのidVendor,idProductとlsusbの出力を比較すればそのUSB機器のモジュールがデフォルトでロードされるのではないかと推量しています。
また同一のidVendor,idProductが2行以上含まれている場合、1つのモジュールを除いてblacklistの指定が必要だと推量しています。
これは正しいでしょうか。
カーネルがモジュールをロードする仕組みに関して知識がなく自分では判断できずにいます。

udevが関連していると思い、udevパッケージに含まれている /lib/udev/rule.d/75-net-description.rulesを参照してみたのですが、
ここで使われているコマンドudb_idやusb-dbは"/sys"の下のファイルを読んで/var/log/udevに出力を行うことと、変数を2つほど設定しているだけに見えます。
(usb-dbは/var/lib/usbutils/usb.idsも見ていました。)
結局これがハードウェアの認識からカーネルモジュールのロードに至るプロセスの中でどのような意味があるかわかりませんでした。

若干各論になりますが、rt2870staを動作させるためにrt2800usb,rt2x00usb,rt2x00libをblaklistに指定するという投稿がいくつかあるのですが、
modules.usbmapに記載されているのはrt2800usbだけであり、rt2800usbは下記のモジュールに依存していました。
・rt2x00usb(直接)
・rt2x00lib(直接)
・crc-ccitt(直接)
・led-class(間接)
・mac80211(間接)
・cfg80211(間接)
rt2x00usb,rt2x00libはrt2800usbがこれらに依存しているためにロードされるので、
blacklistの指定に必要なのはrt2800usbだけだと思うのですが、これは正しいでしょうか。
(直接の依存はmodinfo rt2800usbの出力,間接的なものも含める場合は/lib/modules/$(uname -r)/modules.depの内容で確認しました。)

これらのことについてご存知の方がいらっしゃいましたらご教示いただけますでしょうか。
よろしくお願いいたします。

オフライン

 

#2 2010-06-01 10:22:45

hito
管理者
登録日: 2007-03-18

Re: USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について

MidSpecLowLoad による投稿:

USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について
/lib/modules/$(uname -r)/modules.usbmap
で判定できるのではないかと思っているのですが、これは正しいでしょうか。

上記は真ですが、以下の部分と類推に利用する手法は間違っています。

確かめようとしていることは、
「少なくてもmodules.usbmapにIdVendor,IdProductの組み合わせが載っていなければデフォルトではカーネルモジュールがロードされず動作しない。」
ということです。

偽です。match_flagsの指定によってはIdVendor, IdProduct以外のカラムで判定されます。hotplug.txt参照。
「たいていの場合」という前提を組み入れればmatch_flags=0x03なので真になりますが、この理解は大変危険です。

もう一点は
「modules.usbmapにIdVendor,IdProductの組み合わせが同じ行が複数ある場合はblacklistの登録が必要」
ということです。

上記のmatch_flagsの話と同様の理由で偽です。
match_flags==0x03ないし、IdVendor,IdProductを利用するより深いフラグ値がセットされるなら真になります。

正しいことが確認できればWikiの方にTipsとして載せようと考えています。

偶然合っているだけという疑惑があるので、この理解でTipsとして載せるのは大変危ない気がします。

若干各論になりますが、rt2870staを動作させるためにrt2800usb,rt2x00usb,rt2x00libをblaklistに指定するという投稿がいくつかあるのですが、
modules.usbmapに記載されているのはrt2800usbだけであり、rt2800usbは下記のモジュールに依存していました。
・rt2x00usb(直接)
・rt2x00lib(直接)
・crc-ccitt(直接)
・led-class(間接)
・mac80211(間接)
・cfg80211(間接)
rt2x00usb,rt2x00libはrt2800usbがこれらに依存しているためにロードされるので、
blacklistの指定に必要なのはrt2800usbだけだと思うのですが、これは正しいでしょうか。
(直接の依存はmodinfo rt2800usbの出力,間接的なものも含める場合は/lib/modules/$(uname -r)/modules.depの内容で確認しました。)

上記の確認事項が全て正しく、かつ、rt2x00usb,rt2x00libが「rt2800usb以外のモジュール」(他の経路)からloadされない場合は真です。他の経路から関連ドライバがロードされている場合、前提となるハードウェアリソースを食われることでより新しいドライバがロード不能になる可能性があるため、blacklistへの登録が必要になります。rt2800usbの場合は実質的にハードウェア管理を行うのはrt2800usb本体だけだった気がしますが、本来ハードウェアを動作させるべきドライバが依存しているドライバはcase by caseなので推定の材料としては使えません。

オフライン

 

#3 2010-06-01 20:35:18

MidSpecLowLoad
メンバ
登録日: 2009-11-19

Re: USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について

hitoさん

ご教示ありがとうございます。

生半可な知識が危険であることを改めて認識いたしました。
Wikiへの掲載は、match_flagsを使った照合が下記の通りで正しいと確認できるまで差し控えます。
(下記のmatch_flagsの解釈は正しいでしょうか。)

http://www.mjmwired.net/kernel/Documentation/usb/hotplug.txt
はとても勉強になりました。

(比較すると英語の部分に差がなかったので
http://www.linux.or.jp/JF/JFdocs/kernel-docs-2.6/usb/hotplug.txt.html
の方を読みました。)
(誤訳と思われる箇所が一つありました。英語のほうで30行目にある"dynamically linked"が"直接リンク"となっていました。)

Lucidで確認すると/proc/sys/kernel/hotplugの内容が空で、
/sbin/hotplugが存在しないなど、幾つか使用環境とわない部分がありましたが、
時間のあるときにWebやカーネルのソースを検索して調べてみたいと思います。
(これのソースからmatch_flagsの使用方法を調べようと思ったのですが)

-------------
match_flagsの解釈

modules.usbmapの "idVendor" が linux/mod_devicetable.hに定義されている
"USB_DEVICE_ID_MATCH_VENDOR" に対応し、以下順次
"idProduct"が"USB_DEVICE_ID_MATCH_PRODUCT"に対応という具合に続きます。
照合に使用する属性に対応する値のビットORが "match_flags" の値になっています。
(modules.mapの最後の項目、driver_infoは対応する数値がない)

例えば 0x0013 の場合は idVendor,idProduct, bDeviceClassを照合に使用します。

linux/mod_devicetable.h

コード:

/* Some useful macros to use to create struct usb_device_id */
#define USB_DEVICE_ID_MATCH_VENDOR        0x0001
#define USB_DEVICE_ID_MATCH_PRODUCT        0x0002
#define USB_DEVICE_ID_MATCH_DEV_LO        0x0004
#define USB_DEVICE_ID_MATCH_DEV_HI        0x0008
#define USB_DEVICE_ID_MATCH_DEV_CLASS        0x0010
#define USB_DEVICE_ID_MATCH_DEV_SUBCLASS    0x0020
#define USB_DEVICE_ID_MATCH_DEV_PROTOCOL    0x0040
#define USB_DEVICE_ID_MATCH_INT_CLASS        0x0080
#define USB_DEVICE_ID_MATCH_INT_SUBCLASS    0x0100
#define USB_DEVICE_ID_MATCH_INT_PROTOCOL    0x0200

ソースコードで"USB_DEVICE"というマクロが使われている場合、
match_flagsの値は0x0003になります。これは linux/usb.h の記述を確認するとわかります。

linux/usb.h

コード:

#define USB_DEVICE_ID_MATCH_DEVICE \
        (USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT)

- 中略 -

#define USB_DEVICE(vend,prod) \
    .match_flags = USB_DEVICE_ID_MATCH_DEVICE, \
    .idVendor = (vend), \
    .idProduct = (prod)

-------------

参考のために調べてみるとlinux-image-2.6.32-22-generic(2.6.32-22.33)の環境では
match_flagsのパターンは下記の18通り存在しました。

コード:

$ awk '!/^#/{print $2}' /lib/modules/$(uname -r)/modules.usbmap | sort -u
0x0001
0x0003
0x000f
0x0013
0x0023
0x0070
0x0080
0x0083
0x0180
0x0181
0x0183
0x0193
0x0283
0x0380
0x0381
0x0383
0x038b
0x03f3

オフライン

 

#4 2010-06-01 22:07:26

hito
管理者
登録日: 2007-03-18

Re: USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について

MidSpecLowLoad による投稿:

生半可な知識が危険であることを改めて認識いたしました。
Wikiへの掲載は、match_flagsを使った照合が下記の通りで正しいと確認できるまで差し控えます。
(下記のmatch_flagsの解釈は正しいでしょうか。)

少なくとも大きな間違いはなさそうに見えます。
あとは必要条件と十分条件を誤認していないかを識別すれば載せても良いように思うのですが、
 ・rt2x00系チップしか見てない旨を明記する
 ・もう少し調べて、「blacklistに載せる必要がある = hotplugのIDがかぶっている」というケースを収集する
というあたりかなぁと思いますが、過度に一般化してしまうよりは、チップごとに個別にページ作る方が良くないかなぁと個人的には思います。

オフライン

 

#5 2010-06-01 23:52:52

MidSpecLowLoad
メンバ
登録日: 2009-11-19

Re: USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について

ご確認ありがとうございます。

とりあえず、個別のデバイスに関して具体的に何をblaklistに指定するかは
記載しないつもりでいます。(rt2800usbの例はTipsとして載せない)

間違っていると非常によろしくない性質の情報だと思いますので、
いったん自分のwikiホームページの下に下書きして、またこちらに書込みをします。
作業予定は週末です。

必要条件と十分条件についての私の認識ですが、下記の通りです。

-----------------------------------------------------------------------
A .対象とするデバイスの属性に対してmatch_flagsを考慮したうえで
   modules.usbmapに一致する行が存在することがデフォルト
   でカーネルモジュールがロードされる必要十分条件である。
-----------------------------------------------------------------------
*** A.の注意点 ***
1.「デフォルトで」とは/etc/modulesなどに追加の設定を行わないということ。
  当然modprobeやinsmodによる手動ロードは「デフォルトで」はない。

2.Aはロードされることの必要十分条件。
  デフォルトでデバイスが期待する動作を行うかに関してAは必要条件。
  (A.は複数行がマッチしても真、この場合は動作しない。一行のみが一致する場合でも動作するとは限らない)

-----------------------------------------------------------------------
B.対象とするデバイスの属性に対してmatch_flagsを考慮したうえで
  modules.usbmapに一致する行が N 行( N > 1 )存在する場合、
  ロードされるモジュールが1つになるようにblacklistにN-1個のモジュールを
  記述することはデバイスが正常に動作することの必要条件である。
-----------------------------------------------------------------------
*** B.の注意点 ***
1.対象とするデバイスに対してマッチするモジュール(M)、モジュール(X)が存在し、
  モジュール(M)がデバイスを正常に駆動できるとする。(X)は正常に駆動できない。
  (X)がモジュール(Y)に依存していて、(Y)の使用リソースが(M)と衝突しているとする。

  上記に加えてモジュール(Z)が別のデバイスのためにロードされていて、
  (Z)は(Y)に依存している

  この場合、(X)をblacklistに指定するだけでは不十分で(ゆえにBは必要条件)、
  (Y)もblacklistに指定する必要がある。(しかしこれでもまだ必要条件)


あれ...(Y)がロードされないと(Z)も動作しなくなるような気がしますが....
rt2800usbの例でいくと、rt2870staとバッティングするのがrt2800usbだけであっても、
rt2x00usb,rt2x00libをblacklist指定するとそれに依存しているモジュールは結局動作できなくなるような。

コード:

/lib/modules/2.6.32-22-generic$ grep -e ':.*rt2x00usb' -e ':.*rt2x00lib' modules.dep | sed -e 's#:.*##;'
kernel/drivers/net/wireless/rt2x00/rt2x00pci.ko
kernel/drivers/net/wireless/rt2x00/rt2x00usb.ko
kernel/drivers/net/wireless/rt2x00/rt2400pci.ko
kernel/drivers/net/wireless/rt2x00/rt2500pci.ko
kernel/drivers/net/wireless/rt2x00/rt61pci.ko
kernel/drivers/net/wireless/rt2x00/rt2500usb.ko
kernel/drivers/net/wireless/rt2x00/rt73usb.ko
kernel/drivers/net/wireless/rt2x00/rt2800usb.ko

オフライン

 

#6 2010-06-02 08:32:12

hito
管理者
登録日: 2007-03-18

Re: USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について

A .対象とするデバイスの属性に対してmatch_flagsを考慮したうえで
   modules.usbmapに一致する行が存在することがデフォルト
   でカーネルモジュールがロードされる必要十分条件である。

偽。必要条件です。十分条件ではありません。厳密に言えば必要条件ですらない(/etc/modprobe.conf, /etc/modprobe.d/に直値指定でも可)です。

-----------------------------------------------------------------------
B.対象とするデバイスの属性に対してmatch_flagsを考慮したうえで
  modules.usbmapに一致する行が N 行( N > 1 )存在する場合、
  ロードされるモジュールが1つになるようにblacklistにN-1個のモジュールを
  記述することはデバイスが正常に動作することの必要条件である。

偽。過度な一般化です。必要条件でも十分条件でもありません。トリガは「複数行あること」ではなく、「望ましくないドライバがマッチし、ロードされること」です。

また、「ドライバが動作するように調整する目的でblacklistにモジュールを記載すべき状況」もカバーしていませんので、
もう少し多くのケースを収集する必要があるでしょう。

あれ...(Y)がロードされないと(Z)も動作しなくなるような気がしますが....
rt2800usbの例でいくと、 rt2870staとバッティングするのがrt2800usbだけであっても、
rt2x00usb,rt2x00libをblacklist指定するとそれに依存しているモジュールは結局動作できなくなるような。

上記の理解は正しいですが、そこに疑問を感じるのはなにか前提知識が抜けている予感がします。

オフライン

 

#7 2010-06-02 12:59:29

MidSpecLowLoad
メンバ
登録日: 2009-11-19

Re: USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について

重ね重ね、ご教示ありがとうございます。

最後の部分のご指摘の通り、私には根本的に知識が不足しております。
この件についてWikiへTipsを書くのは控えたほうがよさそうです。
いくら誰にでも修正ができると言ってもベースがまずすぎては。

一点異議がございます。

偽。必要条件です。十分条件ではありません。厳密に言えば必要条件ですらない(/etc/modprobe.conf, /etc/modprobe.d/に直値指定でも可)です。

/etc/modprobe.conf, /etc/modprobe.d/への指定追加は「デフォルトでは」の記述に反するという認識でおります。


偽。過度な一般化です。必要条件でも十分条件でもありません。トリガは「複数行あること」ではなく、「望ましくないドライバがマッチし、ロードされること」です。

この部分に関しましては、
c. 「複数行がマッチ」=「制御するリソースが競合する」
d.  cが真であるならばドライバは正常に動作しない
というふうに考えていたのですが、cが必ずしも真でなく、その場合は正常に動作するという理解でよろしいでしょうか。

ご教示いただければ幸いです。

オフライン

 

#8 2010-06-02 17:28:31

MidSpecLowLoad
メンバ
登録日: 2009-11-19

Re: USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について

すいません。「指定追加」でなく、もともと記述してある場合の考慮が抜けていました。
下記引用部分は取り消させてください。

一点異議がございます。

偽。必要条件です。十分条件ではありません。厳密に言えば必要条件ですらない(/etc/modprobe.conf, /etc/modprobe.d/に直値指定でも可)です。

/etc/modprobe.conf, /etc/modprobe.d/への指定追加は「デフォルトでは」の記述に反するという認識でおります。

オフライン

 

#9 2010-06-03 09:58:10

hito
管理者
登録日: 2007-03-18

Re: USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について

MidSpecLowLoad による投稿:

偽。過度な一般化です。必要条件でも十分条件でもありません。トリガは「複数行あること」ではなく、「望ましくないドライバがマッチし、ロードされること」です。

この部分に関しましては、
c. 「複数行がマッチ」=「制御するリソースが競合する」
d.  cが真であるならばドライバは正常に動作しない
というふうに考えていたのですが、cが必ずしも真でなく、その場合は正常に動作するという理解でよろしいでしょうか。

先にロードされたドライバが排他的に動作するケースがある(というか、後からロードされたドライバが自主的に落ちることがある)ため、Cは必ずしも真になるものではありません。

オフライン

 

#10 2010-06-03 20:05:44

MidSpecLowLoad
メンバ
登録日: 2009-11-19

Re: USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について

hitoさん

ご教示ありがとうございます。
後からロードされたドライバが自主的に落ちることがあるとは、まったく想定できませんでした。
私の拙い推量にお付き合いいただきありがとうございました。

興味は尽きないのですが、しばらく自分でコツコツやっていこうと思います。

一つだけ(と言いながら分量は多いのですが)、#1の補足を。

udevがどのようにモジュールをロードするか調べようと思い、
/lib/udev/rules.d/80-drivers.rulesに下記のような変更をして
/ver/log/udevを見てみました。
udevがmodprobeを呼んでいること、その際に
(私の環境でGW-USMicroNを使った場合)

/sbin/modprobe -b  usb:v2019pED14d0101dc00dsc00dp00icFFiscFFipFF

というコマンドラインを使用していることが分かりました。
/lib/modules/$(uname -r)/modules.alias(.bin)には下記の記述があります。

alias usb:v2019pED14d*dc*dsc*dp*ic*isc*ip* rt2870sta


/lib/udev/rules.d/80-drivers.rulesの変更

コード:

@@ -1,6 +1,7 @@
 # do not edit this file, it will be overwritten on update
 
 ACTION!="add", GOTO="drivers_end"
+IMPORT{program}="/bin/echo 80-drivers driver=$driver MODALIAS=$env{MODALIAS}"
 
 DRIVER!="?*", ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe -b $env{MODALIAS}"
 SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="SD", RUN+="/sbin/modprobe -b tifm_sd"

/ver/log/udevの抜粋
(書き方が不味かったのか$driverとその後ろの空白が出ていません。)

コード:

DEVPATH=/devices/platform/i8042/serio1
SUBSYSTEM=serio
SERIO_TYPE=01
SERIO_PROTO=00
SERIO_ID=00
SERIO_EXTRA=00
MODALIAS=serio:ty01pr00id00ex00
SEQNUM=1254
80-drivers driver=MODALIAS=serio:ty01pr00id00ex00

KERNEL[1275554569.784261] add      /module/rt2870sta (module)
UDEV_LOG=3
ACTION=add
DEVPATH=/module/rt2870sta
SUBSYSTEM=module
SEQNUM=1462

KERNEL[1275554569.785066] add      /devices/pci0000:00/0000:00:1d.7/usb2/2-4/net/wlan0 (net)
UDEV_LOG=3
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb2/2-4/net/wlan0
SUBSYSTEM=net
INTERFACE=wlan0
IFINDEX=2
SEQNUM=1463

KERNEL[1275554569.785758] add      /bus/usb/drivers/rt2870 (drivers)
UDEV_LOG=3
ACTION=add
DEVPATH=/bus/usb/drivers/rt2870
SUBSYSTEM=drivers
SEQNUM=1464

UDEV  [1275554569.786180] add      /devices/pci0000:00/0000:00:1d.7/usb2/2-4/2-4:1.0 (usb)
UDEV_LOG=3
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb2/2-4/2-4:1.0
SUBSYSTEM=usb
DEVTYPE=usb_interface
PRODUCT=2019/ed14/101
TYPE=0/0/0
INTERFACE=255/255/255
MODALIAS=usb:v2019pED14d0101dc00dsc00dp00icFFiscFFipFF
SEQNUM=1203
80-drivers driver=MODALIAS=usb:v2019pED14d0101dc00dsc00dp00icFFiscFFipFF

UDEV  [1275554569.791527] add      /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:04/device:08/device:09 (acpi)
UDEV_LOG=3
ACTION=add
DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:04/device:08/device:09
SUBSYSTEM=acpi
MODALIAS=acpi:device:
SEQNUM=1103
80-drivers driver=MODALIAS=acpi:device:

これだけを見るとmodprobeの前にすでに /sys/module/rt2870sta が存在するように見えるのが謎です。
RUNとIMPORT{program}の実行タイミングの問題かもしれませんが、
IMPORT{program}="/bin/echo ...."の代わりにRUN+="/bin/echo ..."とすると
/var/log/udevには何も出力されませんでした。

オフライン

 

#11 2010-06-04 01:29:06

MidSpecLowLoad
メンバ
登録日: 2009-11-19

Re: USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について

#10で記述した/lib/udev/rules.d/80-drivers.rulesの変更で追加した/bin/echoは条件が抜けていて
その下のmodprobeが実行されない状況でも/bin/echoが実行されるる場合が存在します。

訂正版
変更点
・/bin/echo が実行される条件をmodprobeの行と同一に変更。
・RUNで指定したechoが出力されるか確認するため、RUN+=によるechoの指定を追加
 => やはり/bin/echoの出力が/var/log/udevに存在しない
・出力されなかった$driverを${driver}に変更。
=> そのまま ${driver} と出力されます。

コード:

@@ -1,6 +1,8 @@
 # do not edit this file, it will be overwritten on update
 
 ACTION!="add", GOTO="drivers_end"
+DRIVER!="?*", ENV{MODALIAS}=="?*", IMPORT{program}="/bin/echo IMPORT 80-drivers driver=${driver} MODALIAS=$env{MODALIAS}"
+DRIVER!="?*", ENV{MODALIAS}=="?*", RUN+="/bin/echo RUN 80-drivers driver=${driver} MODALIAS=$env{MODALIAS}"
 
 DRIVER!="?*", ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe -b $env{MODALIAS}"
 SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="SD", RUN+="/sbin/modprobe -b tifm_sd"

/var/log/udevの一部

コード:

UDEV  [1275569226.676076] add      /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:0b/device:0f/device:11 (acpi)
UDEV_LOG=3
ACTION=add
DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:0b/device:0f/device:11
SUBSYSTEM=acpi
MODALIAS=acpi:device:
SEQNUM=1111
IMPORT 80-drivers driver=${driver} MODALIAS=acpi:device:

KERNEL[1275569226.682248] add      /module/drm_kms_helper (module)
UDEV_LOG=3
ACTION=add
DEVPATH=/module/drm_kms_helper
SUBSYSTEM=module
SEQNUM=1464

UDEV  [1275569226.682418] add      /module/drm_kms_helper (module)
UDEV_LOG=3
ACTION=add
DEVPATH=/module/drm_kms_helper
SUBSYSTEM=module
SEQNUM=1464

UDEV  [1275569226.682629] add      /devices/pci0000:00/0000:00:1d.7/usb2/2-4/2-4:1.0 (usb)
UDEV_LOG=3
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb2/2-4/2-4:1.0
SUBSYSTEM=usb
DEVTYPE=usb_interface
PRODUCT=2019/ed14/101
TYPE=0/0/0
INTERFACE=255/255/255
MODALIAS=usb:v2019pED14d0101dc00dsc00dp00icFFiscFFipFF
SEQNUM=1203
IMPORT 80-drivers driver=${driver} MODALIAS=usb:v2019pED14d0101dc00dsc00dp00icFFiscFFipFF

UDEV  [1275569226.688018] add      /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:0b/device:0c/device:0e (acpi)
UDEV_LOG=3
ACTION=add
DEVPATH=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:0b/device:0c/device:0e
SUBSYSTEM=acpi
MODALIAS=acpi:device:
SEQNUM=1108
IMPORT 80-drivers driver=${driver} MODALIAS=acpi:device:

オフライン

 
  • インデックス
  •  » ハードウェア
  •  » USB機器のカーネルモジュールがデフォルトでロードされるかどうかの判定とblacklistへ登録が必要な場合について

Board footer

Powered by FluxBB