web-dev-qa-db-ja.com

カーネルをコンパイルするときに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から)削除し、新しいカーネルで完全に実行します(この最後の手順で数回私の命が救われました!pro-tip!)。

問題は、私が常に/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のサイズを縮小するにはどうすればよいですか?

13
perror

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

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

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

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

20
SHW

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

  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_STRIP1に設定した場合は、モジュールのインストール時にstrip --strip-debugを追加します。これは、サイズを大幅に削減するのに十分です。

参照:Documentation/kbuild/kbuild.txtの-​​ INSTALL_MOD_STRIP

15
perror

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

/etc/initramfs-tools/initramfs.confでファイルを検索します

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

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

Initramfs.conf here のマンページを確認してください。

注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>を、モジュールを削除するカーネルバージョンに置き換えます。

詳細については、この link を参照してください。

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

7
sohom154