Gentooの創設者によるLinuxの基本。 パート2(5/5):カーネルモジュール

第2部の最後の抜粋では、Linuxカーネルモジュールの管理の基本について説明します。 すべてのユーザーはこの最小値を知っている必要がありますが、初心者向けのこのガイドでカーネルモジュールの組み立てと構成に関する情報を見つけることを期待しないでください。



Gentooの創設者によるLinuxの基本ナビゲーション:

パートI
  1. BASH:ナビゲーションの基本 (はじめに)
  2. ファイルとディレクトリを管理する
  3. リンクおよびファイルとディレクトリの削除
  4. グローブルックアップ (合計とリンク)
パートII
  1. 正規表現 (イントロ)
  2. フォルダーの割り当て、ファイル検索
  3. プロセス管理
  4. テキスト処理とリダイレクト
  5. カーネルモジュール (合計とリンク)
パートIII: 1、2、3、4



カーネルモジュール


「uname」に会う


unameコマンドは、システムに関する多くの興味深い情報を提供します。 以下は、una​​me -aを入力した後の、稼働中のマシンでの出力例です。これは、una​​meコマンドに使用可能なすべての情報を出力するよう指示します。



$ uname -a
Linux inventor 2.4.20-gaming-r1 #1 Fri Apr 11 18:33:35 MDT 2003 i686 AMD Athlon(tm) XP 2100+ AuthenticAMD GNU/Linux


unameの詳細


さて、どんな種類のシステム情報をunameが与えることができるか見てみましょう



       -s "Linux"   -n "inventor"   -r "2.4.20-gaming-r1"   -v "#1 Fri Apr 11 18:33:35 MDT 2003"  -m "i686"  -p "AMD Athlon(tm) XP 2100+"  -i "AuthenticAMD"   -o "GNU/Linux" 

おもしろい! uname-あなたからのプリントは何ですか?



カーネルリリース


そして今、ちょっとしたトリック。 開始するには、プログラムが現在実行中のカーネルリリースを出力するようにuname -rを実行します。



ディレクトリ/ lib / modulesを見てください-おっと! 「同じ名前のディレクトリを見つけたはずです!」 さて、魔法ではない、今は/ lib / modulesのディレクトリの意味について話し、またカーネルモジュールとは何かを説明する時です。



コア


Linuxカーネルは、一般に「Linux」と呼ばれるものの中心です。これは、ハードウェアと直接やり取りし、そこから通常のプログラムを抽象化するコードです。 カーネルのおかげで、テキストエディターは、どのドライブ、SCSIまたはIDE、または多分RAMにあるかを心配する必要はありません。 エディターはファイルシステムに書き込むだけで、カーネルは他のすべてを処理します。



カーネルモジュールの概要


それでは、カーネルモジュールとは何ですか? これらはカーネルの一部であり、特別な形式でディスクに保存されます。 コマンドで、それらは動作中のカーネルにロードされ、新しい機能を追加します。



カーネルモジュールはオンデマンドでロードされるため、追加の機能をサポートするカーネルを使用できますが、通常の状態ではオフにしてアクセスできなくなります。
しかし、100年に一度、これらのモジュールは非常に有用であることが判明し、ほとんど自動的にダウンロードして、めったに使用しない珍しいファイルシステムまたはデバイスをサポートできます。



カーネルモジュールの概要


一般に、カーネルモジュールを使用すると、機能しているカーネルにオンデマンドで機能を追加できます。 モジュールがなければ、新しいもののサポートを追加するには、新しいカーネルをコンパイルして再起動する必要があります。



lsmod


システムにロードされたモジュールを表示するには、lsmodコマンドを使用します。



 # lsmod Module Size Used by Tainted: PF vmnet 20520 5 vmmon 22484 11 nvidia 1547648 10 mousedev 3860 2 hid 16772 0 (unused) usbmouse 1848 0 (unused) input 3136 0 [mousedev hid usbmouse] usb-ohci 15976 0 (unused) ehci-hcd 13288 0 (unused) emu10k1 64264 2 ac97_codec 9000 0 [emu10k1] sound 51508 0 [emu10k1] usbcore 55168 1 [hid usbmouse usb-ohci ehci-hcd] 

モジュールのリスト


ご覧のとおり、かなりの数のモジュールがシステムにロードされています。 vmnetおよびvmmonモジュール、 VMWare Workstationに必要な機能を提供します。これにより、デスクトップウィンドウで仮想マシンを実行できます。 nvidiaモジュールはNVIDIA Corporationによってリリースされており、Linuxで3Dアクセラレーションを使用できます。



さらに、USB入力デバイス(mousedev、hid、usbmouse、input、usb-ohci、ehci-hcd、およびusbcore)をサポートするために使用される一連のモジュールがあります。 USBモジュールをサポートするようにカーネルを構成することは理にかなっています。 なんで? USBデバイスは「プラグアンドプレイ」デバイスであり、モジュールでUSBをサポートしている場合、新しいUSBデバイスを安全に購入して差し込むことができ、システムはこのデバイスに適切なモジュールを自動的にダウンロードします。 これは何かをする便利な方法です。



サードパーティのモジュール


モジュールはこのリストを完成します:emu10k1、ac97_codecおよびsound、これらは一緒に私のAudigyサウンドカードのサポートを提供します。



一部のモジュールはカーネルソースで直接利用できることに注意してください。 たとえば、すべてのUSBモジュールは標準のLinuxカーネルソースからコンパイルされました。 ただし、nvidia、emu10k1、およびVMWareモジュールは他のソースから取得されました。 これは、カーネルモジュールのもう1つの重要な機能、つまり必要な機能をカーネルに追加し、実行中のカーネルに直接組み込むサードパーティメーカーの能力を強調しています。 再起動なし。



depmodと会社


/lib/modules/2.4.20-gaming-r1/フォルダーには、いくつかの
「モジュール」で始まるファイル:



$ ls /lib/modules/2.4.20-gaming-r1/modules.*
/lib/modules/2.4.20-gaming-r1/modules.dep
/lib/modules/2.4.20-gaming-r1/modules.generic_string
/lib/modules/2.4.20-gaming-r1/modules.ieee1394map
/lib/modules/2.4.20-gaming-r1/modules.isapnpmap
/lib/modules/2.4.20-gaming-r1/modules.parportmap
/lib/modules/2.4.20-gaming-r1/modules.pcimap
/lib/modules/2.4.20-gaming-r1/modules.pnpbiosmap
/lib/modules/2.4.20-gaming-r1/modules.usbmap


これらのファイルには、さまざまな依存関係に関する多くの情報が含まれています。 特に、モジュールの依存関係に関する情報が含まれています。一部のモジュールは、起動する前に他のモジュールをロードする必要があります。



モジュールの入手方法


一部のカーネルモジュールは、サウンドカードをサポートするモジュールであるemu10k1などの特別なデバイスで動作するように設計されています。 このタイプのモジュールの場合、上記のファイルには、サポートする機器のPCI IDおよびその他の識別子に関する情報も含まれています。 この情報は、さまざまなスクリプト、たとえば「hotplug」(以下のマニュアルで説明します)で使用して、機器を自動的に検出し、対応するモジュールをロードできます。



depmodを使用する


依存関係に関する情報は、特に新しいモジュールをインストールする場合は、無関係になる可能性があります。 更新するには、単にdepmod -aと入力します。 depmodプログラムは、 / lib / modulesフォルダーからモジュールをスキャンし、依存関係情報を更新します。 これは、 / lib / modules内のモジュールをスキャンし、モジュール内のいわゆる「シンボル」をチェックすることによりこれを行います。



カーネルモジュールの場所


それでは、カーネルモジュールはどのようなものでしょうか? カーネル2.4の場合、すべてのモジュールファイルは通常/ lib / modulesにあり、「。o」で終わる名前を持っています (2.6「.ko」の場合-約Ed。)。 / lib / modulesからすべてのモジュールを表示するには、次を入力します。



# find /lib/modules -name '*.o'
/lib/modules/2.4.20-gaming-r1/misc/vmmon.o
/lib/modules/2.4.20-gaming-r1/misc/vmnet.o
/lib/modules/2.4.20-gaming-r1/video/nvidia.o
/lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o
/lib/modules/2.4.20-gaming-r1/kernel/fs/vfat/vfat.o
/lib/modules/2.4.20-gaming-r1/kernel/fs/minix/minix.o
[ ]


insmod vs. modprobe


それでは、どのようにしてモジュールを動作中のカーネルにロードしますか? 1つのオプションは、コマンドを使用することです
insmodを実行して、ロードするモジュールへのフルパスを指定します。



 # insmod /lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o 
# lsmod | grep fat fat 29272 0 (unused)

ただし、通常、モジュールはmodprobeコマンドを使用してロードされます。 modprobeの優れた機能の1つは、特定のモジュールに必要なすべての依存関係を自動的に読み込むことです。 さらに、ロード可能なモジュールのフルパスと拡張子を指定する必要はありません。



rmmodとmodprobeの動作


fat.oモジュールをアンロードし、modprobeを使用してロードし直します。



 # rmmod fat 
# lsmod | grep fat
# modprobe fat
# lsmod | grep fat
fat 29272 0 (unused)

ご覧のとおり、rmmodコマンドの操作はmodprobeの操作に非常に似ていますが、逆の効果があります-指定されたモジュールをアンロードします。



ヘルパーmodinfoとmodules.conf


modinfoチームを使用して、お気に入りのモジュールに関するいくつかの興味深いことを見つけることができます。



 # modinfo fat 
filename: /lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o description: <none> author: <none> license: "GPL"

/etc/modules.confファイルにも注意してください。 modprobeの設定が含まれており、modprobeの動作を変更できます。 たとえば、残りのモジュールをロードする前後にロードするモジュールを指定したり、モジュールをロードする前後にスクリプトを実行したりできます。



Modules.conf構造


modules.confの構文と機能非常に複雑であるため、ここでは詳しく説明しません(詳細についてはman modules.confと入力してください)が、このファイルについて知っておくべきことがいくつかあります。



まず、多くのディストリビューションは、/ etc/modules.d /などの他のディレクトリ内の一連のファイルからこのファイルを自動的に生成します。 たとえば、Gentoo Linuxにはそのようなフォルダーがあり、update-modulesコマンドを実行すると/etc/modules.d/からすべてのファイルが読み取られ、それらが新しい/etc/modules.confにマージされます 。 したがって、/ etc / modules.d /からファイルに変更を加えた後、Gentooを使用している場合はupdate-modulesを実行してください。 Debianでの手順は非常によく似ていますが、フォルダの名前は/ etc / modutils /です。



バージョン2.6のカーネルの場合、etcディレクトリにある同様のファイルとフォルダーは、それぞれmodprobe.confとmodprobe.dと呼ばれます。 構文はそこで簡略化されています。manmodprobe.confを参照してください
-エディターによる注意。


結果とリソース


まとめ


おめでとうございます。 このLinux管理の基礎チュートリアルの最後に到達しました! 彼がLinuxの知識を少し整理するのを手伝ってくれたことを願っています。 アクセス権、ユーザー管理、ファイルシステム、マウントなど、管理のより高度な側面を明らかにする次のガイドにご参加ください。 次のガイドでは、ここに置かれた基盤の上に構築します。 そして、この一連のチュートリアルを学習し続けると、Linux Professional InstituteのLPICレベル1認定試験にすぐに合格する準備ができたことを忘れないでください。



資源


LPIC認定について言えば、LPICに本当に興味がある場合は、このガイドで得られた知識を拡張するために慎重に選択された以下のソースを検討することを強くお勧めします。



ネットには正規表現に関する多くの優れたガイドがあります。 ここにカップルがあります:


http://www.pathname.com/fhs/で Filesystem Hierarchy Standardを読むことができます



例のBashシリーズ(翻訳があります)では、bash命令を使用して独自のスクリプトを作成する方法を示します。 このシリーズ(特に第1部と第2部)は、LPICレベル1試験のよい準備となります。



sedの詳細については、例 (翻訳予定)のSedチュートリアルシリーズご覧ください。 LPI試験を受ける予定がある場合は、このシリーズの最初の2つのパートを必ずお読みください。



awkの詳細については、例のAwkシリーズを参照してください(翻訳は予定されています)。



viエディターを初めて使用する場合は、チートシートメソッドガイドであるViを確認することを強くお勧めします。 このチュートリアルは、この強力なテキストエディタの簡単かつ迅速な紹介です。 viの使用方法がわからない場合は、この資料を読むことを検討してください。



翻訳をしてくれたDmitry Minsky (Dmitry.Minsky@gmail.com)に感謝します。



継続するには...


著者について


ダニエル・ロビンス


Daniel Robbinsは、Gentooコミュニティの創設者であり、Gentoo Linuxオペレーティングシステムの作成者です。 ダニエルは妻のメアリーと元気な娘2人とニューメキシコに住んでいます。 彼はFuntooの創設者兼代表でもあり、 IBM developerWorks 、Intel Developer Services、およびC / C ++ Users Journalの技術記事を数多く執筆しています。



クリス・ハウザー


クリス・ハウザーは、1994年にテイラー大学(米国インディアナ州)の管理者チームに参加し、コンピューターサイエンスと数学の学士号を取得して以来、UNIXの支持者でした。 その後、Webアプリケーション、ビデオ編集、UNIXドライバー、暗号化保護など、さまざまな分野で働きました。 現在、Sentry Data Systemsで働いています。 Chrisは、Gentoo LinuxやClojureなどの多くの無料プロジェクトにも貢献し、 The Joy of Clojureの共同執筆者でもあります。



アロン・グリフィス


Iron Griffisはボストンに住んでおり、過去10年間、Hewlett-PackardでTru64、Linux、Xen、KVMの仮想化セキュリティ認証用のUNIXネットワークドライバー、最近ではHP ePrintプラットフォームなどのプロジェクトに従事しました。 プログラミングの暇な時間に、Ayronは、自転車に乗ったり、ビットをジャグリングしたり、ボストンのプロ野球チームRed Socksを応援したりする際に、プログラミングの問題を消し去ることを好みます。

Source: https://habr.com/ru/post/J107981/


All Articles