web-dev-qa-db-ja.com

実際にカーネル圧縮のタイプを示すにはどうすればよいですか?

Arch LinuxシステムのLinuxカーネルの圧縮の種類を確認する必要がありますが、理論以上の方法を見つける方法が見つかりません。今はbzip2(bz)、以前はgzipです。 (z)。

私のコンピューターでは、次のコマンドを実行します。

_$ file /boot/vmlinuz-linux
/boot/vmlinuz-linux: Linux kernel x86 boot executable bzImage, version 5.3.11-Arch1-1 (linux@archlinux) #1 SMP PREEMPT Tue, 12 Nov 2019 22:19:48 +0000, RO-rootFS, swap_dev 0x5, Normal VGA
_

理論を見ると、bzImagegzip (z)で圧縮する必要があることがわかりますが、それを証明することはできません。

BzImageは、より多くのアルゴリズムを導入したLinux 2.6.30まで、gzipを使用して圧縮されていました。 bzプレフィックスはbzip2圧縮が使用されることを意味するという一般的な誤解があります(bzip2パッケージは、bzless、bzcatなどのように、bzがプレフィックスされたツールとともに配布されることがよくあります)。

私のマシンでそれを証明する方法はありますか?それとも理論自体、この場合は「経験的」ですか?

7
balon

あなたの ウィキペディアの引用

bzプレフィックスはbzip2圧縮が使用されることを意味するという一般的な誤解がありますが[...]、これはそうではありません。

はあなたの理論の反対です:bzbzImagebzip2とは関係がなく、bzImagebzip2で圧縮する必要はありません。実際、 カーネルのデフォルトの圧縮モードgzipであり、bzip2を使用する理由はほとんどありません。LZMAやxzよりも低速ですが、同様に圧縮します。

特定のカーネルイメージに使用された圧縮を、それを実行したり、その構成を見つけたりすることなく決定的に決定するには、カーネル独自の extract-vmlinux スクリプトで使用されているアプローチに従います。

  • 画像でコンプレッサーの署名を探します。

    • gunzip\037\213\010
    • xz\3757zXZ\000
    • bzip2BZh
    • lzma\135\0\0\0
    • lzo\211\114\132
    • lz4\002!L\030
    • zstd(\265/\375
  • 見つけた署名のオフセットから始めて、画像からデータを抽出します。

  • 結果(存在する場合)がELFイメージであることを確認します。

スクリプト here を変更して、圧縮タイプのみを報告するようにしました。 GPL 2でのみライセンスされているため、ここには含めません。

5
Stephen Kitt

カーネルがサポートする圧縮方法を確認できます。選択できるのは1つだけなので、どちらであるかを証明します。

ここでは、gzipを使用しています。

$ zgrep CONFIG_KERNEL_ /proc/config.gz
CONFIG_KERNEL_GZIP=y
# CONFIG_KERNEL_BZIP2 is not set
# CONFIG_KERNEL_LZMA is not set
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
# CONFIG_KERNEL_LZ4 is not set
5
Andy Dalton

VMlinuzは、次のリンクからわかるように、gzipで圧縮されています。

http://www.linfo.org/vmlinuz.html

https://www.ibm.com/developerworks/community/blogs/mhhaque/entry/anatomy_of_the_initrd_and_vmlinuz?lang=en

https://en.wikipedia.org/wiki/Vmlinux

皮肉なことに、このウェブページでは、以下のように、多くの人が拡張機能をbzip2と混同していると述べています。

ZImageファイルという名前のコンパイルされたカーネルは、一部の古いシステムで作成され、下位互換性のために新しいシステムで保持されます。 zImageとbzImageはどちらもgzipで圧縮されています。違いは、zImageが低メモリ(つまり、最初の640kB)に解凍され、bzImageが高メモリ(1MB以上)に解凍されることです。 bzImageがbzip2ユーティリティで圧縮されているという一般的な誤解があります。実際には、bは単に大きいという意味です。

この情報がお役に立てば幸いです。

0
Dasel