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

per*_*ror 23 compiling linux-kernel

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

  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
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到,我的initrd.img文件大小比我的发行版中的文件大 10 倍左右。

那么,我在编译内核时是否做错了什么?而且,我怎样才能减少我的大小initrd.img

SHW*_*SHW 31

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

使用这个命令:

SHW@SHW:/tmp# cd /lib/modules/<new_kernel>
SHW@SHW:/tmp# find . -name *.ko -exec strip --strip-unneeded {} +
Run Code Online (Sandbox Code Playgroud)

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

man strip

   --strip-unneeded
       Remove all symbols that are not needed for relocation processing.
Run Code Online (Sandbox Code Playgroud)


per*_*ror 28

我对这个问题做了一些额外的研究,以了解剥离模块的最佳方法是什么,这是我发现的完整过程(仍然 SHW 确实带来了答案,但我发现的过程在某种程度上更加标准化):

  1. 下载源代码www.kernel.org并解压。

  2. 将你之前的复制.config到源代码中,并make menuconfig观察新选项并根据内核的新策略修改配置。

  3. 然后,编译它:

    $> make -j 4
    
    Run Code Online (Sandbox Code Playgroud)
  4. 最后,安装它:

    $> su -c 'make INSTALL_MOD_STRIP=1 modules_install && make install'
    
    Run Code Online (Sandbox Code Playgroud)
  5. 经过几次测试后,从/boot/lib/modules目录中删除旧内核。

INSTALL_MOD_STRIP设置时1添加strip --strip-debug安装模块,这也足以大大降低大小时。

请参阅:INSTALL_MOD_STRIPDocumentation/kbuild/kbuild.txt


soh*_*154 10

您还可以更改您的配置 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,内部映像为 16 MB。所以在所有优化之后,大小从 282 MB 降到了 16 MB!!对于剥离使用此代码

find /lib/modules/<kernel_release>/ -iname "*.ko" -exec strip --strip-unneeded {} \;
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,替换<kernel_release>为您希望从中剥离模块的内核版本。

有关更多讨论,请查看此链接

上面的代码必须作为sudo或运行su

  • `MODULES=dep` 是个好主意。我发现与 lz4 相比,“COMPRESS=xz”有助于节省 50% 的文件大小。 (3认同)