カーネルをコンパイルするときにinitrdのサイズを減らす方法は?


13

独自のカーネルをコンパイルするとき、基本的に次のことを行います。

  1. www.kernel.orgからソースをダウンロードして解凍します。

  2. 以前.configのバージョンをソースにコピーしてmake menuconfig、新しいオプションを監視し、カーネルの新しいポリシーに従って構成を変更します。

  3. 次に、コンパイルします。 make -j 4

  4. 最後に、インストールしますsu -c 'make modules_install && make install'

  5. いくつかのテストの後、私は(から古いカーネルを削除/bootして/lib/modules)、新しいものと完全に実行します(この最後のステップは、私の人生に数回保存した!それはだプロヒント!)。

問題は、/boot/initrd.img-4.x.x自分のディストリビューションのものと比べて常に大きなAを取得することです。ここに、現在の/boot/ディレクトリの内容を例として示します:

# ls -alFh
total 243M
drwxr-xr-x  5 root root 4.0K Mar 16 21:26 ./
drwxr-xr-x 25 root root 4.0K Feb 25 09:28 ../
-rw-r--r--  1 root root 2.9M Mar  9 07:39 System.map-4.4.0-1-amd64
-rw-r--r--  1 root root 3.1M Mar 11 22:30 System.map-4.4.5
-rw-r--r--  1 root root 3.2M Mar 16 21:26 System.map-4.5.0
-rw-r--r--  1 root root 170K Mar  9 07:39 config-4.4.0-1-amd64
-rw-r--r--  1 root root 124K Mar 11 22:30 config-4.4.5
-rw-r--r--  1 root root 126K Mar 16 21:26 config-4.5.0
drwxr-xr-x  5 root root  512 Jan  1  1970 efi/
drwxr-xr-x  5 root root 4.0K Mar 16 21:27 grub/
-rw-r--r--  1 root root  19M Mar 10 22:01 initrd.img-4.4.0-1-amd64
-rw-r--r--  1 root root 101M Mar 12 13:59 initrd.img-4.4.5
-rw-r--r--  1 root root 103M Mar 16 21:26 initrd.img-4.5.0
drwx------  2 root root  16K Apr  8  2014 lost+found/
-rw-r--r--  1 root root 3.5M Mar  9 07:30 vmlinuz-4.4.0-1-amd64
-rw-r--r--  1 root root 4.1M Mar 11 22:30 vmlinuz-4.4.5
-rw-r--r--  1 root root 4.1M Mar 16 21:26 vmlinuz-4.5.0

お気づきかもしれませんが、私のinitrd.imgファイルのサイズは、私のディストリビューションのファイルの約10倍です。

だから、カーネルをコンパイルするときに何か間違ったことをしますか?そして、どうすれば私のサイズを小さくできinitrd.imgますか?


wiki.gentoo.org/wiki/…そして、何がそんなに巨大なのかを見てください。それは、大量のカーネルモジュールまたはライブラリのいずれか、またはまったく別の何かである可能性があります。アーカイブの内容を見ない場合、それは単なる当て推量です。
frostschutz

回答:


19

これは、すべてのカーネルモジュールが削除されていないためです。サイズを小さくする必要があります。

次のコマンドを使用します。

SHW@SHW:/tmp# cd /lib/modules/<new_kernel>
SHW@SHW:/tmp# find . -name *.ko -exec strip --strip-unneeded {} +

これにより、サイズが大幅に縮小されます。上記のコマンドを実行した後、initramfs / initrdの作成に進むことができます


わあ、モジュールを取り除くとinitrd画像のサイズが10 で割られることはありませんが...どうもありがとう、うまくいきました!
恐怖

はとの間のスペースである必要が{}あり+ます。
phk

15

私は問題についていくつかの追加調査を行い、モジュールを削除するための最良の方法を知り、ここに私が見つけた完全なプロセスがあります(SHWは答えをもたらしましたが、私が見つけたプロセスは何らかの形で標準化されています):

  1. ソースをダウンロードしてwww.kernel.org解凍します。

  2. .configソースをソースにコピーし、a make menuconfigを実行して新しいオプションを監視し、カーネルの新しいポリシーに従って構成を変更します。

  3. 次に、コンパイルします。

    $> make -j 4
    
  4. 最後に、インストールします:

    $> su -c 'make INSTALL_MOD_STRIP=1 modules_install && make install'
    
  5. いくつかのテストの後、より古いカーネル削除/boot/lib/modulesディレクトリを。

INSTALL_MOD_STRIP設定すると1追加strip --strip-debug大幅サイズを低減するのに十分であるモジュールをインストールする場合。

参照:INSTALL_MOD_STRIPではDocumentation/kbuild/kbuild.txt


7

また、設定を変更することもできます initramfs.conf

ファイルを見つける /etc/initramfs-tools/initramfs.conf

これには、MODULES=mostinitrdイメージのほとんどのモジュールが含まれるという設定があります。

これに変更するとMODULES=dep、initramfsジェネレーターはどのモジュールを含めるかを推測します。

ここでinitramfs.confのマンページを確認してください。

注1:上記の手順を実行した後、initramfsイメージのサイズは282 MBから99 MBに縮小しました(これでも十分な大きさですが、大幅に改善されています)

注2:でカーネルモジュールの削除も試みました/lib/modules/<kernel version>。OSアップデートによって提供されるモジュールは削除され(サイズ= 211 MB)、したがって、対応するintiramfsイメージは約15 MBです。自分でコンパイルしたバニラカーネルのモジュールを削除した後、フォルダーのサイズは185 MBで、intramfsイメージは16 MBでした。したがって、すべての最適化の後、サイズは282 MBから16 MBに減少しました!! ストリッピングにはこのコードを使用します

find /lib/modules/<kernel_release>/ -iname "*.ko" -exec strip --strip-unneeded {} \;

上記のコードで<kernel_release>、モジュールを削除するカーネルバージョンに置き換えます。

詳細については、このリンクをご覧ください

上記のコードはsudoまたはとして実行する必要がありますsu

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.