GNU/Linux >> Linux の 問題 >  >> Linux

Linuxカーネルモジュールをロードまたはアンロードする方法

この記事は、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

繰り返しますが、再起動はありません。頑固な血痕はありません。


Linux
  1. Linuxでカーネルバージョンを確認する方法

  2. Linux –カーネルモジュールを適切にリロードする方法は?

  3. ブート時に組み込み Linux カーネルモジュールに値を渡す方法は?

  1. Linuxデスクトップでカーネルをアップグレードする方法

  2. Linux –どのモジュールがカーネルを汚染しているかを判断する方法は?

  3. Linux – Linuxの汚染されたカーネル?

  1. Linux LKM ローダブル カーネル モジュールを作成、コンパイル、ロードする方法

  2. 簡単な例で独自の Linux カーネル モジュールを作成する方法

  3. Oracleasm 用の SELinux モジュールをロードする方法