编译内核时如何减小 initrd 的大小?

编译内核时如何减小 initrd 的大小?

当我编译自己的内核时,基本上我所做的如下:

  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

答案1

这是因为所有内核模块都没有被剥离。您需要将其剥离以缩小其尺寸。

使用这个命令:

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

这将大大减小尺寸。执行上述命令后,可以继续创建initramfs/initrd

man strip

   --strip-unneeded
       Remove all symbols that are not needed for relocation processing.

答案2

我对这个问题做了一些额外的研究,以了解剥离模块的最佳方法是什么,这是我发现的完整过程(仍然 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,这足以大幅减小体积。

看:安装_MOD_STRIPDocumentation/kbuild/kbuild.txt

答案3

您还可以更改您的配置initramfs.conf

找到该文件/etc/initramfs-tools/initramfs.conf

有一个设置表明MODULES=most这包括您的 initrd 映像中的大多数模块。

将其更改为MODULES=dep使得 initramfs 生成器猜测要包含哪些模块。

查看 initramfs.conf 的联机帮助页这里

注意 1:执行上述步骤后,我的 initramfs 映像的大小从 282 MB 减少到 99 MB。(这仍然足够大,但这是一个显着的改进)

注 2:我还尝试在 处剥离内核模块/lib/modules/<kernel version>。操作系统更新提供的模块被剥离(大小 = 211 MB),因此相应的 intiramfs 映像约为 15 MB。剥离我自己编译的 vanilla 内核的模块后,文件夹的大小为 185 MB,intramfs 映像为 16 MB。因此,经过所有优化后,大小从 282 MB 降至 16 MB!对于剥离使用此代码

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

在上面的代码中替换<kernel_release>为您想要从中删除模块的内核版本。

更多讨论请查看此关联

上面的代码必须运行为sudosu

相关内容