Linuxカーネルにどの解凍アルゴリズムがコンパイルされているかどうかはどうすればわかりますか?

Linuxカーネルにどの解凍アルゴリズムがコンパイルされているかどうかはどうすればわかりますか?

利用できない場合、/proc/config.gz実行中のカーネルが圧縮後に使用できる解凍アルゴリズムをどのように知ることができますかcpio initramfs

gzipカーネルを構築するときにアルゴリズムを使用できない場合でも、アルゴリズムは常に使用できますかCONFIG_DECOMPRESS_GZIPy

答え1

圧縮アルゴリズムは以下で宣言されます。lib/decompress.c。 Gzip は以下に定義されています。lib/decompress_inflate.cカーネルがコンパイルされたときにのみCONFIG_DECOMPRESS_GZIP存在し、特別な状態を取得できません。y

利用可能な圧縮アルゴリズムのリストは次のとおりです。compressed_formats構造。定義されているため、static他のソースファイルでは使用できません。したがって、これを使用する唯一の関数はdecompress_method関数lib/decompress.c自体です。したがって、カーネルにサポートされているアルゴリズムテーブルを使用させる唯一の方法は、適切な2バイトマジックシーケンスで始まる項目を解凍し、関数がアルゴリズム名を返すことを確認することです。

/proc/kallsymsカーネルシンボルリスト()を検索すると、どの解凍機能がサポートされているかを確認できます。機能はそれ自体では識別されないため、シンボル名のリストを作成する必要があります。

</proc/kallsyms cut -d " " -f 3 |
grep -xF -e gunzip -e bzip2 -e unlzma -e unxz -e unlzo -e unlz4

答え2

奇妙な勝利:

samveen@x230:~ $ awk '/^name/{n=$3}/^type/{if($3=="compression"){print n}}' </proc/crypto 
lz4
lzo-rle
lzo
deflate
compress_null

説明する:

/proc/cryptoラベル付きカーネルアルゴリズムを印刷しますtype compression

注:/procはいいつも次のように使用できます。すべて linuxinitrdあるいは、コンテナを介したカーネルベースの環境dockerなので、この方法はすべての最新のカーネルで動作する必要があります。

警告:

  • コメントで指摘したように、xzこれは私の環境でも欠けているようです。
  • ~によるとこのスレッドカーネルメーリングリストによると、このテストはカーネル2.6以降にのみ適用されます。
  • 最後に、コメントで指摘したように、カーネルビルドに暗号化されたアルゴリズムが含まれていない場合は、そこに含まれるアルゴリズムを正確に取得できます。例えば、v2.6ただ実装しdeflateましたが、v3.18.140deflateとがありますlz4

答え3

sys/power/tuxonice/compression ディレクトリに移動すると、どのタイプの圧縮があるかを確認できます。そこにはアルゴリズムと呼ばれるファイルが含まれており、これには解凍タイプが含まれています。私にとってはlzoで書かれています。

関連情報