Linux 内核手动构建:生成的二进制文件比预编译的二进制文件大 10 倍

Dmi*_*ank 6 linux compiling linux-kernel

我正在使用 Linux Mint 13 MATE 32 位,我正在尝试构建内核(主要是为了体验和乐趣)。

现在,我喜欢使用与预编译内核相同的配置来构建它,所以首先我从kernel.ubuntu.com安装了预编译内核3.16.0-031600rc6,并成功引导到它。

然后我从kernel.org下载了 3.16.rc6 内核,解压它,将其配置为使用来自现有预编译内核的配置:

$ make oldconfig
Run Code Online (Sandbox Code Playgroud)

它没有问我任何问题,因此,预编译的内核包含所有必要的信息。然后我构建了它(大约花了 6 个小时):

$ make
Run Code Online (Sandbox Code Playgroud)

然后安装:

$ sudo make modules_install install
Run Code Online (Sandbox Code Playgroud)

然后我启动到我手动编译的内核,它可以工作,但启动过程有点慢。但是后来我发现所有的二进制文件(/boot/initrd.img-3.16.0-rc6以及其中的所有*.ko模块/lib/modules/3.16.0-rc6/kernel都比预编译版本大 10 倍左右!说,initrd.img-3.16.0-rc6160 658 665字节,但预编译initrd.img-3.16.0-031600rc6-generic16 819 611字节。每个*.ko模块都同样大。

为什么是这样?我没有为构建指定任何特殊选项(我输入的命令与我上面提到的完全相同)。如何“正确”构建它?

gol*_*cks 5

不管怎么说file,它毕竟是调试符号。 LKML 上的一个线程让我尝试:

make INSTALL_MOD_STRIP=1 modules_install
Run Code Online (Sandbox Code Playgroud)

瞧,从/lib/modules/x.x.x目录中进行比较;前:

> ls -hs kernel/crypto/anubis.ko 
112K kernel/crypto/anubis.ko
Run Code Online (Sandbox Code Playgroud)

之后:

> ls -hs kernel/crypto/anubis.ko 
16K kernel/crypto/anubis.ko
Run Code Online (Sandbox Code Playgroud)

此外,报告的目录总大小(使用相同的.configdu -h从 185 MB 增加到 13 MB。

请记住,除了使用磁盘空间之外,这并不像看起来那么重要。调试符号不会在正常运行时加载,因此无论.ko文件大小如何,内存中每个模块的实际大小可能都相同。我认为它会产生的唯一显着差异在于initramfs文件的大小,而它会产生的唯一区别在于解压缩 fs 所需的时间。即,如果您使用未压缩的initramfs,则无关紧要。

strip --strip-all也可以工作,并filestripped任何一种方式正确报告它们。为什么它说not stripped的是发行版仍然是个谜。

  • 非常感谢!很奇怪,`INSTALL_MOD_STRIP` 默认没有设置。我生成的 `initrd.img-3.16.0-rc6` 现在需要 16 MB。以前(使用 160-MB `initrd`)当 GRUB 完成时,只有大约 7 秒的黑屏(似乎是解包),只有在它之后我才能看到内核消息。现在,有了 16 MB 的 `initrd`,内核消息会在 GRUB 完成后立即回显。所以,还是比较有意义的。再次感谢。 (2认同)