我如何知道 Linux 内核中编译了哪些解压算法?

我如何知道 Linux 内核中编译了哪些解压算法?

如果/proc/config.gz不可用,我如何知道正在运行的内核能够在压缩后使用哪些解压缩算法cpio initramfs

gzip算法是否始终可用,即使在构建内核时CONFIG_DECOMPRESS_GZIP不可用?y

答案1

压缩算法声明于lib/decompress.c。 Gzip 定义于lib/decompress_inflate.c并且没有获得任何特殊地位;仅当编译内核时CONFIG_DECOMPRESS_GZIP它才会存在。y

可用的压缩算法列表是compressed_formats结构。由于它被定义为static,因此它在其他源文件中不可用。因此,唯一使用它的函数就是decompress_method函数lib/decompress.c本身。因此,让内核使用支持的算法表的唯一方法是尝试解压缩以适当的两字节魔术序列开头的内容,并查看该函数是否返回算法名称。

您可以通过搜索内核符号列表(/proc/kallsyms)来判断支持哪些解压函数。这些函数没有这样标识,因此您需要烘焙符号名称列表。

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

答案2

awk 获胜:

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总是可用于每一个 linux基于内核的环境,无论是通过initrd还是容器(如docker),因此此方法应该适用于所有最新的内核

买者自负:

  • 正如评论中指出的那样,xz即使对于我的环境来说,这似乎也确实错过了。
  • 按照这个线程在内核邮件列表中,此测试仅适用于内核 2.6 及以上版本。
  • 最后,正如评论中指出的,如果内核构建不包含加密下的算法,您将得到其中包含的确切内容。例如,v2.6刚刚实施deflate,同时v3.18.140deflatelz4.

答案3

您可以通过进入目录 sys/power/tuxonice/compression 来了解您的压缩类型,其中您将有一个名为算法的文件进入其中,它将包含解压缩类型,对我来说,它被写为 lzo。

相关内容