この記事は、Manningが発行したLinuxinActionの第15章から抜粋したものです。
Linuxは、カーネルモジュールを使用してハードウェア周辺機器を管理します。仕組みは次のとおりです。
実行中のLinuxカーネルは、混乱させたくないものの1つです。結局のところ、カーネルは、コンピューターが行うすべてのことを駆動するソフトウェアです。ライブシステムで同時に管理する必要のある詳細の数を考慮すると、カーネルを離れて、できるだけ気を散らすことなく作業を行うことをお勧めします。ただし、システム全体を再起動せずにコンピューティング環境に小さな変更を加えることが不可能な場合は、新しいWebカメラまたはプリンターを接続すると、ワークフローに大きな混乱が生じる可能性があります。システムにデバイスを認識させるためにデバイスを追加するたびに再起動する必要があるのは、ほとんど効率的ではありません。
Linuxは、安定性と使いやすさという相反する長所の間に効果的なバランスをとるために、カーネルを分離しますが、ローダブルカーネルモジュール(LKM)を介して特定の機能をオンザフライで追加できます。次の図に示すように、モジュールは、カーネルにデバイスの場所とその処理方法を指示するソフトウェアの一部と考えることができます。次に、カーネルはデバイスをユーザーとプロセスが利用できるようにし、その操作を監視します。
デバイスを希望どおりにサポートするために独自のモジュールを作成することを妨げるものは何もありませんが、なぜわざわざするのでしょうか。 Linuxモジュールライブラリはすでに非常に堅牢であるため、通常は独自のライブラリを作成する必要はありません。そして、ほとんどの場合、Linuxはあなたが知らないうちに新しいデバイスのモジュールを自動的にロードします。
それでも、何らかの理由でそれ自体が起こらない場合があります。 (あなたは、あなたの笑顔がビデオ会議の就職の面接に参加するのを待ちきれずに待っているその雇用マネージャーを離れたくありません。)物事を助けるために、カーネルモジュール、特にカーネルモジュールについてもう少し理解したいと思うでしょう。 、周辺機器を実行する実際のモジュールを見つける方法と、手動でアクティブ化する方法。
慣例により、モジュールは、/lib/modules/
の下にある.ko(カーネルオブジェクト)拡張子のファイルです。 ディレクトリ。ただし、これらのファイルに移動する前に、おそらく選択を行う必要があります。起動時にリリースのリストから1つをロードするオプションが与えられるため、選択をサポートするために必要な特定のソフトウェア(カーネルモジュールを含む)がどこかに存在する必要があります。ええと、/lib/modules
/はどこかにあるものの1つです。ここに、利用可能な各Linuxカーネルリリースのモジュールで満たされたディレクトリがあります。例:
$ ls /lib/modules
4.4.0-101-generic
4.4.0-103-generic
4.4.0-104-generic
私の場合、アクティブなカーネルはリリース番号が最も高いバージョン(4.4.0-104-generic)ですが、それが同じであるという保証はありません(カーネルは頻繁に更新されます)。稼働中のシステムで使用したいモジュールを使用して作業を行う場合は、適切なディレクトリツリーがあることを確認する必要があります。
その他のLinuxリソース
- Linuxコマンドのチートシート
- 高度なLinuxコマンドのチートシート
- 無料のオンラインコース:RHELの技術概要
- Linuxネットワーキングのチートシート
- SELinuxチートシート
- Linuxの一般的なコマンドのチートシート
- Linuxコンテナとは何ですか?
- 最新のLinux記事
良いニュース:信頼できるトリックがあります。ディレクトリを名前で識別して正しいディレクトリを取得することを期待するのではなく、常にアクティブなカーネルの名前を指すシステム変数を使用します。 uname -r
を使用してその変数を呼び出すことができます (-r
通常表示されるシステム情報内からカーネルリリース番号を指定します):
$ uname -r
4.4.0-104-generic
その情報を使用して、uname
を組み込むことができます コマンド置換と呼ばれるプロセスを使用してファイルシステム参照に挿入します 。たとえば、適切なディレクトリに移動するには、そのディレクトリを/lib/modules
に追加します。 。 Linuxに「uname」がファイルシステムの場所ではないことを伝えるには、uname
を囲みます 次のように、バックティックに参加します:
$ ls /lib/modules/`uname -r`
build modules.alias modules.dep modules.softdep
initrd modules.alias.bin modules.dep.bin modules.symbols
kernel modules.builtin modules.devname modules.symbols.bin
misc modules.builtin.bin modules.order vdso
ほとんどのモジュールは、kernel/
の下のサブディレクトリ内に整理されています。 ディレクトリ。数分かけてこれらのディレクトリを参照し、物事がどのように配置され、何が利用できるかを理解してください。ファイル名は通常、あなたが見ているものの良いアイデアを与えてくれます。
$ ls /lib/modules/`uname -r`/kernel
arch crypto drivers fs kernel lib mm
net sound ubuntu virt zfs
これは、カーネルモジュールを見つける1つの方法です。実際、それはそれを回避するための迅速で汚い方法です。しかし、それが唯一の方法ではありません。完全なセットを取得する場合は、lsmod
を使用して、現在ロードされているすべてのモジュールといくつかの基本情報を一覧表示できます。 。この切り捨てられた出力の最初の列(ここにリストするには多すぎます)は、モジュール名、ファイルサイズと番号、そしてそれぞれが依存している他のモジュールの名前です。
$ lsmod
[...]
vboxdrv 454656 3 vboxnetadp,vboxnetflt,vboxpci
rt2x00usb 24576 1 rt2800usb
rt2800lib 94208 1 rt2800usb
[...]
いくつ多すぎますか?さて、lsmod
を実行しましょう もう一度ですが、今回は出力をwc -l
にパイプします 行数を取得するには:
$ lsmod | wc -l
113
これらはロードされたモジュールです。全部でいくつありますか? modprobe -c
を実行しています 行を数えると、その数がわかります:
$ modprobe -c | wc -l
33350
33,350の利用可能なモジュールがあります!?!誰かが私たちの物理的なデバイスを実行するためのソフトウェアを私たちに提供するために何年にもわたって一生懸命働いているようです。
その他のLinuxリソース
- Linuxコマンドのチートシート
- 高度なLinuxコマンドのチートシート
- 無料のオンラインコース:RHELの技術概要
- Linuxネットワーキングのチートシート
- SELinuxチートシート
- Linuxの一般的なコマンドのチートシート
- Linuxコンテナとは何ですか?
- 最新のLinux記事
注:一部のシステムでは、/etc/modules
内の一意のエントリのいずれかで参照されるカスタマイズされたモジュールが発生する場合があります。 ファイルまたは/etc/modules-load.d/
に保存された構成ファイルとして 。そのようなモジュールは、おそらく最先端の実験を含む、地元の開発プロジェクトの産物である可能性があります。いずれにせよ、あなたが何を見ているのかをある程度理解しておくのは良いことです。
それがモジュールを見つける方法です。次の仕事は、何らかの理由でそれ自体が発生しなかった場合に、非アクティブなモジュールを手動でロードする方法を理解することです。
カーネルモジュールをロードする前に、ロジックはそれが存在することを確認する必要があることを指示します。そして、それを行う前に、それが何と呼ばれているのかを知る必要があります。その部分を取得するには、同等の部分の魔法と運、そしてオンラインドキュメント作成者の努力の助けが必要な場合があります。
しばらく前に遭遇した問題を説明することで、プロセスを説明します。ある晴れた日、それでも私を逃れる理由で、ラップトップのWiFiインターフェースが機能しなくなりました。ちょうどそのように。おそらく、ソフトウェアアップデートがそれをノックアウトしました。知るか? lshw -c network
を実行しました そして、この非常に奇妙な情報に扱われました:
network UNCLAIMED
AR9485 Wireless Network Adapter
Linuxはインターフェース(Atheros AR9485)を認識しましたが、要求されていないものとしてリストしました。ええと、彼らが言うように、「状況が厳しくなると、インターネットを検索するのは大変です」。 atherosar9linuxモジュールを検索しました そして、5年前、さらには10年前の結果のページをふるいにかけて、自分でモジュールを作成するか、あきらめるようにアドバイスした後、(少なくともUbuntu 16.04では)動作するモジュールが存在することをようやく発見しました。その名前はath9kです。
はい!戦いは勝ったのと同じくらい良いです!カーネルへのモジュールの追加は、思ったよりもはるかに簡単です。利用可能であることを再確認するには、find
を実行します モジュールのディレクトリツリーに対して、-type f
を指定します Linuxにファイルを探していることを伝えてから、文字列ath9k
を追加します。 文字列で始まるすべてのファイル名を含めるためのグロブアスタリスク:
$ find /lib/modules/$(uname -r) -type f -name ath9k*
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_common.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_hw.ko
もう1つのステップで、モジュールをロードします:
# modprobe ath9k
それでおしまい。再起動はありません。大騒ぎしないでください。
破損したアクティブなモジュールを操作する方法を示すもう1つの例を次に示します。 Logitech Webカメラを特定のソフトウェアで使用すると、次のシステム起動まで他のプログラムからカメラにアクセスできなくなることがありました。別のアプリケーションでカメラを開く必要がある場合もありましたが、シャットダウンして再起動する時間がありませんでした。 (私は多くのアプリケーションを実行しており、起動後にそれらをすべて配置するには時間がかかります。)
このモジュールはおそらくアクティブであるため、lsmod
を使用します videoという単語を検索するには 関連するモジュールの名前についてのヒントを教えてください。実際、ヒントよりも優れています。 videoという単語で説明されている唯一のモジュールです。 uvcvideoです (以下でわかるように):
$ lsmod | grep video
uvcvideo 90112 0
videobuf2_vmalloc 16384 1 uvcvideo
videobuf2_v4l2 28672 1 uvcvideo
videobuf2_core 36864 2 uvcvideo,videobuf2_v4l2
videodev 176128 4 uvcvideo,v4l2_common,videobuf2_core,videobuf2_v4l2
media 24576 2 uvcvideo,videodev
おそらく私が制御できた何かがクラッシュを引き起こしていたので、私は物事を正しい方法で修正できるかどうかを確認するためにもう少し深く掘り下げることができたと思います。しかし、あなたはそれがどのようであるかを知っています。理論を気にせず、デバイスを機能させたい場合もあります。そこで、rmmod
を使用しました uvcvideoモジュールとmodprobe
を強制終了します もう一度起動するには、すべてが素晴らしく新鮮です:
# rmmod uvcvideo
# modprobe uvcvideo
繰り返しますが、再起動はありません。頑固な血痕はありません。