私のカーネルをコンパイルするときにデフォルトで行うことは次のとおりです。
www.kernel.orgからソースコードをダウンロードして解凍しました。
以前の内容を
.config
ソースコードにコピーし、make menuconfig
新しいオプションを観察し、カーネルの新しいポリシーに従って設定を変更することを行いました。それからそれをコンパイルします。
make -j 4
最後にインストールしました:
su -c 'make modules_install && make install'
。/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
私はモジュールを削除する最良の方法が何であるかを理解するために、この質問についていくつかの追加の調査を行いました。
ソースコードをダウンロード
www.kernel.org
して解凍します。前の内容を
.config
ソースコードにコピーし、次の手順を実行してmake menuconfig
新しいオプションを観察し、カーネルの新しいポリシーに従って設定を変更します。その後、コンパイルします。
$> make -j 4
最後にインストールします。
$> su -c 'make INSTALL_MOD_STRIP=1 modules_install && make install'
いくつかのテストの後、
/boot
ディレクトリ/lib/modules
から古いカーネルを削除します。
INSTALL_MOD_STRIP
設定はモジュールを取り付けるときに1
1つを追加します。strip --strip-debug
これはサイズを大幅に減らすのに十分です。
望むより:INSTALL_MOD_STRIP存在するDocumentation/kbuild/kbuild.txt
。
答え3
設定を変更することもできます。initramfs.conf
ファイルを探す/etc/initramfs-tools/initramfs.conf
MODULES=most
initrdイメージにほとんどのモジュールが含まれているという設定があります。
MODULES=dep
initramfsジェネレータが含めるモジュールを推測するように変更します。
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>
モジュールを削除したいカーネルバージョンに置き換えてください。
詳細については、次を参照してください。協会。
上記のコードは次のように実行する必要がありますsudo
。su