Wie kann man die Größe der initrd beim Kompilieren des Kernels reduzieren?

13

Wenn ich meinen eigenen Kernel kompiliere, mache ich im Grunde Folgendes:

  1. Ich lade die Quellen von www.kernel.org herunter und dekomprimiere sie.

  2. Ich kopiere meine vorherigen .configin die Quellen und make menuconfigachte auf die neuen Optionen und ändere die Konfiguration entsprechend der neuen Richtlinie des Kernels.

  3. Dann kompiliere ich es: make -j 4

  4. Schließlich installiere ich es: su -c 'make modules_install && make install'.

  5. Nach ein paar Tests entferne ich den alten Kernel (von /bootund /lib/modules) und starte ihn vollständig (dieser letzte Schritt hat mir mehrmals das Leben gerettet! Es ist ein Pro-Tipp !).

Das Problem ist, dass ich immer einen bekomme, /boot/initrd.img-4.x.xder im Vergleich zu denen aus meiner Distribution riesig ist. Hier der Inhalt meines aktuellen /boot/Verzeichnisses als Beispiel:

# 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

Wie Sie vielleicht bemerkt haben, ist die Größe meiner initrd.imgDateien etwa zehnmal größer als die meiner Distribution.

Mache ich also etwas falsch, wenn ich meinen Kernel kompiliere? Und wie kann ich meine Größe reduzieren initrd.img?

perror
quelle
wiki.gentoo.org/wiki/… und sehen, was es so groß macht. Es könnten entweder Tonnen von Kernelmodulen oder Bibliotheken sein ... oder etwas ganz anderes. Wenn Sie sich den Inhalt des Archivs nicht ansehen, ist es nur eine Vermutung.
Frostschutz

Antworten:

19

Dies liegt daran, dass nicht alle Kernelmodule entfernt werden. Sie müssen es auf seine Größe verkleinern.

Verwenden Sie diesen Befehl:

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

Dadurch wird die Größe drastisch reduziert. Nachdem Sie den obigen Befehl ausgeführt haben, können Sie mit dem Erstellen von initramfs / initrd fortfahren

SHW
quelle
Wow, ich hätte nie gedacht, dass das Entfernen der Module die Größe des initrdBildes durch 10 teilen würde ... Vielen Dank, es hat gut funktioniert!
perror
Das sollte ein Leerzeichen zwischen {}und sein +.
Phk
15

Ich habe mich eingehend mit dem Problem befasst, um herauszufinden, wie die Module am besten entfernt werden können. Hier ist der vollständige Prozess, den ich gefunden habe (immer noch hat SHW die Antwort geliefert, aber der Prozess, den ich gefunden habe, ist irgendwie standardisierter):

  1. Laden Sie die Quellen herunter www.kernel.orgund dekomprimieren Sie sie.

  2. Kopieren Sie Ihre vorherige Version .configin die Quellen und make menuconfigachten Sie auf die neuen Optionen und ändern Sie die Konfiguration entsprechend der neuen Kernelrichtlinie.

  3. Dann kompiliere es:

    $> make -j 4
    
  4. Zum Schluss installieren Sie es:

    $> su -c 'make INSTALL_MOD_STRIP=1 modules_install && make install'
    
  5. Entfernen Sie nach einigen Tests den alten Kernel aus den Verzeichnissen /bootund /lib/modules.

Die INSTALL_MOD_STRIPbei der Einstellung auf 1eine hinzuzufügen , strip --strip-debugwenn der Installation des Moduls, was genug ist , um die Größe drastisch zu reduzieren.

Siehe: INSTALL_MOD_STRIP in Documentation/kbuild/kbuild.txt.

perror
quelle
7

Sie können auch die Konfiguration von ändern initramfs.conf

Finden Sie die Datei unter /etc/initramfs-tools/initramfs.conf

Es gibt eine Einstellung, die sagt MODULES=most dies die meisten Module Ihres initrd-Images umfasst.

Ändern Sie es zu MODULES=dep dies, damit der initramfs-Generator errät, welche Module einbezogen werden sollen.

Schauen Sie sich hier die Manpage für initramfs.conf an .

HINWEIS 1: Nachdem ich die obigen Schritte ausgeführt habe, hat sich die Größe meines initramfs-Image von 282 MB auf 99 MB verringert (dies ist immer noch groß genug, aber eine erhebliche Verbesserung).

HINWEIS 2: Ich habe auch versucht, die Kernel-Module von zu entfernen /lib/modules/<kernel version>. Die von den Betriebssystemaktualisierungen gelieferten Module werden entfernt (Größe = 211 MB), und daher beträgt das entsprechende intiramfs-Image etwa 15 MB. Nach dem Entfernen der Module des von mir kompilierten Vanilla-Kernels betrug die Größe des Ordners 185 MB und das Intramfs-Image 16 MB. Nach allen Optimierungen ist die Größe von 282 MB auf 16 MB gesunken !! Verwenden Sie zum Abisolieren diesen Code

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

Ersetzen <kernel_release>Sie im obigen Code die Kernel-Version, von der Sie die Module entfernen möchten.

Weitere Diskussionen finden Sie unter diesem Link .

Der obige Code muss als sudooder ausgeführt werdensu

sohom154
quelle