Home
Packages
Forums
Wiki
GitLab
Security
AUR
Download
コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
目次
コミュニティに貢献
最近の出来事
おまかせ表示
特別ページ
交流
ヘルプ
貢献
最近の更新
最近の議論
新しいページ
統計
リクエスト
ArchWiki
検索
検索
表示
アカウント作成
ログイン
個人用ツール
アカウント作成
ログイン
Modaliasのソースを表示
ページ
議論
日本語
閲覧
ソースを閲覧
履歴を表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
ソースを閲覧
履歴を表示
全般
リンク元
関連ページの更新状況
ページ情報
表示
サイドバーに移動
非表示
←
Modalias
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
[[Category:カーネル]] [[en:Modalias]] [[es:Modalias]] この文書は、Linux カーネルとモジュールがハードウェアをどのように認識し理解し、それがどのように sysfs の 'modalias' に変換されるかの入門ガイドです。 == modalias とは何か == Modalias は、ハードウェア情報を 'modalias' という名前のファイルにエクスポートする小さな sysfs のトリックです。このファイルは、通常のハードウェアが公開する情報のフォーマットされた形式を単純に含んでいます。 {{hc|$ cat /sys/devices/pci0000:00/0000:00:1f.1/modalias| pci:v00008086d000024DBsv0000103Csd0000006Abc01sc01i8A }} == modalias ファイルとは何か? == 上述の通り、modalias ファイルは、特定のハードウェアがすでにカーネルに伝えている情報を単純に公開します。このファイルは、この情報を公開するための構造を単純に指定します。上記の例に戻りましょう: {{hc|$ cat /sys/devices/pci0000:00/0000:00:1f.1/modalias|pci:v00008086d000024DBsv0000103Csd0000006Abc01sc01i8A}} それを 1 つずつ分解してみましょう。まず、ファイル名、{{ic|/sys/devices/pci0000:00/0000:00:1f.1/modalias}}: * '''pci0000:00'''は最初の PCI バスの id です。ほとんどのマシンではこれが唯一の PCI バスになりますが、'''pci0000:01''' や '''pci0000:02''' に拡張する可能性があります - 具体的な数字は重要ではなく、おそらく PCI バスは 1 つしか持っていないと推測されます(''ヒント:''{{ic|ls /sys/devices/pci*}} で確認してみてください) * '''0000:00:1f.1''' は PCI バス上の特定のデバイスのインデックスです。具体的には、これはバス 0000:00 上にあり、インデックス '''1f.1''' を持っています。 * これらの数値がどこから来たのか知りたいのでなければ、これらはすべて重要なことではありません。 完全を期すために、{{ic|lspci}} の出力をチェックすると、同じ情報が表示されます: {{hc|$ lspci|00:1f.1 IDE interface: Intel Corp.: Unknown device 24db (rev 02)}} さて、デバイス 00:1f.1 のこの modalias ファイルの内容を覗いてみましょう: pci:v00008086d000024DBsv0000103Csd0000006Abc01sc01i8A ほれ、この通り、PCI を見ることができます!それはわかるけど、その後の全ての意味不明な部分は何でしょうか? この意味不明な部分は実際には構造化されたデータです。繰り返しの文字/数字のパターンに気付くでしょう。これを分解して読みやすくします: v 00008086 d 000024DB sv 0000103C sd 0000006A bc 01 sc 01 i 8A これらの識別子と、対応する 16 進数は、特定のデバイスが公開する情報の一部を表します。始めに、'''v''' は ''ベンダー ID'' であり、'''d''' は ''デバイス ID'' です - これらは非常に標準的な数字です。事実、[[hwdetect]] のようなツールはこれら、そして他の sysfs ファイルを使用して、デバイスに関する情報を提供します。ベンダー ID やデバイス ID を基に特定のハードウェアの識別を調べるウェブサイトさえ見つけることができます、例えば、https://devicehunt.com/ これらの数字をここでも見ることができます: {{hc|$ lspci -n|00:1f.1 Class 0101: 8086:24db (rev 02)}} 上記に列挙した ''v'' と ''d'' トークンに 8086:24db が一致しているのが分かりますか? 言及しておくべきは、'''sv''' と '''sd''' はベンダーとデバイスの "サブシステム" バージョンです。これらは大半の時間無視されます。主に、ハードウェア開発者が全体としてのデバイスを変えない内部の微妙な違いを区別するために使用されます。 '''bc'''(基本クラス)と '''sc'''(サブクラス)は、{{ic|lspci}} に表示される "クラス" を作成するために使用されます。順番に "bcsc" です。これはデバイスクラスで、かなり一般的です。この場合、"クラス" は通常の {{ic|lspci}} 出力で調べられます。"Class 0101" が "IDE Interface" にマップされているのが見て取れます ({{ic|lspci}} はベンダーとデバイスの id も調べます - 8086 は "Intel Corp." にマップされ、24DB は 'Unknown Device' にマップされます、へへ) '''i''' は "プログラミングインターフェース" で、これはいくつかのデバイスクラスに対してのみ意味を持ちます。 == この情報はどのように使われますか? == さて、これでこの情報が何であるかを皆さんは理解しました。各デバイスが公開する一群の奇妙な数字です。それは大したことではないように思えますが、モジュールについて話すとき、この情報がどういう意味を持つのでしょうか? 人々が無視しがちなのは、{{ic|depmod}} が行うすべての作業です。{{ic|depmod}} を実行すると、{{ic|/lib/modules/uname -r}} 内にいくつかの "マップ" ファイルが生成されます。これらのファイルは、[[modprobe]] が行う必要がある特定の操作をどのように処理するかを指示します。今回のケースでは、それらのほとんどを無視することができます。重要なのは {{ic|modules.alias}} です。このファイルには、モジュールのエイリアス、つまり二次的な名前が含まれています。デモンストレーションとして、例えば、snd_intel8x0m のエイリアスを見てみましょう: {{hc|$ grep snd_intel8x0m /lib/modules/$(uname -r)/modules.alias| alias pci:v00008086d00002416sv*sd*bc*sc*i* snd_intel8x0m alias pci:v00008086d00002426sv*sd*bc*sc*i* snd_intel8x0m alias pci:v00008086d00002446sv*sd*bc*sc*i* snd_intel8x0m alias pci:v00008086d00002486sv*sd*bc*sc*i* snd_intel8x0m alias pci:v00008086d000024C6sv*sd*bc*sc*i* snd_intel8x0m alias pci:v00008086d000024D6sv*sd*bc*sc*i* snd_intel8x0m alias pci:v00008086d0000266Dsv*sd*bc*sc*i* snd_intel8x0m alias pci:v00008086d000027DDsv*sd*bc*sc*i* snd_intel8x0m alias pci:v00008086d00007196sv*sd*bc*sc*i* snd_intel8x0m alias pci:v00001022d00007446sv*sd*bc*sc*i* snd_intel8x0m alias pci:v00001039d00007013sv*sd*bc*sc*i* snd_intel8x0m alias pci:v000010DEd000001C1sv*sd*bc*sc*i* snd_intel8x0m alias pci:v000010DEd00000069sv*sd*bc*sc*i* snd_intel8x0m alias pci:v000010DEd00000089sv*sd*bc*sc*i* snd_intel8x0m alias pci:v000010DEd000000D9sv*sd*bc*sc*i* snd_intel8x0m }} ちょっと待って!これは前に出てきたベンダー/デバイス ID の情報ではないですか! はい、その通りです。これは「alias <何か> <実際のモジュール>」という非常にシンプルなフォーマットです。実際、あなたが望むほとんど何でもエイリアスにすることができます。例えば、"alias boogabooga snd_intel8x0m" を追加すれば、安全に "modprobe boogabooga" を実行することができます。 "" は何でもマッチすることを示しており、これはファイルシステムの globbing({{ic|ls somedir/}})に似ています。前述のとおり、ほとんどのエイリアスは、"*" がマッチングすることにより、sv、sd、bc、sc、および i を無視します。 == この modules.alias ファイルはどこから来るのですか? == さて、今、あなたは「おや、[[hardware probe]] はデバイステーブルに基づいてものを調べるために使用されていたが、これはどう違うのだろう?」と思っているかもしれません。 違いは、このルックアップテーブルが静的ではないことです。これは手動で維持されているわけではありません。実際、{{ic|depmod}} を実行するたびに、動的に構築されます。 "この情報はどこから来るのか?" とあなたが尋ねるなら、それは[[カーネルモジュール]]それ自体からきています。考えてみると、各特定のモジュールは、そのハードウェアのために特にコード化されているので、それがサポートするハードウェアを知っているべきです。つまり、 ''nvidia'' モジュールの開発者は、そのモジュールがNvidia(ベンダー)のグラフィックスカード(クラス)でのみ動作することを知っています。実際、モジュールはこの情報をエクスポートします。それは「ねえ、私はこれをサポートできるよ」と言っています。 $ modinfo nvidia filename: /lib/modules/2.6.14-ARCH/kernel/drivers/video/nvidia.ko license: NVIDIA alias: char-major-195-* vermagic: 2.6.14-ARCH SMP preempt 686 gcc-4.1 depends: agpgart alias: pci:v000010DEd*sv*sd*bc03sc00i00* リストされているエイリアスを見ると、特にベンダー "10DE"(Nvidia)と bc/sc 0300(おそらく「グラフィックスカード」を指している)を特定して検索していることがわかります。実際、'''snd_intel8x0m''' の modinfo を見てみます: $ modinfo snd_intel8x0m filename: /lib/modules/2.6.14-ARCH/kernel/sound/pci/snd-intel8x0m.ko author: Jaroslav Kysela <perex@suse.cz> description: Intel 82801AA,82901AB,i810,i820,i830,i840,i845,MX440; SiS 7013; NVidia MCP/2/2S/3 modems license: GPL vermagic: 2.6.14-ARCH SMP preempt 686 gcc-4.1 depends: snd-ac97-codec,snd-pcm,snd-page-alloc,snd alias: pci:v00008086d00002416sv*sd*bc*sc*i* alias: pci:v00008086d00002426sv*sd*bc*sc*i* alias: pci:v00008086d00002446sv*sd*bc*sc*i* alias: pci:v00008086d00002486sv*sd*bc*sc*i* alias: pci:v00008086d000024C6sv*sd*bc*sc*i* alias: pci:v00008086d000024D6sv*sd*bc*sc*i* alias: pci:v00008086d0000266Dsv*sd*bc*sc*i* alias: pci:v00008086d000027DDsv*sd*bc*sc*i* alias: pci:v00008086d00007196sv*sd*bc*sc*i* alias: pci:v00001022d00007446sv*sd*bc*sc*i* alias: pci:v00001039d00007013sv*sd*bc*sc*i* alias: pci:v000010DEd000001C1sv*sd*bc*sc*i* alias: pci:v000010DEd00000069sv*sd*bc*sc*i* alias: pci:v000010DEd00000089sv*sd*bc*sc*i* alias: pci:v000010DEd000000D9sv*sd*bc*sc*i* それは、エイリアスファイルを 'grep' で検索して見つけたエイリアスと一致します。各モジュールによってエクスポートされるこれらのエイリアスは、{{ic|depmod}} によって収集され、動的に {{ic|modules.alias}} ファイルにマージされます。ルックアップテーブルを手動で変更することはありません、なぜならそれは即座に構築されるからです。各モジュールは、それがサポートするものを正確に知っているため、{{ic|depmod}} はその情報を使用してモジュールの読み込みを支援することができます。 == How does udev work? == [[udev]] is closely tied with sysfs (the filesystem which exposes the modalias in the firstplace). In fact, to load modules based on the modalias when a new device is added (or when udev is first started on boot), it is insanely simple: DRIVER!="?*", ENV{MODALIAS}=="?*", RUN{builtin}="kmod load $env{MODALIAS}" Yep, that's it. It is a one-liner. This simple line, which is part of the default udev rules replace hotplug. Amazing, is it not? == See also == This article shows others modalias templates, i.e. for usb, dmi and acpi subtypes *[http://people.skolelinux.org/pere/blog/Modalias_strings___a_practical_way_to_map__stuff__to_hardware.html Modalias strings - a practical way to map "stuff" to hardware] by Petter Reinholdtsen
このページで使用されているテンプレート:
テンプレート:Hc
(
ソースを閲覧
)
テンプレート:Ic
(
ソースを閲覧
)
Modalias
に戻る。
検索
検索
Modaliasのソースを表示
話題を追加