Как уменьшить размер 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.xx который огромен по сравнению с тем из моего дистрибутива. Вот содержимое моего текущего /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 ?

3 Solutions collect form web for “Как уменьшить размер initrd при компиляции вашего ядра?”

Это связано с тем, что все модули ядра не разделяются. Вам нужно разделить его на размер.

Используйте эту команду:

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

Это резко уменьшит размер. После выполнения команды выше вы можете приступить к созданию initramfs / initrd

Я сделал несколько дополнительных исследований по этой проблеме, чтобы узнать, как лучше всего удалить модули, и вот полный процесс, который я нашел (все-таки SHW действительно принес ответ, но процесс, который я нашел, как-то более стандартизован):

  1. Загрузите источники с www.kernel.org и 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 .

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

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

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

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

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

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

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

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

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

Для более подробной информации просмотрите эту ссылку .

Вышеупомянутый код должен быть запущен как sudo или su

  • В каком дистрибутиве используется ядро ​​3.19 или выше
  • Компиляция ядра: невозможно найти ncurses
  • Поскольку последние обновления для Windows не будут монтироваться
  • Неправильно ли вызывать ioctl изнутри ioctl?
  • Разработка ядра на платформе Windows
  • Удалите все пакеты ядра, кроме используемого в данный момент
  • Что мешает дистрибутивам использовать последнее ядро ​​Linux?
  • Отладка проблемы с приостановкой печати с PM_TRACE
  • Как я могу скомпилировать ядро ​​Linux с помощью GRSecurity и SELinux с помощью репозиториев git?
  • Как ядро ​​Linux может обращаться к назначенному initramfs / initrd?
  • Linux Восстановление операционной системы после аномального завершения
  • Linux и Unix - лучшая ОС в мире.