编译内核时如何减小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/…,看看是什么使它如此庞大。它可能是大量的内核模块或库……或完全是其他东西。如果您不查看存档的内容,那只是猜测。
弗罗斯特斯

Answers:


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其中包括initrd映像中的大多数模块。

将其更改为MODULES=dep这会使initramfs生成器猜测要包含的模块。

在此处查看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>为您要从中剥离模块的内核版本。

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

上面的代码必须以sudosu

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.