Bagaimana cara mengurangi ukuran initrd saat mengkompilasi kernel Anda?

13

Ketika saya mengkompilasi kernel saya sendiri, pada dasarnya yang saya lakukan adalah sebagai berikut:

  1. Saya mengunduh sumber-sumber dari www.kernel.org dan membuka kompresnya.

  2. Saya menyalin yang sebelumnya .configke sumber dan melakukan make menuconfiguntuk melihat opsi-opsi baru dan memodifikasi konfigurasi sesuai dengan kebijakan baru kernel.

  3. Lalu, saya kompilasi: make -j 4

  4. Akhirnya, saya menginstalnya: su -c 'make modules_install && make install'.

  5. Setelah beberapa tes, saya menghapus kernel lama (dari /bootdan /lib/modules) dan menjalankan sepenuhnya dengan yang baru (langkah terakhir ini menyelamatkan hidup saya beberapa kali! Ini pro-tip !).

Masalahnya adalah saya selalu mendapatkan /boot/initrd.img-4.x.xyang sangat besar dibandingkan dengan yang dari distribusi saya. Di sini isi /boot/direktori saya saat ini sebagai contoh:

# 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

Seperti yang mungkin Anda perhatikan, ukuran initrd.imgfile saya sekitar 10 kali lebih besar daripada yang dari distribusi saya.

Jadi, apakah saya melakukan sesuatu yang salah ketika mengkompilasi kernel saya? Dan, bagaimana saya bisa mengurangi ukuran saya initrd.img?

perror
sumber
wiki.gentoo.org/wiki/… dan lihat apa yang membuatnya begitu besar. Ini bisa berupa banyak modul kernel atau pustaka ... atau sesuatu yang lain sama sekali. Jika Anda tidak melihat isi arsip itu hanya dugaan saja.
frostschutz

Jawaban:

19

Ini karena semua modul kernel tidak dilucuti. Anda perlu melepasnya ke ukurannya.

Gunakan perintah ini:

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

Ini akan mengurangi ukuran secara drastis. Setelah menjalankan perintah di atas, Anda dapat melanjutkan untuk membuat initramfs / initrd

SHW
sumber
Wow, saya tidak akan pernah berpikir bahwa pengupasan modul akan membagi ukuran initrdgambar dengan 10 ... Terima kasih banyak, itu bekerja dengan baik!
perror
Seharusnya ruang antara {}dan +.
phk
15

Saya melakukan beberapa penelitian tambahan pada masalah untuk mengetahui apa cara terbaik untuk mendapatkan modul dilucuti dan di sini adalah proses lengkap yang saya temukan (masih SHW memang membawa jawabannya tetapi proses yang saya temukan entah bagaimana lebih standar):

  1. Unduh sumber dari www.kernel.orgdan hapus kompresnya.

  2. Salin sebelumnya .configke sumber dan lakukan make menuconfiguntuk melihat opsi baru dan memodifikasi konfigurasi sesuai dengan kebijakan baru kernel.

  3. Kemudian, kompilasi:

    $> make -j 4
    
  4. Akhirnya, instal:

    $> su -c 'make INSTALL_MOD_STRIP=1 modules_install && make install'
    
  5. Setelah beberapa tes, hapus kernel lama dari /bootdan /lib/modulesdirektori.

The INSTALL_MOD_STRIPketika diatur untuk 1menambahkan strip --strip-debugketika menginstal modul, yang cukup untuk mengurangi ukuran drastis.

Lihat: INSTALL_MOD_STRIP di Documentation/kbuild/kbuild.txt.

perror
sumber
7

Anda juga dapat mengubah konfigurasi initramfs.conf

Temukan file di /etc/initramfs-tools/initramfs.conf

Ada pengaturan yang mengatakan MODULES=mostini termasuk sebagian besar modul untuk gambar initrd Anda.

Mengubahnya menjadi MODULES=depini membuat generator initramfs menebak modul mana yang akan disertakan.

Lihat halaman manual untuk initramfs.conf di sini .

CATATAN 1: Setelah melakukan langkah-langkah di atas ukuran gambar initramfs saya berkurang dari 282 MB menjadi 99 MB. (Ini masih cukup besar tetapi merupakan peningkatan yang signifikan)

CATATAN 2: Saya juga mencoba membuka modul kernel di /lib/modules/<kernel version>. Modul yang disediakan oleh pembaruan OS dilucuti (ukuran = 211 MB) dan dengan demikian gambar intiramf yang sesuai adalah sekitar 15 MB. Setelah melepas modul dari kernel vanilla yang saya kompilasi sendiri ukuran folder adalah 185 MB dan gambar intramfs adalah 16 MB. Jadi setelah semua optimasi ukuran turun dari 282 MB menjadi 16 MB !! Untuk pengupasan gunakan kode ini

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

Dalam kode di atas, ganti <kernel_release>dengan versi kernel yang Anda inginkan untuk menghapus modul.

Untuk diskusi lebih lanjut, lihat tautan ini .

Kode di atas harus dijalankan sebagai sudoatausu

sohom154
sumber