Как уменьшить размер 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

  • Знайте, какой каталог «mount -o bind», задав ядро ​​(Linux)
  • Linux не отвечает на сообщения ARP-запроса, если запрашиваемый IP-адрес связан с другим (отключенным) интерфейсом
  • что такое глобальная политика планирования Linux?
  • Загрузка ноутбука очень медленная
  • Как udev получает номера устройств для создаваемых им устройств?
  • Ошибка Dracut при загрузке Fedora с ядром Qubes
  • Конфигурация ядра: какое семейство процессоров выбрать для «Celeron M CPU 420» (Core Solo)?
  • CDC ACM не работает в пользовательском ядре Linux
  • Fedora 20 ACPI выходит на черный экран перед входом в систему
  • Как получить фактическое имя программы с помощью PID этой запущенной программы?
  • Являются ли устройства с ядрами ниже 3.6 уязвимыми для CVE-2016-5696?
  • Interesting Posts

    Как загрузить Debian в текстовый режим без использования GUI?

    создание архива с использованием tar, включая все «dotfiles», но исключая все подкаталоги и структуру каталога wo

    Ограничение ширины линии выходной линии Netstat

    Заказ выполнения для cloud-init-local на AWS Linux

    Слияние дублированных строк, которые имеют одинаковые первые три поля

    Что такое символ или символ, и каково его значение вне форматирования кода SE?

    Как удалить нежелательные учетные записи домена Windows и локальную учетную запись с экрана входа в Linux Mint 17?

    Какова цель ssh-agent?

    Резервное копирование на уровне байта и файлового уровня

    Я бы хотел использовать одну из трех команд sed (диапазоны чисел)

    разархивируйте два разных типа расширений файлов

    Есть ли способ включить сжатие заголовков UDP / IP для ссылок / интерфейсов PPP в Linux

    Как скрипт может запускать много процессов одновременно?

    Подключить / отключить неизвестный журнал postfix

    процесс ожидания семафора

    Linux и Unix - лучшая ОС в мире.