Как уменьшить размер 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огромную по сравнению с моими дистрибутивами. Вот содержание моего текущего /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 ... Спасибо большое, все работает отлично!
perror

Должен быть пробел между {}и +.
phk

15

Я провел дополнительное исследование этой проблемы, чтобы узнать, каков наилучший способ удаления модулей, и вот полный процесс, который я нашел (все же 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_STRIPКогда установлено 1добавить strip --strip-debugпри установке модуля, который достаточно , чтобы уменьшить размер резко.

Смотрите: INSTALL_MOD_STRIP в Documentation/kbuild/kbuild.txt.


7

Вы также можете изменить конфигурацию вашего initramfs.conf

Найти файл на /etc/initramfs-tools/initramfs.conf

Есть настройка, которая говорит, что MODULES=mostона включает в себя большинство модулей kn вашего образа initrd.

Измените его так, чтобы MODULES=depгенератор initramfs угадывал, какие модули включить.

Проверьте man-страницу для initramfs.conf здесь .

ПРИМЕЧАНИЕ 1. После выполнения вышеуказанных шагов размер моего образа initramfs уменьшился с 282 МБ до 99 МБ (это все еще достаточно большой, но его существенное улучшение)

ПРИМЕЧАНИЕ 2: Я также попытался удалить модули ядра в /lib/modules/<kernel version>. Модули, предоставляемые обновлениями ОС, удаляются (размер = 211 МБ), и, следовательно, соответствующий образ intiramfs составляет около 15 МБ. После удаления модулей ванильного ядра, которое я сам скомпилировал, размер папки составлял 185 МБ, а образа intramfs - 16 МБ. Таким образом, после всех оптимизаций размер уменьшился с 282 МБ до 16 МБ !! Для зачистки используйте этот код

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

В приведенном выше коде замените <kernel_release>версию ядра, из которой вы хотите удалить модули.

Для дальнейшего обсуждения просмотрите эту ссылку .

Приведенный выше код должен быть запущен как sudoилиsu

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.