วิธีลดขนาดของ 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 ... ขอบคุณมากมันใช้งานได้ดี!
perror

ควรจะเป็นช่องว่างระหว่างและ{} +
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_STRIPDocumentation/kbuild/kbuild.txtใน


7

คุณสามารถเปลี่ยนการกำหนดค่าของคุณ initramfs.conf

ค้นหาไฟล์ที่ /etc/initramfs-tools/initramfs.conf

มีการตั้งค่าที่ระบุว่าMODULES=mostสิ่งนี้รวมถึงโมดูลส่วนใหญ่ที่เกี่ยวกับภาพเริ่มต้นของคุณ

เปลี่ยนเป็นMODULES=depสิ่งนี้ทำให้ตัวสร้าง initramfs คาดเดาโมดูลที่จะรวม

ตรวจสอบ manpage สำหรับ initramfs.conf ที่นี่

หมายเหตุ 1: หลังจากทำตามขั้นตอนข้างต้นขนาดของภาพ initramfs ของฉันลดลงจาก 282 MB เป็น 99 MB (นี่ยังคงมีขนาดใหญ่พอ แต่ก็เป็นการปรับปรุงที่สำคัญ)

หมายเหตุ 2: /lib/modules/<kernel version>ฉันยังพยายามลอกโมดูลเคอร์เนลที่ โมดูลที่จัดทำโดยการอัปเดตระบบปฏิบัติการจะถูกตัด (ขนาด = 211 MB) และทำให้ภาพที่มี intiramfs สอดคล้องกันคือประมาณ 15 MB หลังจากถอดโมดูลของเคอร์เนลวานิลลาที่ฉันรวบรวมตัวเองขนาดของโฟลเดอร์คือ 185 MB และภาพ intramfs คือ 16 MB ดังนั้นหลังจากการปรับแต่งทั้งหมดขนาดก็ลดลงจาก 282 MB เป็น 16 MB !! สำหรับการลอกให้ใช้รหัสนี้

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

ในรหัสข้างต้นแทนที่<kernel_release>ด้วยรุ่นเคอร์เนลที่คุณต้องการดึงโมดูลจาก

สำหรับการสนทนาเพิ่มเติมดูลิงค์นี้

รหัสข้างต้นจะต้องเรียกใช้เป็นsudoหรือsu

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.