Як зменшити розмір 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 ... Дякую, це спрацювало чудово!
переслідування

Повинно бути пробілом між {}і +.
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це включає більшість модулів, вкладених у ваше зображення.

Змінивши це, MODULES=depзмушує генератор initramfs вгадувати, які модулі включати.

Ознайомтеся зі сторінкою для 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.