興味深いカーネルモジュールがたくさんあります。 Linuxカーネルのおかげで、「レゴ赤外線タワー」のようなものがあることがわかりました。
私は明らかに必要以上にLinuxカーネルを減らそうとしています。
これには、現在システムで使用されていないカーネルモジュールを見つけるためのプログラムが必要です。
わかりましたlsmod
。しかし、私が探しているものとはまだ遠いです。
***反対の方法 - 削除方法***
この結果を得るには、現在静的にコンパイルされロードされたモジュールが何であるかを確認する方法が必要です。はい使用しています。これは、「M」だけでなくメニュー構成の「*」によっても選択されます。
次のようにgrepコマンドを使用してモジュール名を構成名にマップできるので、現在カーネルの.configファイル内のすべてのモジュールを「削除」する方法があると思います。
lsmodモジュール名をカーネル構成メニュー項目にバインドする
…これがどれくらい持続するかはわかりませんが。
したがって、上記のリンクにはすでに.configファイルとカーネルソースコード、grepコマンドがあります。ボトルネックは、静的に使用され動的にロードされるカーネルモジュールの最初のリストです。
「ベストを尽くすこと」の問題かもしれません。コアを徹底的に清掃することは、寝室を徹底的に清掃するのと同じくらい困難です。寝室を掃除したのに、あちこちにほこりが残っていました。これは、この質問に対する回答に対する私の期待と同じです。
すべての結果リストと同様に、DNS名解決などの機能を頻繁に使用するわけではありませんが、断続的に必要なため、より多くの手動フィルタリングが必要になります(具体的には、カーネルDNS解決は実際にはネットワークブートにのみ使用できます。わかりません)
毎回、より少ない数のモジュールを使用して数時間ごとに再コンパイルするよりも、カーネルをクリーンアップするより高速な方法が必要です。もっと一般的な戦略がありますか?
答え1
私は信じる -ロード可能なすべてのカーネルモジュールを一覧表示するには?あなたの質問に対する答えの一部です。
私はすべてのモジュールを取得し、モジュールがロードされたことを確認するために連想配列(高速なので)を使用する単純なbashスクリプトを作成しました。コードは「小さな」ごみ。
declare -A all_modules # 0 module is used 1 module is not used
#
# Note when ls shows module some modules have names separated by `_`
# In the very same time files that contains this modules might have `-`
# Example:
# /usr/lib/modules/5.11.9-200.fc33.x86_64/kernel/arch/x86/crypto/ghash-clmulni-intel.ko.xz - file
# [Alex@NormandySR2 i686]$ lsmod | grep 'ghash'
# ghash_clmulni_intel 16384 0
# At the very same time, I didn't find any module that has `-` reported by lsmod
# [Alex@NormandySR2 i686]$ lsmod |grep '-'
# I know that for and find is fragile, but it's the simplest way
for i in $(find /lib/modules/$(uname -r) -type f -name '*.ko*'); do
module_name=$(basename $i);
# used {module_name%.*}, but cut with is simpler, and works with multiple extensions like .ko.xz
module_without_extension=$(echo $module_name | cut -f 1 -d '.')
# replace - with _
module_name_normalized=$(echo $module_without_extension | sed 's/-/_/g')
all_modules[$module_name_normalized]=1
done
# Note that `lsmod` output starts with "Module Size Used By " that's why sed is used
IFS=$'\n'
for i in $(lsmod | sed '1d;$d'); do
module_name=$(echo $i | awk '{print $1}')
echo "$module_name"
# check module from lsmod is in all modules
if [[ -v all_modules[$module_name] ]]; then
all_modules[$module_name]=0
else
echo "Warning! There is no $module_name module in all_modules array - adding it to all modules but you should check"
all_modules[$module_name]=0
fi
done
# print output
for i in "${!all_modules[@]}"
do
if [ ${all_modules[$i]} -eq 0 ]; then
echo "$i is loaded"
else
echo "$i is not used"
fi
done
ロードされたすべてのモジュールを取得するには、次のものを使用できます。
bash x.sh | grep loaded
利用可能ですがロードされていないモジュールを取得します。つまり、おそらくあなたの質問に答えてください:
bash x.sh | grep 'not used'
(...)
**注:このスクリプトはモジュールエイリアスをサポートしていないため、ファイルにモジュールが見つからないたびに「警告!...」というメッセージが表示されます。 **
編集する
静的にコンパイルされたモジュールを取得するには、次のようにします。
cat /lib/modules/$(uname -r)/modules.builtin
答え2
モジュールだけを要求した場合、答えはより簡単になります。ただし、静的にコンパイルされた機能も要求するため、回答を提供するのははるかに困難です。
動的にロードされたモジュールの場合は、アンロードしようとした後に出力を確認するのに役立ちますが、現在使用していないプラグアンドプレイデバイス(USBデバイスなど)にはいくつかのモジュールが必要であることに注意してください。モジュールをコンパイルしないと、長期的に問題が発生する可能性があります。また、この種のテスト(モジュールの取り外し)はシステムにクラッシュする可能性があるため、インストールをテストする権限がある場合にのみこれを実行してください。
静的にロードされたモジュール/機能を使用すると、何かが必要なのか、プロセスがハードウェアに非常に固有であるのか、それとも特定の機能をサポートするカーネルが必要かを話すのは困難です。この質問のオプションはスクリプトで処理できません。
しかし、良い出発点は、ブートプロセスログ(一部のディストリビューションでは/var/log/boot.log)の出力を取得し、カーネルメッセージを確認することです。必要なほとんどのモジュールはログに内容を出力します。追加の実験を行う前に、リストを「連絡先なし」リストとして使用できます。