Jak zmniejszyć rozmiar initrd podczas kompilacji jądra?

13

Kiedy kompiluję własne jądro, zasadniczo robię to:

  1. Pobieram źródła ze strony www.kernel.org i rozpakowuję je.

  2. Kopiuję moje poprzednie .configdo źródeł i make menuconfigsprawdzam nowe opcje i modyfikuję konfigurację zgodnie z nową polityką jądra.

  3. Następnie kompiluję: make -j 4

  4. Wreszcie mogę zainstalować go: su -c 'make modules_install && make install'.

  5. Po kilku testach usuwam stare jądro (z /booti /lib/modules) i uruchamiam w pełni z nowym (ten ostatni krok kilkakrotnie uratował mi życie! To wskazówka !).

Problem polega na tym, że zawsze otrzymuję coś, /boot/initrd.img-4.x.xco jest ogromne w porównaniu do tych z mojej dystrybucji. Oto treść mojego bieżącego /boot/katalogu jako przykład:

# 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

Jak zapewne zauważyłeś, rozmiar moich initrd.imgplików jest około 10 razy większy niż tych z mojej dystrybucji.

Czy robię coś złego podczas kompilacji jądra? I jak mogę zmniejszyć swój rozmiar initrd.img?

perror
źródło
wiki.gentoo.org/wiki/… i zobacz, co sprawia, że ​​jest tak ogromny. Może to być ton modułów jądra lub bibliotek ... lub coś zupełnie innego. Jeśli nie spojrzysz na zawartość archiwum, to tylko zgadywanie.
frostschutz

Odpowiedzi:

19

Jest tak, ponieważ wszystkie moduły jądra nie są usuwane. Musisz go rozebrać do mniejszego rozmiaru.

Użyj tego polecenia:

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

To drastycznie zmniejszy rozmiar. Po wykonaniu powyższej komendy możesz przystąpić do tworzenia initramfs / initrd

SHW
źródło
Wow, nigdy bym nie pomyślał, że usunięcie modułów podzieli rozmiar initrdobrazu przez 10 ... Bardzo dziękuję, działało dobrze!
perror
Powinna być przestrzeń między {}i +.
phk
15

Przeprowadziłem dodatkowe badania problemu, aby dowiedzieć się, jaki jest najlepszy sposób na usunięcie modułów i oto pełny proces, który znalazłem (nadal SHW przyniósł odpowiedź, ale proces, który znalazłem, jest w jakiś sposób bardziej ustandaryzowany):

  1. Pobierz źródła www.kernel.orgi rozpakuj je.

  2. Skopiuj poprzednie .configdo źródeł i zrób make menuconfigobserwację nowych opcji i zmodyfikuj konfigurację zgodnie z nową polityką jądra.

  3. Następnie skompiluj to:

    $> make -j 4
    
  4. Na koniec zainstaluj:

    $> su -c 'make INSTALL_MOD_STRIP=1 modules_install && make install'
    
  5. Po kilku testach, usunąć stary kernel od /booti /lib/moduleskatalogów.

INSTALL_MOD_STRIPGdy ustawiono 1dodać strip --strip-debugpodczas instalowania modułu, który jest na tyle, aby zmniejszyć rozmiar drastycznie.

Zobacz: INSTALL_MOD_STRIP w Documentation/kbuild/kbuild.txt.

perror
źródło
7

Możesz także zmienić konfigurację swojego initramfs.conf

Znajdź plik na /etc/initramfs-tools/initramfs.conf

Jest ustawienie, które mówi, że MODULES=mostobejmuje to większość modułów obrazu twojego initrd.

Zmień to na MODULES=depto, że generator initramfs zgaduje, które moduły należy uwzględnić.

Sprawdź stronę podręcznika dla initramfs.conf tutaj .

UWAGA 1: Po wykonaniu powyższych kroków rozmiar mojego obrazu initramfs zmniejszony z 282 MB do 99 MB. (Jest to wciąż wystarczająco duży, ale jest to znacząca poprawa)

UWAGA 2: Próbowałem również usunąć moduły jądra z /lib/modules/<kernel version>. Moduły dostarczane przez aktualizacje systemu operacyjnego są usuwane (rozmiar = 211 MB), a zatem odpowiedni obraz intiramfs ma około 15 MB. Po usunięciu modułów jądra wanilii, które sam skompilowałem, rozmiar folderu wynosił 185 MB, a obraz intramfs 16 MB. Po wszystkich optymalizacjach rozmiar zmniejszył się z 282 MB do 16 MB !! Do usuwania użyj tego kodu

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

W powyższym kodzie zastąp <kernel_release>wersję jądra, z której chcesz usunąć moduły.

Aby uzyskać więcej dyskusji, zobacz ten link .

Powyższy kod należy uruchomić jako sudolubsu

sohom154
źródło