カーネルをコンパイルするときにinitrdのサイズを小さくするには?

カーネルをコンパイルするときにinitrdのサイズを小さくするには?

私のカーネルをコンパイルするときにデフォルトで行うことは次のとおりです。

  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私のディストリビューションにあるものと比較すると、常に大きなものを得ることです。以下は、現在のディレクトリの内容の例です/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

答え1

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

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

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

これにより、サイズが大幅に減少します。上記のコマンドを実行した後、引き続きinitramfs / initrdを作成できます。

man strip

   --strip-unneeded
       Remove all symbols that are not needed for relocation processing.

答え2

私はモジュールを削除する最良の方法が何であるかを理解するために、この質問についていくつかの追加の調査を行いました。

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

  2. 前の内容を.configソースコードにコピーし、次の手順を実行して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設定はモジュールを取り付けるときに11つを追加します。strip --strip-debugこれはサイズを大幅に減らすのに十分です。

望むより:INSTALL_MOD_STRIP存在するDocumentation/kbuild/kbuild.txt

答え3

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

ファイルを探す/etc/initramfs-tools/initramfs.conf

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

MODULES=depinitramfsジェネレータが含めるモジュールを推測するように変更します。

initramfs.confのマンページを見るここ

注1:上記の手順を実行した後、initramfsイメージのサイズは282MBから99MBに減少しました。 (これはまだ十分ですが、かなりの改善です)

注2:また/lib/modules/<kernel version>。オペレーティングシステムのアップデートによって提供されるモジュールは削除されるため(サイズ= 211 MB)、対応するintiramfsイメージは約15 MBです。私自身がコンパイルしたバニラカーネル用のモジュールを削除した後、フォルダサイズは185MBで、inramfsイメージは16MBでした。したがって、すべての最適化の後、サイズは282MBから16MBに減少しました!削除するには、このコードを使用してください。

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

上記のコードから<kernel_release>モジュールを削除したいカーネルバージョンに置き換えてください。

詳細については、次を参照してください。協会

上記のコードは次のように実行する必要がありますsudosu

関連情報