現在実行中のシステムで使用されていないカーネルモジュールのリストを取得するには? (静的およびロード済み)

現在実行中のシステムで使用されていないカーネルモジュールのリストを取得するには? (静的およびロード済み)

興味深いカーネルモジュールがたくさんあります。 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

おすすめ記事