カーネルモジュールを完全に削除するにはどうすればよいですか?私は本当に削除することを意味します。 rmmod
を使おうとしましたが、modprobe -r
と同じようにモジュールをアンロードしただけです。そこで、modprobe -n -v
を使用してすべてのモジュールのリストを取得し、手動で削除しました。
rmmod cramfs:
ERROR: Module cramfs does not exist in /proc/modules
したがって、モジュールをロードしようとすると、次のようになります。
modprobe -v -n cramfs:
FATAL: Could not open '/lib/modules/2.6.32-573.12.1.el6.x86_64/kerne/fs/cramfs/cramfs.ko': No such file or directory
しかし、それは、システムがcramfs.ko
ファイルへのパスを知っているため、削除されたモジュールに関する情報をまだ取得していることを意味します。ロードされていないがロード可能なモジュールの例:
modprobe -v -n jffs2
insmod /lib/modules/2.6.32-573.12.1.el6.x86_64/kernel/lib/zlib_deflat/zlib_deflate.ko
insmod /lib/modules/2.6.32-573.12.1.el6.x86_64/kernel/fs/jffs2/jffs2.ko
rmmod jffs2
ERROR: Module jffs2 does not exist in /proc/modules
モジュールを正しく削除する方法はありますか?
モジュールは、実行時に何らかの理由で必要に応じてRAM(および実行中のカーネルにリンク)にロードされます。それが発生するまで、モジュールは(または同等の)ディスク領域を使用します。
モジュールが構成された独自のカーネルを構築することで、diskスペースを少し節約できます。必要なものを(モジュールとしてではなく、組み込みで)含むカーネルを構築すると、関連する機能を使用してカーネルが非常に小さい少し速くなります。しかし、それは柔軟性と手間で大ヒットです。
それはあなたのディストリビューション/システムに依存します。
Linux ロード可能なモジュール は/lib/modules/$(uname -r)/
にあるkoファイルで、サブフォルダーにソートされています。このフォルダ内のいくつかのファイル、特にmodules.dep[.bin]
とmodules.order[.bin]
はそれらすべての処理に役立ちます。 modprobe
これらのファイルを読み取って、モジュールのフルパスとその依存関係を取得します。
ほとんどのLinuxディストリビューションでは、モジュールファイルはパッケージマネージャーのパッケージによってインストールされます。それらのコアセットは、たとえばkernel-modules
という名前の非常に一般的なパッケージによってインストールされ、一部のディストリビューションでは、使用頻度の低いモジュールを特定のパッケージによってインストールできます(モジュールは複数のパッケージに分割されます)。どのパッケージが不要なモジュールを提供しているかを見つけて、それらをアンインストールできます。
警告:
module.order
ファイルとmodules.dep
ファイルに引き続き表示されます。これらのファイルは脅威ではなく、modprobe
を使用するために必要です。これらは、コアモジュールパッケージをアンインストールした場合にのみ削除されます。lsmod
を実行して、削除してはならないモジュールの最小限のリストを取得することをお勧めします。テキストファイルを編集して不要なモジュールの参照を削除したくなるかもしれませんが、対応するバイナリファイルの編集は面倒であり、パッケージが更新されるたびにそれらのファイルが復元されます。
小さな組み込みシステムは、ロード可能なモジュールに依存できますが、パッケージマネージャーを提供しない場合があります。一部の組み込みシステムは読み取り専用のルートファイルシステムを使用するため、組み込みシステムを完全に再構築して変更する必要がある場合があります。
必要に応じて、カーネルを再構築して次のことを行うことができます。
ただし、これを行うにはいくつかのスキルが必要です。
他のいくつかの使いやすいメカニズムにより、動的にロードされるモジュールに対するカーネルのセキュリティを強化できます。
カーネルモジュールがロードされていない場合、それが存在しない場合と同じですカーネルに組み込まれていない限り(説明します)以下)、唯一の例外は、通常、後でinsmod
コマンドを使用してリロードできることです。
modprobe
でエラーメッセージにパスが表示される理由は、modprobe
がモジュールの標準の場所をチェックするようにハードコードされているためです( 参照 )。設定ファイルなど、modprobe
にそのように指示するものはありません。 (モジュールが標準パスになく、挿入したい場合は、いつでもinsmod
を使用できます)。
モジュールは、カーネルの起動後に、カーネルの外部にあるメカニズムによってロードされます。 systemd
はモジュールをロードできるため、udev
もロードできます。システムが使用しているメカニズムを見つけて、そこからモジュールをブラックリストに登録する必要があります。
_jffs2
_は、ルーターまたはAndroid電話などの他のデバイスでこれを行うことを強くお勧めします。ここで具体的なアドバイスを提供するには、デバイスのメーカー/モデルに関する詳細情報が必要です。
`/ proc/modulesについてエラーが発生する理由は2つあります。
_modprobe jffs2
_を使用した例では、rmmod
でエラーが発生します。これは、_insmod jffs2.ko
_が機能しなかった可能性がありますが、エラーメッセージは出力されませんでした。ログ(dmesg
など)にエラーがないか確認してください。
proc
仮想ファイルシステムがマウントされていません。 chroot
、SELinux、カーネル機能などにより、rootとしても_/proc
_にアクセスしたりマウントしたりできない場合があります。 _ls /proc
_できるかどうかを確認し、システム上の各PIDのディレクトリのリストのようなものを取得します。これをchroot
で実行している場合は、マウント_/proc
_をchroot
にバインドする必要があります。
モジュールをカーネルに構築することは可能です。これにより、カーネルの一部になります。その時点ではモジュールではなくなったため、rmmod
などは機能しません。カーネルの一部であるモジュールをinsmod
しようとするとどうなるかわかりません(すでに使用されているカーネルリソースを参照する不可解な「使用中のファイル」エラーが発生する可能性があります)。
以前はディスクコントローラなどのサポートを組み込むのが一般的でしたが、一部の組み込みプラットフォームでも、ソフトウェアにアクセスするために必要なデバイスに対して同じことを行う場合があります。